что делает этот preg_replace_callback в PHP? и как мне остановить утечку памяти?
-
08-07-2019 - |
Вопрос
У меня есть фрагмент кода на b2evo PHP-сайте, который выполняет следующее:
$content = preg_replace_callback(
'/[\x80-\xff]/',
create_function( '$j', 'return "&#".ord($j[0]).";";' ),
$content);
Что делает этот раздел кода? Я предполагаю, что он удаляет символы ascii между 128 и 256, но я не уверен. Р>
Кроме того, в настоящее время каждый раз, когда этот бит кода вызывается изнутри страницы, PHP выделяет, а затем не освобождает до 2 КБ памяти. Если функция вызывается 1000+ раз на странице (это может произойти), то страница использует дополнительные 2 МБ памяти. Р>
Это вызывает проблемы с моим веб-приложением. Почему я теряю память и как мне переписать ее, чтобы не было утечки памяти?
Решение
На самом деле не зачистка, она заменяет символы с высоким Ascii на их сущности.
См. preg_replace_callback .
create_function используется для создания анонимной функции, но вместо этого вы можете использовать простую функцию:
$content = 'Çà ! Nœm dé fîçhïèr tôrdù, @ pöür têstër... ? ~ Œ[€]';
$content = preg_replace_callback('/[\x80-\xff]/', 'CB_CharToEntity', $content);
echo $econtent . '<br>';
echo htmlspecialchars($content) . '<br>';
echo htmlentities($content) . '<br>';
echo htmlentities($content, ENT_NOQUOTES, 'cp1252') . '<br>';
function CB_CharToEntity($matches)
{
return '&#' . ord($matches[0]) . ';';
}
[РЕДАКТИРОВАТЬ] Нашел более чистый, возможно, более быстрый способ сделать работу! ^ _ ^ Просто используйте htmlentities с параметрами, соответствующими вашим потребностям.
Другие советы
Это create_function
, которое утечка вашей памяти - просто используйте нормальную функцию вместо этого, и все будет в порядке.
Сама функция заменяет символы числовыми объектами HTML ( & amp; #xxx;
)
В вашем случае намного проще использовать preg_replace
с флагом / e
:
$content = preg_replace(
'/[\x80-\xff]/e',
'"&#".ord(<*>).";"',
$content);