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



268435456 81 (20)

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

memory_limit = 64M

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

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


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

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

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

<?php

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


Правильный способ - отредактировать файл php.ini . Измените memory_limit на ваше значение желания.

Как и ваш вопрос, 128M (который является лимитом по умолчанию) был превышен, поэтому в вашем коде есть что-то серьезное, потому что это не так много.

Если вы знаете, почему это так много, и вы хотите разрешить ему установить memory_limit = 512M или выше, и вы должны быть хорошими.


Запуск скрипта (например, cron case): php5 /pathToScript/info.php создает ту же ошибку.

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



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

; 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 , а значение правильно phpinfo() с помощью phpinfo() .

Изменяя это:

memory_limit=4G

К этому:

memory_limit=4096M

Это устранило проблему в PHP 7.


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

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


При добавлении 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, пока я не увеличил ограничение памяти, которое устранило ошибку.


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

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

memory_limit = -1

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


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

Очень легко получить утечки памяти в скрипте PHP, особенно если вы используете абстракцию, такую ​​как ORM. Попробуйте использовать Xdebug для профайла своего скрипта и узнайте, куда все это пошло.


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

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

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

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

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


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

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

class Proxy {

    private $actualObject;

    public function doSomething() {

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

Иногда вы можете забыть принести этот маленький член actualObjec, и поскольку у Proxy действительно есть метод doSomething, 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');

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

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

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


Это решение из командной строки mysql

mysql>USE information_schema;

В следующем запросе просто измените <- DATABASE_NAME -> в свою базу данных и <- TABLENAME -> на имя таблицы, где вам просто нужны значения поля инструкции DESCRIBE

mysql> SELECT COLUMN_NAME FROM COLUMNS WHERE TABLE_SCHEMA = '<--DATABASE_NAME-->' AND   TABLE_NAME='<--TABLENAME-->';




php codeigniter memory xml-rpc memory-limit