Я столкнулся с ужасным сообщением об ошибке, возможно, благодаря кропотливому усилию, у PHP закончилась нехватка памяти:
Разрешенный размер памяти #### байт исчерпан (попытался выделить #### bytes) в файле .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 могут помочь мне найти и устранить проблему?