Ошибка PHP из памяти, хотя memory_limit не достигнут

Я только что унаследовал сайт с PHP-скриптом, который постоянно исчерпывает память при 117 МБ. Это происходит даже тогда, когда я увеличиваю переменную памяти memory_limit PHP до 312 МБ, что я делаю через php.ini.

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

ini_get('memory_limit') возвращает значение, установленное в php.ini, поэтому я уверен, что Apache перезапустился после изменения значения. Я использую memory_get_usage(true) чтобы вернуть память, потребляемую скриптом в разных точках на этом пути. И он постоянно терпит неудачу, когда он достигает 117 МБ.

Есть ли какой-то внутренний предел PHP, о котором я не знаю, что он никогда не выделяет более 117 МБ для отдельного сценария?

Сервер имеет 1 ГБ ОЗУ и работает CentOS. У меня есть доступ к корневой оболочке. PHP – версия 5.3.18. MySQL – это версия 5.1.66-cll.

Этот скрипт находится за именем пользователя / паролем, и я не могу предоставить ему открытый доступ.

Отредактировано для добавления:

1) Спасибо всем за вашу помощь на сегодняшний день. Более подробную информацию вы найдете в моих ответах на конкретные комментарии пользователей по различным ответам ниже.

2) Сухозин определенно не установлен. Я проверил в нескольких местах, включая запуск скрипта и проверку на константы и запуск php -v

3) В журнале apache нет записи конкретного сообщения об ошибке, которое я получаю. Ведение журнала включено в php.ini. Я пробивал через grep, чтобы искать весь журнал.

4) Возможно ли, что в этом случае сообщается о неправильной ошибке?

Related of "Ошибка PHP из памяти, хотя memory_limit не достигнут"

Я наконец нашел ответ. Подсказка исходила из ответа pcguru: «Поскольку сервер имеет только 1 ГБ ОЗУ …».

По подозрению я посмотрел, имеет ли Apache собственные пределы памяти, поскольку они могут повлиять на способность PHP выделять память. В верхней части httpd.conf я нашел это заявление: RLimitMEM 204535125

Это помещается туда whm / cpanel. Согласно следующей веб-странице, whm / cpanel неправильно вычисляет ее значение на виртуальном сервере … http://forums.jaguarpc.com/vps-dedicated/17341-apache-memory-limit-rlimitmem.html

Сценарий, который исчерпывает память, проходит большую часть пути, поэтому я увеличил RLimitMEM до 268435456 (256 МБ) и перезапустил скрипт. Он завершил объединение массива и создал файл csv для загрузки.

ETA: после дальнейшего чтения о RLimitMEM и RLimitCPU я решил удалить их из httpd.conf. Это позволяет работать ini_set ('memory_limit', '### M'), и теперь я даю этому конкретному сценарию дополнительную память, в которой он нуждается. Я также удвоил RAM на этом сервере.

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

Поскольку на сервере имеется только 1 ГБ ОЗУ, я склоняюсь к тому, что вы на самом деле исчерпали системную память.

Смотрите эту тему . Вы получаете ту же «PHP Fatal error: Out of memory», а не более общую «Неустранимая ошибка: допустимый размер памяти …». Ваша ошибка указывает на то, что система не может выделить больше памяти вообще, что означает, что даже внутренние функции PHP: s не могут выделять больше памяти, не говоря уже о вашем собственном коде.

Как PHP настроен для работы с Apache? Как модуль или как CGI? Сколько процессов PHP вы можете запустить одновременно? У вас есть место подкачки?

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

Это не ответ на вопрос, почему ваш скрипт умирает после определенного использования памяти, но вы можете обойти его, исключив ограничение памяти полностью внутри самого скрипта PHP:

 ini_set('memory_limit', '-1'); 

Это опасно. Если у вас есть сценарий runaway, PHP будет использовать память, пока вашему серверу не останется ни одного места для распределения и падения. Поэтому вы должны использовать это, только если вы уверены, что сам сценарий не является проблемой, и только для проверки вывода.

Что касается того, имеет ли PHP некоторый предел для каждого сценария использования памяти, нет. Я лично запускаю скрипты с использованием памяти около 1 ГБ.

Это может быть не ответ на вашу проблему, но если вы запустите PHP из командной строки, вы можете переопределить ограничение памяти из php.ini.

 php -d memory_limit=321M my_script.php 

Я не совсем уверен, что предел памяти по умолчанию через cli.

Кроме того, вы можете запустить php --ini и проверить результаты.

У вас бесконечный цикл где-то в вашем коде.