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


279

Это сообщение об ошибке представляется, какие-либо предложения?

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


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

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

3
Похоже, очень большой текстовый файл.
Macbirdie

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

Ответы:


319

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

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

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

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

Спасибо за предложение друзей.


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

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

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

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

113
Ух ты, этот ответ с большим количеством голосов кажется мне очень плохой практикой. -1!
Ambidex

59

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

  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


47

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

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

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

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


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

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

39

Делать:

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;

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

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

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

17

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


Кажется довольно вероятным, что это то, что делает это.
Kzqai

13

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

Поэтому вы должны читать их постепенно, используя fopen& fread.


1
Решил это с помощью:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Кай Ноак

12

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


6

У меня тоже была такая же проблема, я искал файлы phpinfo.ini, php.ini или .htaccess безрезультатно. Наконец, я посмотрел на некоторые файлы php, открыл их и проверил коды внутри памяти. В конце концов, это было то, что я выбрал, и оно сработало для меня. Я использовал WordPress, так что это решение может работать только для проблемы ограничения размера памяти WordPress. Мое решение - открыть файл default-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');

1
Работает на сайтах WordPress, где доступ к файлам .htaccess и php.ini недоступен. +1
Мустафа

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

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

1
О ... просто редактировать wp-config.php. И добавить две строки (я .e define( 'WP_MEMORY_LIMIT', '200M' );и define( 'WP_MAX_MEMORY_LIMIT', '256M' );. В отличие от файлов на «основной» WP (а именно, все под wp-includes), которые будут перезаписаны обновления WP, wp-config.phpне будет - это есть именно для Точная цель переопределения констант WP!
Гвинет Ллевелин

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

5

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

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

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

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



3

Я заметил, что многие ответы просто пытаются увеличить объем памяти, выделяемый скрипту, который имеет свое место, но чаще всего это означает, что что-то слишком либерально с памятью из-за непредвиденного объема или размера. Очевидно, что если вы не являетесь автором сценария, то это зависит от автора, если только вы не амбициозны :) Документы 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

2

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

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


2

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


1

Напишите

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

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


1

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


1

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

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


0

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

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

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


0

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


0

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

Это для php7.0

путь к php.ini, где я ошибся: /etc/php/7.0/cli/php.ini

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

; Максимальный объем памяти, который может потреблять скрипт (128 МБ)
; http://php.net/memory-limit
memory_limit = 128M

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



-1

если вы используете 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 }

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.