Неустранимая ошибка: допустимый объем памяти 134217728 байт исчерпан (CodeIgniter + XML-RPC) - PullRequest
561 голосов
/ 18 февраля 2009

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

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

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 54 bytes)

128M - это значение по умолчанию в php.ini, но я предполагаю, что это огромное число, которое нужно сломать. На самом деле, я даже пытался установить это значение равным 1024M, и все, что он делает, это занимает больше времени, чтобы выдать ошибку.

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

Ответы [ 26 ]

14 голосов
/ 22 января 2015

Корневой каталог вашего сайта: -

ini_set('memory_limit', '1024M');
11 голосов
/ 26 июня 2018

Измените ограничение памяти из файла php.ini и перезапустите apache. После перезапуска запустите функцию phpinfo (); из любого php-файла для подтверждения изменения memory_limit.

memory_limit = -1

ограничение памяти -1 означает, что ограничение памяти не установлено, теперь оно максимально.

11 голосов
/ 06 декабря 2012

Для пользователей Drupal ответ Криса Лейна:

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

работает, но мы должны поставить его сразу после открытия

<?php

тег в файле index.php в корневом каталоге вашего сайта.

11 голосов
/ 25 февраля 2013

В Drupal 7 вы можете изменить ограничение памяти в файле settings.php, который находится в папке sites / default. Вокруг линии 260 вы увидите это:

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

Даже если ваши настройки php.ini достаточно высоки, вы не сможете использовать больше 128 МБ, если это не установлено в вашем файле Drupal settings.php.

11 голосов
/ 07 февраля 2018

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

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);
7 голосов
/ 15 октября 2013

PHP 5.3+ позволяет изменить предел памяти, поместив файл .user.ini в папку public_html. Просто создайте файл выше и введите в нем следующую строку:

memory_limit = 64M

Некоторые хосты cPanel принимают только этот метод.

6 голосов
/ 29 декабря 2016

Страница CRASH? enter image description here

(Это происходит, когда MySQL должен запрашивать большие строки, по умолчанию для momory_limit установлено значение small, что было более безопасно для оборудования)

Вы можете проверить состояние памяти вашей системы, прежде чем увеличивать 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, чтобы исправить проблему CRASH Page.

# grep memory_limit /etc/php.ini
memory_limit = 512M
6 голосов
/ 12 июля 2015

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

Например, прокси-класс с тем же именем для функции объекта, который будет его прокси.

class Proxy {

    private $actualObject;

    public function doSomething() {

        return $this->actualObjec->doSomething();
    }
}   

Иногда вы можете забыть привезти этот маленький член фактического Objec, и поскольку у Proxy действительно есть метод doSomething, PHP не выдаст вам никакой ошибки, а для большого класса он может быть скрыт от глаз на пару минут, чтобы выяснить, почему это утечка памяти.

3 голосов
/ 30 января 2017

У меня была ошибка ниже при работе с набором данных, меньшим, чем работал ранее.

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-минутное видео немного в течение нескольких дней, и это все испортило. Это исправление, которое исправляют эксперты, даже не задумываясь об этом, но для таких, как я, стоит помнить об этом.

2 голосов
/ 22 февраля 2016

Запуск сценария следующим образом (например, cron): php5 /pathToScript/info.php выдает ту же ошибку.

Правильный путь: php5 -cli /pathToScript/info.php

...