У меня есть несколько систем 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, и он все еще выдает ошибки.
источник
ini_set('memory_limit', '256M');
Ответы:
Изменение
memory_limit
Вini_set('memory_limit', '-1');
является не правильным решением. Пожалуйста, не делай этого.Ваш PHP-код может иметь утечку памяти где-то, и вы говорите серверу просто использовать всю необходимую память. Вы бы не решили проблему вообще. Если вы проконтролируете свой сервер, вы увидите, что он теперь, вероятно, использует большую часть оперативной памяти и даже подключается к диску.
Вероятно, вам следует попытаться отследить код в вашем коде и исправить его.
источник
-1
может быть полезно только в средах разработки для тестирования.ini_set('memory_limit', '-1');
переопределяет ограничение памяти PHP по умолчанию .источник
-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. У вас просто есть код
ini_set('memory_limit', '128M');
(или что-то еще, что вы хотите ). Вы можете удалить ограничение памяти (хотя ограничения машины или экземпляра все еще могут применяться), установив значение «-1».источник
Утечки памяти в скрипте PHP очень легко - особенно если вы используете абстракцию, такую как ORM. Попробуйте использовать Xdebug для профилирования вашего скрипта и выяснить, куда ушла вся эта память.
источник
Добавляя 22,5 миллиона записей в массив с помощью array_push, я получал фатальные ошибки «исчерпал память», около 20 миллионов записей, используя
4G
в качестве ограничения памяти в файле php.ini. Чтобы исправить это, я добавил заявлениев верхней части файла. Теперь все работает нормально. Я не знаю, есть ли у PHP утечка памяти. Это не моя работа, и мне все равно. Я просто должен сделать свою работу, и это сработало.
Программа очень проста:
Неустранимая ошибка указывает на строку 3, пока я не увеличил предел памяти, что устранило ошибку.
источник
ini_set('memory_limit', '8192M');
?Я продолжал получать эту ошибку, даже с
memory_limit
set inphp.ini
, и значение, считываемое правильно сphpinfo()
.Изменяя это от этого:
К этому:
Это исправило проблему в PHP 7.
источник
Когда вы видите вышеупомянутую ошибку - особенно, если
(tried to allocate __ bytes)
это низкое значение, это может быть индикатором бесконечного цикла, как функция, которая вызывает себя без выхода:источник
После включения этих двух строк он начал работать:
источник
Вы можете исправить это, выбрав
memory_limit
fastcgi / fpm:Поменяйте память, как со 128 на 512, см. Ниже
в
источник
Корневой каталог вашего сайта:
источник
Измените ограничение памяти в файле php.ini и перезапустите Apache. После перезагрузки запустите phpinfo (); функция из любого файла PHP для
memory_limit
подтверждения изменения.Ограничение памяти -1 означает, что ограничение памяти не установлено. Это сейчас на максимуме.
источник
Для пользователей Drupal этот ответ Криса Лейна:
работает, но мы должны поставить его сразу после открытия
тег в файле index.php в корневом каталоге вашего сайта.
источник
В Drupal 7 вы можете изменить ограничение памяти в файле settings.php, который находится в папке sites / default. Вокруг строки 260 вы увидите это:
Даже если ваши настройки php.ini достаточно высоки, вы не сможете использовать более 128 МБ, если это не указано в файле Drupal settings.php.
источник
Вместо того, чтобы изменять
memory_limit
значение в вашемphp.ini
файле, если есть часть вашего кода, которая может использовать много памяти, вы можете удалитьmemory_limit
до того, как этот раздел запустится, а затем заменить его после.источник
PHP 5.3+ позволяет изменить ограничение памяти, поместив
.user.ini
файл вpublic_html
папку. Просто создайте файл выше и введите в нем следующую строку:Некоторые хосты cPanel принимают только этот метод.
источник
Краш страница?
(Это происходит, когда MySQL должен запрашивать большие строки. По умолчанию
memory_limit
установлено значение small, что было более безопасно для оборудования.)Вы можете проверить состояние вашей системы в памяти, прежде чем увеличивать
php.ini
:Здесь я увеличил его как в следующем, а затем сделать,
service httpd restart
чтобы исправить проблему страницы сбоя.источник
free -m
команды, чтобы выбрать новый memory_limit?Просто добавьте
ini_set('memory_limit', '-1');
строку в верхней части вашей веб-страницы.И вы можете установить свою память в соответствии с вашими потребностями вместо -1, до
16M
и т. Д.источник
Для тех, кто ломает голову, чтобы понять, почему эта маленькая функция должна вызывать утечку памяти, иногда по маленькой ошибке, функция начинает рекурсивно вызывать себя навсегда.
Например, прокси-класс с тем же именем для функции объекта, который собирается его прокси.
Иногда вы можете забыть привезти этого маленького члена фактического Objec, и, поскольку прокси-сервер на самом деле имеет этот
doSomething
метод, PHP не выдаст вам никакой ошибки, а для большого класса он может быть скрыт от глаз на пару минут, чтобы выяснить, почему он утечка памяти.источник
die('here')
свой код и переместить этот оператор, чтобы увидеть, где начинается рекурсия.У меня была ошибка ниже при работе с набором данных, меньшим, чем работал ранее.
Поскольку поиск ошибки привел меня сюда, я подумал, что упомяну, что это не всегда технические решения в предыдущих ответах, но что-то более простое. В моем случае это был Firefox. До того, как я запустил программу, она уже использовала 1157 МБ.
Оказывается, я смотрел 50-минутное видео немного в течение нескольких дней, и это все испортило. Это то, что эксперты исправляют, даже не задумываясь об этом, но для таких, как я, это стоит иметь в виду.
источник
Запуск сценария следующим образом (например, cron):
php5 /pathToScript/info.php
выдает ту же ошибку.Правильный путь:
php5 -cli /pathToScript/info.php
источник
Если вы используете виртуальный частный сервер на базе WHM, вы можете обнаружить, что у вас нет прав для прямого редактирования PHP.INI; система должна это сделать. В панели управления хостом WHM перейдите к Конфигурация службы → Редактор конфигурации PHP и измените
memory_limit
:источник
Я нахожу это полезным при включении или требовании
_dbconnection.php_
и_functions.php
в файлах, которые фактически обрабатываются, а не включается в заголовок. Который входит в себя.Так что, если ваш заголовок и нижний колонтитул включены, просто включите все ваши функциональные файлы, прежде чем заголовок включен.
источник
Использование
yield
может быть решением. См. Синтаксис генератора .Вместо того, чтобы изменять
PHP.ini
файл для увеличения объема памяти, иногда реализацияyield
внутреннего цикла может решить эту проблему. То, что делает yield - вместо того, чтобы выгружать все данные сразу, он читает их один за другим, экономя много памяти.источник
PHP.ini
? Не так лиphp.ini
?Эта ошибка иногда вызывается ошибкой в коде PHP, которая вызывает рекурсии, включающие обработку исключений и, возможно, другие операции. К сожалению, я не смог создать крошечный пример.
В этих случаях, которые случались для меня несколько раз,
set_time_limit
сбой, и браузер продолжает пытаться загрузить вывод PHP либо с бесконечным циклом, либо с сообщением о фатальной ошибке, которое является темой этого вопроса.Уменьшая допустимый размер выделения путем добавления
в начале вашего кода вы сможете предотвратить фатальную ошибку.
Тогда вы можете остаться с программой, которая завершается, но все еще трудно отлаживать.
На данный момент вставить
BreakLoop()
вызовы в вашу программу, чтобы получить контроль и выяснить, какой цикл или рекурсия в вашей программе вызывает проблему.Определение BreakLoop следующее:
Аргумент $ LoopSite может быть именем функции в вашем коде. На самом деле в этом нет необходимости, поскольку сообщение об ошибке, которое вы получите, будет указывать на строку, содержащую вызов BreakLoop ().
источник
В моем случае это была небольшая проблема с тем, как была написана функция. Утечка памяти может быть вызвана назначением нового значения входной переменной функции, например:
источник
Когда я удалил следующие строки из моего кода, все работало хорошо!
Эти строки были включены в каждый файл, который я запускал. При запуске файлов один за другим все работало нормально, но при запуске всех файлов вместе возникла проблема утечки памяти. Каким-то образом "include_once" не включает вещи один раз, или я делаю что-то не так ...
источник
set_include_path(get_include_path() . get_include_path().'/phpseclib');
Это добавит путь '/ phpseclib' один раз для каждого файла, который имеет строку ... так что он может добавить его много раз! Я бы предложил поместить его в файлinclude_once
настроек и файл настроек.