2009-05-05 4 views
3

Я получаю ошибку «из памяти» в php. Я знаю, что это может быть исправлено с помощью ini_set («memory_limit», «64M»), но я не хочу этого, потому что большая память для скрипта ненормальна. У меня есть несколько отчетов, которые настолько огромны, что мне очень нужна эта память, но обычно этого не происходит.Допустимый объем памяти * байт исчерпан, в php

Проблема заключается в следующем: я даже не знаю, какой сценарий потребляет столько памяти, и ни один пользователь не сообщил об ошибке. Я знаю, что это происходит только благодаря log_errors (установленному в true) и error_log (установленному на очень заметный файл на моем рабочем столе), но он не сообщает, какой сценарий является виновником.

Любая идея о том, как это знать?

+1

Сравните время ошибок с входящими запросами вашего веб-сервера? Это предполагает, что у вас есть только несколько запросов в минуту или меньше. – strager

ответ

0

Это нормально для сценария, чтобы потреблять больше памяти, чем 32M, у меня недавно возникла проблема с использованием библиотеки GD, которая хотела бы потреблять больше, чем при масштабировании определенных типов изображений, и была выработана одна и та же ошибка. В вашем случае я бы удвоил память и ограничил время выполнения чем-то безопасным (если он еще не был). Я делаю это через .htaccess, с этими строками:

php_value memory_limit 64M 
php_value max_execution_time 30 
0

Для этого нужен профайлер. Я предпочитаю xdebug. This article объясняет, как получить информацию об использовании памяти для скрипта PHP.

3

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

Как только вы просматриваете свой код, вы можете начать поиск отходов памяти. Для обработки больших наборов данных каротажа структурируйте свой код для работы с одной строкой за раз, так что это (например) while($data = mysql_fetch_assoc()), а не foreach($data_rows as $data). Это также позволяет использовать небуферизованный запрос, который также уменьшит потребление памяти.

В журнале ошибок должен указываться сценарий, который умер. Возможно, может помочь журнал ошибок Apache.

+0

В этом проблема: журнал ошибок Apache ничего не показывает, PHP только извергает ошибку «из памяти» без имени скрипта. Я установил php для сообщения даже уведомлений вместе с именами сценариев, но не работает с этой конкретной ошибкой (конечно, из-за нехватки памяти он ничего не может сделать) –

Смежные вопросы