2015-04-30 4 views
2

Я получаю сообщение об ошибке:PHP - OutOfMemoryException

Error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 13343871 bytes)

Я не удивлен, потому что это на скрипт, который генерирует отчет с тысячами записей (полученных с тысячами запросов SQL - по своей природе это просто никогда не будет эффективным сценарием). Это медленный скрипт, и все в порядке - у меня есть предупреждение на странице, чтобы уведомить пользователя об этом.

Я просто не хочу, чтобы эта ошибка происходила.

Созданный CSV-файл представляется мне полным (с точки зрения данных), но в нижней части файла CSV я получаю трассировку стека и исключение OutOfMemoryException, как в приведенном выше сообщении.

Для этой конкретной части сценария я переопределен в PHP по умолчанию:

ini_set('memory_limit', '512M'); 
ini_set('max_execution_time', 300); 

Есть ли что-нибудь еще, что я мог бы делать?

+2

Я бы попробовал потоковое видео csv. Сбрасывайте выходной буфер так часто. Зачем хранить все это в памяти перед отправкой? – keyboardSmasher

+0

если вы не заботитесь о распределении еще большего объема памяти –

ответ

0

Из вашего вопроса ясно, что вы назначили 512 МБ ОЗУ для PHP, но по мере того, как вы получаете исключение, ваш скрипт нуждается в большем, чем это. Если на вашем ПК больше возможностей ОЗУ, просто увеличьте это распределение памяти до более высокого значения.

Однако хранение в памяти не является хорошей идеей. Вы должны записать его на диск в кусках & освободить используемую память, чтобы свести к минимуму использование.

+0

Виртуальный сервер, который я использую из памяти, имеет максимальную ОЗУ 512 МБ, но еще 512 МБ виртуальной памяти. Если я увеличу ограничение памяти до 1 ГБ, скрипт PHP начнет использовать виртуальную память? Или ограничение памяти PHP относится только к физической памяти? – b85411

+0

@ b85411 Скорее всего, он использует некоторую виртуальную память (или своп) уже - для ОС потребуется некоторое дисковое пространство. Swap действительно медленный, поэтому, как правило, лучше оптимизировать алгоритм/код, чтобы использовать меньше памяти. – starbeamrainbowlabs

0

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

С точки зрения подавления ошибки - IE. стек-след - вы получаете, убедитесь, что вы отключили сообщения об ошибках с

ini_set('display_startup_errors', 0); 
ini_set('display_errors', 0); 
error_reporting(0); 

Это будет работать только тогда, когда истощение памяти не полностью остановить выполнение, хотя.