Неустранимая ошибка: допустимый размер памяти 134217728 байтов исчерпан (CodeIgniter + XML-RPC)

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

Клиентская POS основана на PHPPOS, и я внедрил модуль, который использует стандартную библиотеку XML-RPC для отправки данных о продажах в службу. Серверная система построена на CodeIgniter и использует библиотеки XML-RPC и XML-RPCS для компонента webservice. Всякий раз, когда я отправляю много данных о продажах (всего 50 строк из таблицы продаж и отдельных строк из sales_items, относящихся к каждому элементу в продаже), я получаю следующую ошибку:

  • Форматирование числа с ведущими нулями в PHP
  • Должен ли я использовать filter_var для проверки электронной почты?
  • Первое выпадающее меню для автоматического изменения параметров второго выпадающего меню
  • Предотвратить наводнение PHP-скрипта
  • Ошибка MySQL при вставке данных, содержащих апострофы (одинарные кавычки)?
  • ajax-вызов не работает при попытке отправить данные на localhost: 8000 из localhost
  • 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:

    Обновление memory_limit на WHM 11.48.4

    Я считаю это полезным при включении или требовании:
    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» не включает в себя вещи один раз, или что-то не так.

    PHP is the Best Programming Language in the world.