Разрешенный размер памяти X байт исчерпан

фатальная ошибка: разрешены памяти размером 67108864 байт исчерпаны (пытался выделить 13965430 байт)

PHPInfo показывает, что у меня memory_limit 128M, поэтому я смущен, почему ошибка говорит, что у меня только 64M. Возможно ли, чтобы phpinfo сообщал неправильно? Или для PHP использовать два отдельных php.Инис?

ошибка была вызвана вызовом ini_set в одном из основных файлов php, которые мой коллега добавил без моего знание.

7 ответов


конфигурация PHP может быть установлена в нескольких местах:

  1. мастер-системы php.ini (обычно в /etc где-то)
  2. где-то в конфигурации Apache (httpd.conf или на сайте .файл conf, через php_value)
  3. CLI & CGI может иметь другой php.ini (используйте команду php -i | grep memory_limit чтобы проверить CLI conf)
  4. местные .htaccess файлы (также php_value)
  5. in-script (через ini_set())

в выходе PHPinfo, Значение " Master "-это скомпилированное значение по умолчанию, а" Local " - это то, что фактически действует. Она может быть неизменной либо по умолчанию, либо переопределен в любом из вышеуказанных мест.

также обратите внимание, что PHP обычно отличается .ini-файлы для работы в командной строке и на веб-сервере. Проверка phpinfo() из командной строки будет сообщать разные значения, чем если бы вы запустили его в веб-скрипте.


ini_set('memory_limit', '128M'); 

или

php.ini  =>  memory_limit = 128M

или

php_value memory_limit 128M

у меня была такая же проблема. Я нашел ответ:--4-->

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

Примечание: это займет неограниченное использование памяти сервера.

обновление: Используйте это осторожно, так как это может замедлить вашу систему, если скрипт PHP начнет использовать чрезмерный объем памяти, вызывая много использования пространства подкачки. Вы можете использовать это, если вы знаете, что программа не займет много памяти, а также вы не знаете, сколько установить его прямо сейчас. Но в конце концов ты поймешь, сколько памяти тебе нужно. для этой программы.

вы всегда должны ограничивать память как некоторое значение, как ответил @şarkı dinle.

ini_set('memory_limit', '512M');

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


память должна быть настроена в нескольких местах.
Set memory_limit до 512m:

sudo vi /etc/php5/cgi/php.ini
sudo vi /etc/php5/cli/php.ini
sudo vi /etc/php5/apache2/php.ini Or /etc/php5/fpm/php.ini

перезапустить службу:

sudo service service php5-fpm restart
sudo service service nginx restart

или

sudo service apache2 restart

наконец, это должно решить проблему memory_limit


Если вы уверены, что перезапустили Apache после настройки php.ini, тогда вы можете смотреть на неправильный php.ini-файл


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

Если Вы читаете файлы, прочитайте их по строкам вместо чтения в полном файле в память. Посмотрите на fgets и SplFileObject::fgets. Обновите PHP до новой версии, если вы используете PHP 5.3. PHP 5.4 и 5.5 используют гораздо меньше памяти.

избежать нагрузки большие наборы данных в массиве. Вместо этого перейдите к обработке меньших подмножеств большего набора данных и при необходимости сохраняйте данные в базе данных для облегчения использования памяти.

попробуйте последнюю версию или минорную версию сторонней библиотеки (например, 1.9.3 против вашего 1.8.2) и используйте тот, который более стабилен. Иногда более новые версии библиотек пишутся более эффективно.

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

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

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

FROM:https://www.airpair.com/php/fatal-error-allowed-memory-size


1 check current limit:
(in my os)php -i | grep limit  => memory_limit => 256M => 256M

2  locate php.ini 
php --ini =>   
Configuration File (php.ini) Path: /etc
Loaded Configuration File:         /etc/php.ini
Scan for additional .ini files in: /etc/php.d
Additional .ini files parsed:      /etc/php.d/curl.ini 
...

3 change memory_limit in php.ini
vi /etc/php.ini
memory_limit = 512M

4 restart nginx and (php-fpm if being used)
service php-fpm restart
service nginx restart