что делает этот preg_replace_callback в PHP? и как мне остановить утечку памяти? - PullRequest
0 голосов
/ 17 ноября 2008

У меня есть участок кода на PHP-сайте b2evo, который выполняет следующее:

$content = preg_replace_callback(
    '/[\x80-\xff]/',
    create_function( '$j', 'return "&#".ord($j[0]).";";' ),
    $content);

Что делает этот раздел кода? Я предполагаю, что он удаляет символы ascii между 128 и 256, но я не уверен.

Кроме того, как есть, каждый раз, когда этот бит кода вызывается изнутри страницы, PHP выделяет, а затем не освобождает до 2 КБ памяти. Если функция вызывается 1000+ раз на странице (это может произойти), то страница использует дополнительные 2 МБ памяти.

Это вызывает проблемы с моим веб-приложением. Почему я теряю память, и как мне переписать это, чтобы я не получил утечку памяти?

Ответы [ 3 ]

4 голосов
/ 17 ноября 2008

Это create_function, что приводит к утечке памяти - просто используйте обычную функцию, и все будет в порядке.

Сама функция заменяет символы числовыми объектами HTML (&#xxx;)

3 голосов
/ 17 ноября 2008

На самом деле не зачистка, она заменяет персонажей с высоким 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 с опциями, соответствующими вашим потребностям.

0 голосов
/ 15 ноября 2009

Намного проще использовать preg_replace с флагом /e в вашем случае:

$content = preg_replace(
    '/[\x80-\xff]/e',
    '"&#".ord($0).";"',
    $content);
...