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




php fatal error allowed memory size of 33554432 (16)

У меня есть множество клиентских точек продаж (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, и он все еще не работает.


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

memory_limit = -1

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


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

memory_limit = 64M

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


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

$limit = ini_get('memory_limit');
ini_set('memory_limit', -1);
// ... do heavy stuff
ini_set('memory_limit', $limit);

Вы можете исправить это, изменив 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

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

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

class Proxy {

    private $actualObject;

    public function doSomething() {

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

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


Если вы используете VPS с виртуальным частным сервером (WHM), вы можете обнаружить, что у вас нет прав на редактирование PHP.INI напрямую; система должна это сделать. На панели управления хостом WHM откройте «Конфигурация службы»> «Редактор конфигурации PHP», измените memory_limit:


Изменение memory_limit по ini_set('memory_limit', '-1'); не является правильным решением. Пожалуйста, не делай этого.

У вашего PHP-кода может быть утечка памяти где-то, и вы говорите серверу просто использовать всю память, которая ему нужна. Вы бы не исправили проблему вообще. Если вы будете следить за своим сервером, вы увидите, что теперь он, вероятно, использует большую часть ОЗУ и даже переключается на диск.

Вероятно, вы должны попытаться отследить код нарушения кода и исправить его.


Когда вы видите вышеупомянутую ошибку - особенно если (tried to allocate __ bytes) - это низкое значение, которое может быть индикатором бесконечного цикла, как функция, которая сама по себе не имеет выхода:

function exhaustYourBytes()
{
    return exhaustYourBytes();
}

После включения этих двух линий.
Он начал работать

; 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


Правильный способ - отредактировать файл 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».


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

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


Я считаю это полезным при включении или требовании:
dbconnection.php , _functions.php в файлах, которые фактически обрабатываются,
вместо включения в заголовок. Который включен сам.

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


не уверен, что этот ответ будет полезен, но когда я удалил следующие строки из моего кода, все работало нормально!

set_include_path(get_include_path() . get_include_path().'/phpseclib');

include_once ( 'Net / SSH2.php'); include_once ( 'Net / SFTP.php');

Эти строки были включены во все запущенные файлы, когда все файлы работали один за другим, но при запуске всех файлов я получил проблему с утечкой памяти. Так или иначе, «include_once» не включает в себя вещи один раз, или что-то не так.


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

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

Страница 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