Я столкнулся с ужасным сообщением об ошибке, возможно, из-за кропотливых усилий PHP исчерпал память:
Допустимый объем памяти #### байт исчерпан (попытка выделить #### байт) в file.php в строке 123
Повышение лимита
Если вы знаете, что делаете, и хотите увеличить лимит, см. Memory_limit :
ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
Осторожно! Возможно, вы решаете только симптом, а не проблему!
Диагностика утечки:
Сообщение об ошибке указывает на строку внутри цикла, который, как я полагаю, вызывает утечку или ненужное накопление памяти. Я напечатал memory_get_usage()
операторы в конце каждой итерации и вижу, как число медленно растет, пока не достигнет предела:
foreach ($users as $user) {
$task = new Task;
$task->run($user);
unset($task); // Free the variable in an attempt to recover memory
print memory_get_usage(true); // increases over time
}
Для целей этого вопроса давайте предположим, что худший код спагетти, который только можно вообразить, прячется в глобальной области где-то в $user
или Task
.
Какие инструменты, уловки PHP или отладка voodoo могут помочь мне найти и исправить проблему?