Неустранимая ошибка: допустимый размер памяти 134217728 байтов исчерпан (CodeIgniter + XML-RPC)
У меня есть множество клиентских точек продаж (POS), которые периодически отправляют новые данные о продажах в одну централизованную базу данных, которая хранит данные в одной большой базе данных для генерации отчетов.
Клиентская POS основана на PHPPOS, и я внедрил модуль, который использует стандартную библиотеку XML-RPC для отправки данных о продажах в службу. Серверная система построена на CodeIgniter и использует библиотеки XML-RPC и XML-RPCS для компонента webservice. Всякий раз, когда я отправляю много данных о продажах (всего 50 строк из таблицы продаж и отдельных строк из sales_items, относящихся к каждому элементу в продаже), я получаю следующую ошибку:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)
128M – значение по умолчанию в php.ini
, но я предполагаю, что это огромное количество сломать. На самом деле, я даже попытался установить это значение на 1024 М, и все, что он делает, занимает больше времени для выхода из строя.
Что касается шагов, которые я предпринял, я попытался отключить всю обработку на стороне сервера и сфальсифицировал ее, чтобы вернуть законченный ответ независимо от ввода. Однако я считаю, что проблема заключается в фактической отправке данных. Я даже попытался отключить максимальное время выполнения скрипта для PHP, и он все еще не работает. Большое вам спасибо за вашу помощь!
22 Solutions collect form web for “Неустранимая ошибка: допустимый размер памяти 134217728 байтов исчерпан (CodeIgniter + XML-RPC)”
Люди, меняющие memory_limit на ini_set('memory_limit', '-1');
НЕ является решением.
Пожалуйста, не делай этого. Очевидно, что php имеет утечку памяти где-то, и вы говорите серверу просто использовать всю память, которая ему нужна. Проблема не была исправлена вообще. Если вы будете следить за своим сервером, вы увидите, что теперь он, вероятно, использует большую часть ОЗУ и даже переключается на диск.
Вероятно, вы должны попытаться найти точную ошибку в коде и исправить ее.
ini_set('memory_limit', '-1');
переопределяет предел памяти PHP по умолчанию.
Правильный способ – отредактировать файл php.ini
. Измените memory_limit
на ваше значение желания.
Как и ваш вопрос, 128M
(который является лимитом по умолчанию) был превышен, поэтому в вашем коде есть что-то серьезное, потому что это не так много.
Если вы знаете, почему это так много, и вы хотите разрешить ему установить memory_limit = 512M
или выше, и вы должны быть хорошими.
Распределение памяти для PHP можно настроить на постоянной основе или временно.
Постоянно
Вы можете навсегда изменить распределение памяти PHP двумя способами.
Если у вас есть доступ к вашему файлу php.ini
, вы можете изменить значение memory_limit
на ваше значение желания.
Если у вас нет доступа к файлу php.ini
(и ваш веб-хост его разрешает), вы можете переопределить распределение памяти через ваш файл .htaccess
. Добавьте php_value memory_limit 128M
(или любое php_value memory_limit 128M
ваше выделение).
временный
Вы можете настроить распределение памяти на лету из PHP-файла. У вас просто есть код ini_set('memory_limit', '128M');
(или независимо от вашего желаемого распределения). Вы можете удалить ограничение памяти (хотя ограничения на использование машины или экземпляра могут все еще применяться), установив значение «-1».
Очень легко получить утечки памяти в скрипте PHP, особенно если вы используете абстракцию, такую как ORM. Попробуйте использовать Xdebug для профайла своего скрипта и узнайте, куда все это пошло.
При добавлении 22,5 миллионов записей в массив с массивом array_push, я продолжал получать «исчерпанные из памяти» фатальные ошибки на отметках около 20M, используя 4G в качестве предела памяти в php.ini. Чтобы исправить это, я добавил утверждение
$old = ini_set('memory_limit', '8192M');
в верхней части файла. Теперь все работает нормально. Я не знаю, есть ли у php утечка памяти, это не моя работа, и меня это не волнует. Я просто должен выполнить свою работу, и это сработало.
Программа очень проста:
$fh = fopen($myfile); while (!feof($fh)) { array_push($file, stripslashes(fgets($fh))); } fclose($fh);
Неустранимая ошибка указывает на строку 3, пока я не увеличил ограничение памяти, которое устранило ошибку.
EDIT: Исправлено синтаксис ini_set.
Я продолжал получать эту ошибку, даже если в php.ini
установлен параметр memory_limit
, а значение правильно phpinfo()
с помощью phpinfo()
.
Изменив это:
memory_limit=4G
К этому:
memory_limit=4096M
Исправлено в PHP 7.
После включения этих двух линий.
Он начал работать
; Determines the size of the realpath cache to be used by PHP. This value should ; be increased on systems where PHP opens many files to reflect the quantity of ; the file operations performed. ; http://php.net/realpath-cache-size realpath_cache_size = 16k ; Duration of time, in seconds for which to cache realpath information for a given ; file or directory. For systems with rarely changing files, consider increasing this ; value. ; http://php.net/realpath-cache-ttl realpath_cache_ttl = 120
Когда вы видите вышеупомянутую ошибку – особенно если (tried to allocate __ bytes)
– это низкое значение, которое может быть индикатором бесконечного цикла, как функция, которая сама по себе не имеет выхода:
function exhaustYourBytes() { return exhaustYourBytes(); }
Вы можете исправить это, изменив memory_limit на fastcgi / fpm
$vim /etc/php5/fpm/php.ini
Изменение памяти, например, от 128 до 512, см. Ниже
; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit memory_limit = 128M
в
; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit memory_limit = 512M
В Drupal 7 вы можете изменить ограничение памяти в файле settings.php, расположенном в папке / папке по умолчанию. В строке 260 вы увидите следующее:
ini_set('memory_limit', '128M');
Даже если ваши настройки php.ini достаточно высоки, вы не сможете потреблять более 128 МБ, если это не задано в файле настроек Drupal settings.php.
Корневой каталог вашего сайта: –
ini_set('memory_limit', '1024M');
Для пользователей Drupal этот ответ Криса Лейна:
ini_set('memory_limit', '-1');
работает, но мы должны поставить его сразу после открытия
<?php
тег в файле index.php в корневом каталоге вашего сайта.
PHP 5.3+ позволяет вам изменить ограничение памяти, поместив файл .user.ini
в папку public_html
. Просто создайте указанный выше файл и введите в нем следующую строку:
memory_limit = 64M
Некоторые хосты cPanel принимают этот метод только.
Для тех, кто царапает их волосы, чтобы выяснить, почему в земле эта небольшая функция должна вызвать утечку памяти, иногда с небольшой ошибкой, функция начинает рекурсивно называть себя навсегда.
Например, прокси-класс, который имеет одно и то же имя для функции объекта, который будет прокси-сервер.
class Proxy { private $actualObject; public function doSomething() { return $this->actualObjec->doSomething(); } }
Иногда вы можете забыть принести этот маленький член actualObjec, и поскольку у Proxy действительно есть метод doSomething, PHP не даст вам никаких ошибок и для большого класса, он может быть скрыт от глаз на пару минут, чтобы узнать, почему это утечка памяти.
Запуск скрипта (например, cron case): php5 /pathToScript/info.php
создает ту же ошибку.
Правильный путь: php5 -cli /pathToScript/info.php
Страница CRASH?
(Это происходит, когда MySQL должен запрашивать большие строки, по умолчанию параметр momory_limit установлен на маленький, что было безопаснее для аппаратного обеспечения)
Вы можете проверить состояние существующей памяти вашей системы, прежде чем увеличивать php.ini
# free -m total used free shared buffers cached Mem: 64457 63791 666 0 1118 18273 -/+ buffers/cache: 44398 20058 Swap: 1021 0 1021
Здесь я увеличил его, как service httpd restart
ниже, а затем service httpd restart
чтобы устранить проблему с проблемой CRASH.
# grep memory_limit /etc/php.ini memory_limit = 512M
Если вы используете VPS с виртуальным частным сервером (WHM), вы можете обнаружить, что у вас нет прав на редактирование PHP.INI напрямую; система должна это сделать. На панели управления хостом WHM откройте «Конфигурация службы»> «Редактор конфигурации PHP», измените memory_limit:
Я считаю это полезным при включении или требовании:
dbconnection.php , _functions.php в файлах, которые фактически обрабатываются,
вместо включения в заголовок. Который включен сам.
Поэтому, если ваш заголовок и нижний колонтитул включены, просто включите все свои функциональные файлы перед включением заголовка.
У меня была ошибка ниже, когда я работал в наборе данных меньше, чем раньше.
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 4096 bytes) in C:\\workspace\image_management.php on line 173
Поскольку поиск ошибки привел меня сюда, я подумал, что я бы сказал, что это не всегда технические решения выше, а что-то более простое. В моем случае это был Firefox. Прежде чем я запустил программу, он уже использовал 1,157M.
Оказывается, я смотрел 50-минутный видеоролик за раз в течение нескольких дней, и это все испортило. Это то, что исправить, что эксперты исправить, даже не думая об этом, но для подобных мне это стоит задуматься.
Очистите кеш браузера и попробуйте. ошибка может быть связана с тем, что браузер пытается загрузить большой файл или поврежденный файл на сервер.
не уверен, что этот ответ будет полезен, но когда я удалил следующие строки из моего кода, все работало нормально!
set_include_path(get_include_path() . get_include_path().'/phpseclib');
include_once ( 'Net / SSH2.php'); include_once ( 'Net / SFTP.php');
Эти строки были включены во все запущенные файлы, когда все файлы работали один за другим, но при запуске всех файлов я получил проблему с утечкой памяти. Так или иначе, «include_once» не включает в себя вещи один раз, или что-то не так.