Я только что унаследовал сайт с 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) Возможно ли, что в этом случае сообщается о неправильной ошибке?
Я наконец нашел ответ. Подсказка исходила из ответа 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
и проверить результаты.
У вас бесконечный цикл где-то в вашем коде.