Допустимый объем памяти 33554432 байт исчерпан (попытался выделить 43148176 байт) в php

Появляется это сообщение об ошибке, есть предложения?

Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php

Что делает сценарий, когда он терпит неудачу? вы можете разместить код?

Neil Aitken 06.01.2009 12:43

мы пытаемся прочитать файл .txt

panidarapu 07.01.2009 08:06

Похоже на очень огромный текстовый файл.

macbirdie 22.01.2009 13:07

Обычно вы читаете файлы потенциально большого или произвольного размера по одной строке за раз, перезаписывая предыдущую строчную память при чтении каждой строки. Или вы можете просто просмотреть или начать файл, чтобы получить последние записи. Увеличение объема памяти по мере роста файла - это не ответ.

ekerner 21.05.2011 05:12

Увеличьте максимальный объем памяти до 64 МБ в файле php.ini. поиск Гугл Но могу я спросить, почему вы пытаетесь выделить столько памяти? В какой строке кода он терпит неудачу?

user19302 06.01.2009 11:21

PHP эффективен, если вы используете его правильно. Однако сложно отслеживать все свои объекты из-за управляемой природы среды выполнения - как в C#. Но слишком многие программисты высокого уровня (включая C#) не понимают, как их код влияет на ресурсы, на которых он работает.

user19302 07.01.2009 20:08

Это не обязательно проблема языка - это тоже проблема алгоритма. Слишком много программистов PHP выполняют повторяющиеся действия со всем набором данных вместо того, чтобы выполнять всю обработку над одним элементом за раз.

staticsan 07.01.2009 01:26

PHP может быть очень неэффективным с использованием памяти, я часто видел, как простые датагриды уносятся в 80 МБ всего с парой сотен записей. Кажется, это особенно происходит, когда вы идете по маршруту ООП.

TravisO 06.01.2009 20:16
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
305
9
617 352
22
Перейти к ответу Данный вопрос помечен как решенный

Ответы 22

Ваш сценарий использует слишком много памяти. Это часто может происходить в PHP, если у вас есть цикл, который вышел из-под контроля, и вы создаете объекты или добавляете их в массивы на каждом проходе цикла.

Проверьте наличие бесконечных циклов.

Если проблема не в этом, попробуйте помочь PHP, уничтожив объекты, с которыми вы закончили, установив для них значение null. например. $OldVar = null;

Также проверьте код, в котором действительно возникает ошибка. Ожидаете ли вы, что эта строка будет выделять огромный объем памяти? Если нет, попробуйте выяснить, что пошло не так ...

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

Kris Selbekk 15.10.2013 22:13

Ради тех, кто загонит кролика в нору. Doctrine в Symfony, я думаю, имеет проблему с монологом, и когда есть исключение PDO, он создаст бесконечный цикл исключений, поскольку он будет пытаться исключить исключение, тем самым скрывая реальную проблему (поврежденный файл db в моем случае).

Desislav Kamenov 07.02.2019 22:50

Если вы пытаетесь прочитать файл, это займет память в PHP. Например, если вы пытаетесь открыть и прочитать файл MP3 (например, $ data = file ("http://mydomain.com/path/sample.mp3"), он все это втянет в память.

Как предлагает Нельсон, вы можете работать над увеличением максимального предела памяти, если вам действительно нужно использовать такой объем памяти.

К сожалению, легко программировать на PHP так, чтобы память потреблялась быстрее, чем вы думаете. Копирование строк, массивов и объектов вместо использования ссылок сделает это, хотя PHP 5 должен делать это более автоматически, чем в PHP 4. Но работа с вашим набором данных в целом за несколько шагов также расточительна по сравнению с обработкой наименьшей логической единицы вовремя. Классический пример - работа с большими наборами результатов из базы данных: большинство программистов извлекают весь набор результатов в массив, а затем перебирают его один или несколько раз с помощью foreach(). Гораздо эффективнее использовать цикл while() для выборки и обработки одной строки за раз. То же самое относится и к обработке файла.

Кажется вполне вероятным, что это именно то, что нужно.

Kzqai 03.10.2016 21:17
Ответ принят как подходящий

Наконец я нашел ответ:

Просто добавьте эту строку перед строкой, в которой вы получаете ошибку в вашем файле php.

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

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

Рассмотрим '44M' вместо '-1' для безопасного использования памяти.

Вы все равно должны проверить Зачем, память исчерпана. Может быть, вам не нужно читать весь файл, возможно, читать его последовательно.

macbirdie 22.01.2009 13:12

Сработало отлично. Я знаю, что память Зачем была исчерпана - я использую Zend-Feed, чтобы использовать довольно большой поток Atom. Я не могу контролировать его размер или делать что-либо, кроме как проглотить весь канал за один прием, поэтому увеличение предела памяти для этой одной операции решило эту проблему. Ваше здоровье!

Don Jones 14.10.2009 00:53

- @panidarapu и @Don Jones: В зависимости от объема памяти и как этот скрипт может быть опасным разрешать изменение использования памяти таким образом. Дон, в вашем случае вы, вероятно, сможете разбить ленту на более мелкие куски и проанализировать то, что вам нужно. Рад, что это работает, но будьте осторожны.

anonymous coward 12.06.2010 00:51

Это предложение сработало для меня. Динамическое увеличение лимита памяти в скрипте осуществляется с помощью функции ini_set (): ini_set ('memory_limit', '128M');

mente 12.02.2011 07:16

ini_set ('предел_памяти', '128M'); Я использовал то же самое, но с той же проблемой

panidarapu 12.02.2011 07:16

@panidarapu: Возможно, у вас нет прав на увеличение лимита памяти, особенно если вы находитесь на общем хосте.

Kristian J. 12.02.2011 07:16

Если это не сработает, добавьте php_value memory_limit 50M в свой .htaccess. Замените 50M своим собственным значением.

mixdev 03.03.2011 00:24

Это плохая идея, которая потенциально оставляет ваш сервер открытым для злонамеренных атак через большие сообщения данных.

ekerner 21.05.2011 05:07

Если кто-то еще сталкивается с этой проблемой с Wordpress, попробуйте установить ограничения памяти PHP в wp-config.php. Вот код: define('WP_MEMORY_LIMIT', '128M');

dmanexe 24.08.2011 06:09

@panidarapu Использовать неограниченную память - это уже слишком, не так ли?

Ahmad Hajjar 11.01.2012 00:45

У меня была эта ошибка в /wp-includes/js/tinymce/langs/wp-langs.php. Сменить память было невозможно / не работало. Я только что удалил большую часть файла (из $ lang = on). Это сработало (теперь редактор на английском, ну и что).

Jeroen K 09.05.2012 18:11

Ребята, пожалуйста, не прибегайте к этому быстрому исправлению. Это может навредить вам в долгосрочной перспективе. Как хороший программист, вы должны выяснить причину этого потребления памяти и увеличить ее по мере необходимости, вместо того, чтобы сохранять ее UNLIMITED.

Sumoanand 12.06.2013 01:17

Вау, этот ответ, получивший огромное количество голосов, кажется мне действительно плохой практикой. -1!

Ambidex 24.10.2013 11:16

Я тоже считаю это опасным, но что худшего может случиться в будущем? Обрушить сервер? Что, если он сейчас не работает? Может ли быть хуже? Что делать, если вы используете стороннее приложение и не можете изменить код?

sam yi 20.02.2014 21:02

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

peter70 28.06.2014 11:00

Лучше попробуйте использовать что-то вроде memory_get_usage, чтобы диагностировать причину. В моем случае это был бесконечный цикл. И иметь бесконечные циклы в продакшене нехорошо :)

chestozo 10.11.2015 21:35

Это УЖАСНОЕ решение. Используйте это только для того, чтобы все работало достаточно, чтобы вы могли определить высокий уровень использования памяти и УМЕНЬШИТЬ его. Это убьет ваш производственный сервер, когда вы получите еще одну ошибку памяти. Вместо того, чтобы убивать один неверный запрос, он выбьет еще немного.

wedstrom 01.07.2016 00:55

Установка неограниченного объема памяти - очень плохая идея. Он скрывает потребление памяти программой, которое, безусловно, можно снизить. Более того, если это работает на сервере и вызывается несколько раз в секунду, это будет занимать память сервера или, возможно, в некоторых случаях прекратит умирать. Вы ДОЛЖНЫ анализировать свою программу с помощью трассировок memory_get_usage () в различных местах, хотя значения, задаваемые этой функцией, иногда вызывают беспокойство из-за схемы распределения блоков в PHP.

Francis Pierot 01.07.2016 11:18

Он не работает на PHP 5.6 в Windows. Я получаю аналогичную ошибку исчерпанной памяти.

DavidHyogo 23.06.2017 03:08

Это отличная статья об этой ошибке и о том, почему НЕ использовать НЕОГРАНИЧЕННУЮ память на сервере. Используйте -1 на dev только для тестирования, но не на продакшене. airpair.com/php/fatal-error-allowed-memory-size

nwolybug 28.12.2017 20:38

Следуя указаниям здесь: meta.stackoverflow.com/questions/255198/… Мне пришлось проголосовать против вашего ответа, так как он не решает описанную вами проблему, а только маскирует ее - и потенциально может вызвать дальнейшие проблемы в будущем.

Alex Mulchinock 16.04.2018 16:58

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

Matthew Barbara 17.12.2018 02:38

Я согласен, что это плохое решение из-за потенциального риска в будущем, но я выбрал его, потому что это было быстрое решение. Я пытался обновить Joomla! установить до последней версии. Как только мне это удалось, я немедленно удалил дополнение ini_set.

Daydah 18.02.2019 10:12

это не рекомендуемый метод. это похоже на то, что вы говорите взять столько памяти, сколько нужно. поэтому запустите эту команду "php -d memory_limit = 4G bin / magento" в корневом каталоге Magento

Mohammed Muzammil 23.07.2019 13:29

Если вам не нравится ваш веб-сервер, установите предел памяти до бесконечности ... LOL

zanderwar 03.09.2019 09:11

классный init_set, но у меня вопрос, безопасно ли это использовать для сервера?

Grald 11.10.2019 17:54

Я бы рекомендовал никогда, никогда установить ограничение памяти на -1 (неограниченно) в производственной среде. Это рецепт катастрофы. Не делайте этой ошибки новичка. ------------------------- Так как ты это делаешь? Просто - если вы сделаете это таким образом, вы можете предоставить PHP дополнительную память только при вызове этого фрагмента кода, а не увеличивать лимит памяти для всех процессов PHP. Если, увеличив лимит памяти, вы избавились от ошибки и теперь ваш код работает, вам нужно будет принять меры для уменьшения этого использования памяти.

Sayem 20.02.2020 15:55

В свой .htaccess вы можете добавить: PHP 5.x <IfModule mod_php5.c> php_value memory_limit 64M </IfModule> PHP 7.x <IfModule mod_php7.c> php_value memory_limit 64M </IfModule>

neo 22.04.2020 17:31
ini_set('memory_limit', '44M'); хорошо работал в моем случае с Wordpress.
Elron 07.09.2020 03:04

На самом деле это не решает проблему, это просто обходной путь для все еще существующей проблемы.

Hiran Chaudhuri 20.03.2021 01:45

Если вы хотите читать большие файлы, вам следует читать их по частям, а не сразу. Это простая математика: если вы читаете за один раз большой файл размером 1 МБ, то для хранения данных одновременно потребуется как минимум 1 МБ памяти.

Так что вы должны читать их по крупицам, используя fopen и fread.

Решено с помощью: $fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);

Avatar 28.04.2014 15:09

У нас была похожая ситуация, и мы опробовали данные в верхней части ответов ini_set ('предел_памяти', '-1'); и все работало нормально, сжатые файлы изображений размером от 1 МБ до КБ.

Вот два простых способа увеличить лимит виртуального хостинга:

  1. Если у вас есть доступ к вашему файлу PHP.ini, измените строку в PHP.ini Если ваша строка показывает 32M, попробуйте 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Если у вас нет доступа к PHP.ini, попробуйте добавить это в файл .htaccess: php_value memory_limit 64M

Писать

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

в вашем index.php вверху после открытия тега php

Пользователи wordpress добавляют строку:

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

в wp-settings.php, который вы можете найти в установленной корневой папке WordPress

Делает :

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

никогда не бывает хорошо. Если вы хотите прочитать очень большой файл, рекомендуется копировать его по частям. Попробуйте следующий код для лучшей практики.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

Не могу поверить, что все эти люди рекомендуют установить memory_limit на -1 ... Безумная вещь, которую можно сделать на рабочем сервере. Спасибо за гораздо более чистое решение.

JohnWolf 16.05.2015 18:50

В соответствии с «лучшими практиками» после цикла while рекомендуется закрыть обработчик файлов: fclose($file)

kodeart 09.09.2015 12:39

@assetCorp Как это помогает, если файл имеет, например, 100 МБ, а предел памяти PHP по-прежнему установлен на 32 МБ. Вы читаете его защищенными блоками по 1 МБ, но затем добавляете его в переменную, которая будет использовать всю доступную память, как только цикл достигнет 31-й итерации. Как там лучше? Только вывод фрагментов таким же образом, чтобы не требовать сохранения их всех в одной переменной, помог бы решить проблему.

helvete 04.04.2018 12:37

Вы можете увеличить объем памяти, разрешенный для PHP-скрипта, выполнив следующую строку над всеми кодами в скрипте:

ini_set('memory_limit','-1'); // enabled the full memory available.

А также удалите ненужные переменные в скрипте.

Проверьте эту библиотеку php: Освобождение памяти с помощью PHP

У меня также была такая же проблема, я искал файлы phpinfo.ini, php.ini или .htaccess безрезультатно. Наконец, я просмотрел некоторые файлы php, открыл их и проверил коды внутри на наличие памяти. Наконец, это решение было тем, что я придумал, и оно сработало для меня. Я использовал wordpress, поэтому это решение могло работать только с проблемой ограничения размера памяти wordpress. Мое решение, откройте файл по умолчанию-constants.php в папке / public_html / wp-includes. Откройте этот файл с помощью редактора кода и найдите настройки памяти в области wp_initial_constants или просто нажмите Ctrl + F, чтобы найти слово «память». Там вы найдете WP_MEMORY_LIMIT и WP_MAX_MEMORY_LIMIT. Просто увеличьте его, в моем случае это было 64 МБ, я увеличил до 128 МБ, а затем до 200 МБ.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Кстати, пожалуйста, не выполняйте следующий код, потому что это плохая практика:

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

Работает для веб-сайтов wordpress, где недоступен доступ для файлов .htaccess и php.ini. +1

Mustafa sabir 04.05.2017 10:23

Я бы сказал, что изменение этих ограничений для «основного» файла WordPress - не самая лучшая идея; Вместо этого вы можете очень легко добавить эти ограничения на wp-config.php, где они не будут перезаписаны будущими обновлениями WordPress. Кроме того, некоторые плагины безопасности (например, WordFence) будут жаловаться, если «основные» файлы WordPress будут изменены ...

Gwyneth Llewelyn 03.01.2020 22:12

@GwynethLlewelyn Я не знаю, как это сделать, не могли бы вы объяснить это, пожалуйста?

garakchy 06.01.2020 21:18

Ох ... просто отредактируйте wp-config.php и добавьте туда две строчки (т.е. define( 'WP_MEMORY_LIMIT', '200M' ); и define( 'WP_MAX_MEMORY_LIMIT', '256M' );. В отличие от файлов в "основном" WP (а именно, все в wp-includes), которые будут перезаписаны обновлениями WP, wp-config.php не будет - это именно для того, чтобы переопределить константы WP!

Gwyneth Llewelyn 07.01.2020 23:38

«плохая практика» носит ситуативный характер. -1 подходит для краткосрочных процессов. Например, контейнер php builder, который используется для запуска модульных тестов, или композитор устанавливает / и т. д. Только не запускайте свой производственный сайт с такой настройкой.

emmdee 28.01.2020 23:32

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

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

@Pang ini_set ('предел_памяти', '-1');

DIGITALCRIMINAL 18.03.2018 23:12

У меня была та же проблема, что и при запуске php в командной строке. Недавно я изменил файл php.ini и сделал ошибку при изменении php.ini.

Это для php7.0

path to php.ini where I made mistake: /etc/php/7.0/cli/php.ini

Я установил memory_limit = 256 (что означает 256 bytes)
вместо memory_limit = 256M (что означает 256 Mega bytes).

; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 128M

Как только я исправил это, мой процесс начал работать нормально.

Я получал такое же сообщение об ошибке после перехода на новую тему в Wordpress. PHP работал с версией 5.3, поэтому я переключился на 7.2. Это устранило проблему.

Я замечаю, что многие ответы просто пытаются увеличить объем памяти, предоставляемой сценарию, который имеет свое место, но чаще всего это означает, что что-то слишком либерально с памятью из-за непредвиденного объема или размера. Очевидно, что если вы не являетесь автором сценария, то вы зависите от автора, если только не чувствуете себя амбициозным :) В документации по PHP даже говорится, что проблемы с памятью связаны с "плохо написанные скрипты"

Следует отметить, что ini_set('memory_limit', '-1'); (без ограничений) может вызывать нестабильность сервера как 0 bytes free = bad things. Вместо этого найдите разумный баланс между тем, что пытается сделать ваш сценарий, и объемом доступной памяти на машине.

Лучший подход: Если вы являетесь автором сценария (или амбициозным), вы можете отлаживать такие проблемы с памятью с помощью xdebug. В последней версии (2.6.0 - выпущена в 2018-01-29) возвращено профилирование памяти, которое показывает, какие вызовы функций потребляют большие объемы памяти. Это выявляет проблемы в сценарии, которые иначе трудно найти. Обычно неэффективность заключается в цикле, который не предполагает ожидаемого объема, который он получает, но каждый случай будет оставлен читателю в качестве упражнения :)

документация xdebug полезен, но он сводится к 3 шагам:

  1. Установите это - Доступен через apt-get, yum и т. д.
  2. Настроить это - xdebug.ini: xdebug.profiler_enable = 1, xdebug.profiler_output_dir = /where/ever/
  3. Просматривайте профили в таком инструменте, как QCacheGrind, KCacheGrind

Я столкнулся с такой же проблемой в php7.2 с laravel 5.6. Я просто увеличиваю количество переменной memory_limit = 128M в php.ini по мере необходимости. Это может быть 256M / 512M / 1048M ..... Теперь все работает нормально.

если вы используете laravel, тогда используйте эти способы

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

вместо

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

Запустите эту команду в корневом каталоге Magento php -d memory_limit=4G bin/magento.

Если вы используете общий хостинг, вы не сможете принудительно увеличить ограничение размера php.

Просто перейдите в свою cpanel и обновите версию php до 7.1 и выше, и тогда все готово.

Я на 7,4, все еще сталкиваюсь.

user1994 16.10.2020 14:18

Проблема была решена, когда я обновил php до 7.1. Можете ли вы попробовать php 7.1 или 7.2

successtar 17.10.2020 18:22

Хочу поделиться своим опытом по этому поводу!

Предположим, у вас есть класс A и класс B.

class A {
    protected $userB;

    public function __construct() {
        $this->userB = new B();
    }
}

class B {
    protected $userA;

    public function __construct() {
        $this->userA = new A();
    }
}

это инициирует формирование цепочки объектов, которые могут создавать такого рода проблемы!

Другие вопросы по теме