Утечка памяти с preg_replace - PullRequest
0 голосов
/ 26 февраля 2010

Я использую функцию preg_replace для замены акцентов в строке, я работаю с UTF-8.

Я столкнулся с утечкой памяти, но не могу выделить основную причину, мой код довольно прост:

    preg_replace(
        array_keys($aToNoAccents),
        array_values($aToNoAccents),
        $sText
    );

, где $aToNoAccents - ассоциативный массив с записями типа '~[Ą]~u' => 'A', '~[Ć]~u' => 'C',. Мой скрипт печатает эту ошибку для приведенной выше строки:

Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 3039 bytes)

Очевидно, что дело не в увеличении разрешенной памяти для PHP (1 ГБ занимает место за пределами моего приложения). Кроме того, эта строка выполняется тысячи раз без проблем, но только в некоторых случаях, которые трудно воспроизвести, она выдает ошибку.

Кто-нибудь знает о проблемах памяти со строками preg_replace и UTF-8? Должен ли я проявлять особую осторожность при передаче фактических параметров такой функции?

Я использую PHP 5.2.6-3 с Suhosin-Patch

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

Вы пробовали iconv вместо того, чтобы создавать вручную карту замены?

Адаптация примера из руководства по PHP

$text = "A String with lots of weird chars, like ĄĆ";

echo 'Original : ', $text, PHP_EOL;
echo 'TRANSLIT : ', iconv("UTF-8", "ISO-8859-1//TRANSLIT", $text), PHP_EOL;
echo 'IGNORE   : ', iconv("UTF-8", "ISO-8859-1//IGNORE", $text), PHP_EOL;
echo 'Plain    : ', iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL;

даст

Original : A String with lots of weird chars, like AC
TRANSLIT : A String with lots of weird chars, like AC
IGNORE   : A String with lots of weird chars, like AC
Plain    : A String with lots of weird chars, like AC

Но это не обязательно будет работать с любыми символами, которые вы добавляете. Попробуйте с вашими ключами.

1 голос
/ 26 февраля 2010

У меня была такая же проблема (утечка памяти) не с preg_replace, и я "слышал", что, вероятно, это ошибка в php 5.2

Я не уверен, но если вы попробуете тот же скрипт с php 5.0, он может сработать.

Только для записи.

...