Появляется это сообщение об ошибке, есть предложения?
Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php
мы пытаемся прочитать файл .txt
Похоже на очень огромный текстовый файл.
Обычно вы читаете файлы потенциально большого или произвольного размера по одной строке за раз, перезаписывая предыдущую строчную память при чтении каждой строки. Или вы можете просто просмотреть или начать файл, чтобы получить последние записи. Увеличение объема памяти по мере роста файла - это не ответ.
Возможный дубликат Неустранимая ошибка: разрешенный размер памяти 134217728 байт исчерпан (CodeIgniter + XML-RPC)
Увеличьте максимальный объем памяти до 64 МБ в файле php.ini. поиск Гугл Но могу я спросить, почему вы пытаетесь выделить столько памяти? В какой строке кода он терпит неудачу?
PHP эффективен, если вы используете его правильно. Однако сложно отслеживать все свои объекты из-за управляемой природы среды выполнения - как в C#. Но слишком многие программисты высокого уровня (включая C#) не понимают, как их код влияет на ресурсы, на которых он работает.
Это не обязательно проблема языка - это тоже проблема алгоритма. Слишком много программистов PHP выполняют повторяющиеся действия со всем набором данных вместо того, чтобы выполнять всю обработку над одним элементом за раз.
PHP может быть очень неэффективным с использованием памяти, я часто видел, как простые датагриды уносятся в 80 МБ всего с парой сотен записей. Кажется, это особенно происходит, когда вы идете по маршруту ООП.






Ваш сценарий использует слишком много памяти. Это часто может происходить в PHP, если у вас есть цикл, который вышел из-под контроля, и вы создаете объекты или добавляете их в массивы на каждом проходе цикла.
Проверьте наличие бесконечных циклов.
Если проблема не в этом, попробуйте помочь PHP, уничтожив объекты, с которыми вы закончили, установив для них значение null. например. $OldVar = null;
Также проверьте код, в котором действительно возникает ошибка. Ожидаете ли вы, что эта строка будет выделять огромный объем памяти? Если нет, попробуйте выяснить, что пошло не так ...
У меня была именно эта проблема - оказалось, что я случайно создал рекурсивную функцию - и поэтому в любой случайный момент во время выполнения кода ей не хватало памяти. Это было положительным моментом в том, что у меня теперь был самый эффективный с точки зрения памяти код в мире, созданный в поисках утечки памяти.
Ради тех, кто загонит кролика в нору. Doctrine в Symfony, я думаю, имеет проблему с монологом, и когда есть исключение PDO, он создаст бесконечный цикл исключений, поскольку он будет пытаться исключить исключение, тем самым скрывая реальную проблему (поврежденный файл db в моем случае).
Если вы пытаетесь прочитать файл, это займет память в PHP. Например, если вы пытаетесь открыть и прочитать файл MP3 (например, $ data = file ("http://mydomain.com/path/sample.mp3"), он все это втянет в память.
Как предлагает Нельсон, вы можете работать над увеличением максимального предела памяти, если вам действительно нужно использовать такой объем памяти.
К сожалению, легко программировать на PHP так, чтобы память потреблялась быстрее, чем вы думаете. Копирование строк, массивов и объектов вместо использования ссылок сделает это, хотя PHP 5 должен делать это более автоматически, чем в PHP 4. Но работа с вашим набором данных в целом за несколько шагов также расточительна по сравнению с обработкой наименьшей логической единицы вовремя. Классический пример - работа с большими наборами результатов из базы данных: большинство программистов извлекают весь набор результатов в массив, а затем перебирают его один или несколько раз с помощью foreach(). Гораздо эффективнее использовать цикл while() для выборки и обработки одной строки за раз. То же самое относится и к обработке файла.
Кажется вполне вероятным, что это именно то, что нужно.
Наконец я нашел ответ:
Просто добавьте эту строку перед строкой, в которой вы получаете ошибку в вашем файле php.
ini_set('memory_limit', '-1');
Потребуется неограниченное использование памяти сервера, он работает нормально.
Рассмотрим '44M' вместо '-1' для безопасного использования памяти.
Вы все равно должны проверить Зачем, память исчерпана. Может быть, вам не нужно читать весь файл, возможно, читать его последовательно.
Сработало отлично. Я знаю, что память Зачем была исчерпана - я использую Zend-Feed, чтобы использовать довольно большой поток Atom. Я не могу контролировать его размер или делать что-либо, кроме как проглотить весь канал за один прием, поэтому увеличение предела памяти для этой одной операции решило эту проблему. Ваше здоровье!
- @panidarapu и @Don Jones: В зависимости от объема памяти и как этот скрипт может быть опасным разрешать изменение использования памяти таким образом. Дон, в вашем случае вы, вероятно, сможете разбить ленту на более мелкие куски и проанализировать то, что вам нужно. Рад, что это работает, но будьте осторожны.
Это предложение сработало для меня. Динамическое увеличение лимита памяти в скрипте осуществляется с помощью функции ini_set (): ini_set ('memory_limit', '128M');
ini_set ('предел_памяти', '128M'); Я использовал то же самое, но с той же проблемой
@panidarapu: Возможно, у вас нет прав на увеличение лимита памяти, особенно если вы находитесь на общем хосте.
Если это не сработает, добавьте php_value memory_limit 50M в свой .htaccess. Замените 50M своим собственным значением.
Это плохая идея, которая потенциально оставляет ваш сервер открытым для злонамеренных атак через большие сообщения данных.
Если кто-то еще сталкивается с этой проблемой с Wordpress, попробуйте установить ограничения памяти PHP в wp-config.php. Вот код: define('WP_MEMORY_LIMIT', '128M');
@panidarapu Использовать неограниченную память - это уже слишком, не так ли?
У меня была эта ошибка в /wp-includes/js/tinymce/langs/wp-langs.php. Сменить память было невозможно / не работало. Я только что удалил большую часть файла (из $ lang = on). Это сработало (теперь редактор на английском, ну и что).
Ребята, пожалуйста, не прибегайте к этому быстрому исправлению. Это может навредить вам в долгосрочной перспективе. Как хороший программист, вы должны выяснить причину этого потребления памяти и увеличить ее по мере необходимости, вместо того, чтобы сохранять ее UNLIMITED.
Вау, этот ответ, получивший огромное количество голосов, кажется мне действительно плохой практикой. -1!
Я тоже считаю это опасным, но что худшего может случиться в будущем? Обрушить сервер? Что, если он сейчас не работает? Может ли быть хуже? Что делать, если вы используете стороннее приложение и не можете изменить код?
У меня тоже была эта ошибка в моем скрипте. Это произошло потому, что я зашел в бесконечный цикл, который привел к переполнению стека.
Лучше попробуйте использовать что-то вроде memory_get_usage, чтобы диагностировать причину. В моем случае это был бесконечный цикл. И иметь бесконечные циклы в продакшене нехорошо :)
Это УЖАСНОЕ решение. Используйте это только для того, чтобы все работало достаточно, чтобы вы могли определить высокий уровень использования памяти и УМЕНЬШИТЬ его. Это убьет ваш производственный сервер, когда вы получите еще одну ошибку памяти. Вместо того, чтобы убивать один неверный запрос, он выбьет еще немного.
Установка неограниченного объема памяти - очень плохая идея. Он скрывает потребление памяти программой, которое, безусловно, можно снизить. Более того, если это работает на сервере и вызывается несколько раз в секунду, это будет занимать память сервера или, возможно, в некоторых случаях прекратит умирать. Вы ДОЛЖНЫ анализировать свою программу с помощью трассировок memory_get_usage () в различных местах, хотя значения, задаваемые этой функцией, иногда вызывают беспокойство из-за схемы распределения блоков в PHP.
Он не работает на PHP 5.6 в Windows. Я получаю аналогичную ошибку исчерпанной памяти.
Это отличная статья об этой ошибке и о том, почему НЕ использовать НЕОГРАНИЧЕННУЮ память на сервере. Используйте -1 на dev только для тестирования, но не на продакшене. airpair.com/php/fatal-error-allowed-memory-size
Следуя указаниям здесь: meta.stackoverflow.com/questions/255198/… Мне пришлось проголосовать против вашего ответа, так как он не решает описанную вами проблему, а только маскирует ее - и потенциально может вызвать дальнейшие проблемы в будущем.
Это очень плохо. Если вы сделаете это, вы можете использовать значительный объем памяти сервера, и последствия могут быть критическими.
Я согласен, что это плохое решение из-за потенциального риска в будущем, но я выбрал его, потому что это было быстрое решение. Я пытался обновить Joomla! установить до последней версии. Как только мне это удалось, я немедленно удалил дополнение ini_set.
это не рекомендуемый метод. это похоже на то, что вы говорите взять столько памяти, сколько нужно. поэтому запустите эту команду "php -d memory_limit = 4G bin / magento" в корневом каталоге Magento
Если вам не нравится ваш веб-сервер, установите предел памяти до бесконечности ... LOL
классный init_set, но у меня вопрос, безопасно ли это использовать для сервера?
Я бы рекомендовал никогда, никогда установить ограничение памяти на -1 (неограниченно) в производственной среде. Это рецепт катастрофы. Не делайте этой ошибки новичка. ------------------------- Так как ты это делаешь? Просто - если вы сделаете это таким образом, вы можете предоставить PHP дополнительную память только при вызове этого фрагмента кода, а не увеличивать лимит памяти для всех процессов PHP. Если, увеличив лимит памяти, вы избавились от ошибки и теперь ваш код работает, вам нужно будет принять меры для уменьшения этого использования памяти.
В свой .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>
ini_set('memory_limit', '44M'); хорошо работал в моем случае с Wordpress.
На самом деле это не решает проблему, это просто обходной путь для все еще существующей проблемы.
Если вы хотите читать большие файлы, вам следует читать их по частям, а не сразу. Это простая математика: если вы читаете за один раз большой файл размером 1 МБ, то для хранения данных одновременно потребуется как минимум 1 МБ памяти.
Так что вы должны читать их по крупицам, используя fopen и fread.
Решено с помощью: $fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
У нас была похожая ситуация, и мы опробовали данные в верхней части ответов ini_set ('предел_памяти', '-1'); и все работало нормально, сжатые файлы изображений размером от 1 МБ до КБ.
Вот два простых способа увеличить лимит виртуального хостинга:
Если у вас есть доступ к вашему файлу PHP.ini, измените строку в PHP.ini
Если ваша строка показывает 32M, попробуйте 64M:
memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)
Если у вас нет доступа к 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 ... Безумная вещь, которую можно сделать на рабочем сервере. Спасибо за гораздо более чистое решение.
В соответствии с «лучшими практиками» после цикла while рекомендуется закрыть обработчик файлов: fclose($file)
@assetCorp Как это помогает, если файл имеет, например, 100 МБ, а предел памяти PHP по-прежнему установлен на 32 МБ. Вы читаете его защищенными блоками по 1 МБ, но затем добавляете его в переменную, которая будет использовать всю доступную память, как только цикл достигнет 31-й итерации. Как там лучше? Только вывод фрагментов таким же образом, чтобы не требовать сохранения их всех в одной переменной, помог бы решить проблему.
Вы можете увеличить объем памяти, разрешенный для 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
Я бы сказал, что изменение этих ограничений для «основного» файла WordPress - не самая лучшая идея; Вместо этого вы можете очень легко добавить эти ограничения на wp-config.php, где они не будут перезаписаны будущими обновлениями WordPress. Кроме того, некоторые плагины безопасности (например, WordFence) будут жаловаться, если «основные» файлы WordPress будут изменены ...
@GwynethLlewelyn Я не знаю, как это сделать, не могли бы вы объяснить это, пожалуйста?
Ох ... просто отредактируйте wp-config.php и добавьте туда две строчки (т.е. define( 'WP_MEMORY_LIMIT', '200M' ); и define( 'WP_MAX_MEMORY_LIMIT', '256M' );. В отличие от файлов в "основном" WP (а именно, все в wp-includes), которые будут перезаписаны обновлениями WP, wp-config.php не будет - это именно для того, чтобы переопределить константы WP!
«плохая практика» носит ситуативный характер. -1 подходит для краткосрочных процессов. Например, контейнер php builder, который используется для запуска модульных тестов, или композитор устанавливает / и т. д. Только не запускайте свой производственный сайт с такой настройкой.
Я не продлевал свой хостинг, и база данных была доступна только для чтения. Joomla нужно было написать сессию, но она не могла этого сделать.
ini_set('memory_limit', '-1');
@Pang ini_set ('предел_памяти', '-1');
У меня была та же проблема, что и при запуске 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-limitmemory_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 шагам:
apt-get, yum и т. д.xdebug.profiler_enable = 1, xdebug.profiler_output_dir = /where/ever/Я столкнулся с такой же проблемой в 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, все еще сталкиваюсь.
Проблема была решена, когда я обновил php до 7.1. Можете ли вы попробовать php 7.1 или 7.2
Хочу поделиться своим опытом по этому поводу!
Предположим, у вас есть класс A и класс B.
class A {
protected $userB;
public function __construct() {
$this->userB = new B();
}
}
class B {
protected $userA;
public function __construct() {
$this->userA = new A();
}
}
это инициирует формирование цепочки объектов, которые могут создавать такого рода проблемы!
Что делает сценарий, когда он терпит неудачу? вы можете разместить код?