Допустимый объем памяти исчерпан, но memory_get_peak_usage говорит иначе

На моем сервере у меня следующая ошибка:

Допустимый объем памяти 268435456 байт исчерпан

Это происходит в цикле (foreach), и когда я проверяю использование памяти в цикле с

memory_get_peak_usage();

Я получаю 7254128 что далеко от 268435456 исчерпаны!

Я проверил в нескольких местах, и использование памяти не увеличивается, так что я действительно не знаю, в чем проблема!

Тот же сценарий отлично работает на моем локальном компьютере, где я установил ограничение памяти только 16M в моем php.ini файл

Вот код, вызывающий проблему, но я думаю, что он будет бесполезен, он написан на плагине формы с открытым исходным кодом question2answer:

foreach ($badges as $slug => $info) {
    $badge_name=qa_badge_name($slug);
    if(!qa_opt('badge_'.$slug.'_name')) 
            qa_opt('badge_'.$slug.'_name',$badge_name);
    $name = qa_opt('badge_'.$slug.'_name');
}

1 ответ

Я сильно подозреваю, что ваша проблема будет из-за "неправильной работы" в стандартной библиотеке коннекторов MySQL. Когда из базы данных извлекается строка, содержащая поле "длинный блоб" или "длинный текст". Вместо того, чтобы выделять точный размер, необходимый для данных, библиотека MySQL пытается выделить самый большой размер, который может потребоваться для хранения строки. т.е. 4 гигабайта памяти.

Самый простой способ исправить это - перейти на использование MySQL ND-коннектора, который не имеет этой "функции".

PHP массовое использование памяти для запроса SQL

Допустимый объем памяти 67108864 байт исчерпан

Я проверяю использование памяти в цикле с помощью memory_get_peak_usage(); Я получаю 7254128, что далеко от 268435456 исчерпаны!

Это правильно. Распределение памяти не удается, поэтому пиковое использование памяти никогда не показывает такого огромного распределения, как при использовании.

Кстати, вы должны были быть в состоянии отследить сообщение об ошибке до точной строки кода, которая генерирует ошибку выделения памяти. Если это не происходит из выборки SQL, то ответ может быть неправильным.

Другие вопросы по тегам