2014-12-09 3 views
2

PHP периодически сообщает о нелепых ошибках размещения.прерывистая ошибка выделения памяти PHP

Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 4348209864 bytes) in Unknown on line 0

Он попытался выделить более 4 ГБ памяти. Какие? Где Unknown line 0? Где он пытался выделить?

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

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

Версия PHP - 5.3.26.

Почему я получаю эти ошибки, и это то, что мне нужно беспокоиться о производстве?

+0

Эта ошибка часто является симптомом запроса базы данных изгоев, больших процессов обработки изображений и т. Д. –

+1

Возможно, стоит обновить свой PHP, если это вариант. 5.3.26 - это даже не последняя версия 5.3, и теперь мы до 5.6. Это, по крайней мере, * возможно *, что в последующих выпусках есть более эффективная информация об ошибках для этой проблемы. Я могу (по крайней мере, одну ошибку, жалующуюся на отсутствие информации об ошибке, которая была закрыта с момента запуска релиза] (https://bugs.php.net/bug.php?id=65455) ... –

+0

@MattGibson Спасибо, Мэтт, у меня есть установка 5.5.14, которую я попробую, когда у меня появится шанс. – Michael

ответ

2

Самые распространенные причины для исчерпанного пула памяти: либо вы сделали что-то ресурсоемкое (т. Е. Попытались открыть текстовый файл 20 ГБ и загрузить его в память), либо вы сделали что-то, что попадает в бесконечный цикл (или достаточно времени для исчерпания пула памяти, то есть SQL-запроса, который возвращает большое количество строк).

Where is Unknown line 0? Where did it try to allocate?

PHP не может сказать вам, что это произошло на этапе выполнения (то есть в операционном коде). PHP управляет вашим пулом для вас (на самом деле, довольно сложно получить его там, где вы можете управлять им напрямую, потому что он запутывает его по дизайну).

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

+0

Существует один цикл - «foreach», который выполняет итерацию всех файлов в заданном каталоге и определяет, следует ли создавать ссылку или изображение для этого файла. – Michael