Представлено это сообщение об ошибке, любые предложения?
Допустимый размер памяти 33554432 байт исчерпан (пытался выделить 43148176 байт) в php
Представлено это сообщение об ошибке, любые предложения?
Допустимый размер памяти 33554432 байт исчерпан (пытался выделить 43148176 байт) в php
Наконец-то я нашел ответ:
Просто добавьте эту строку ниже до того, как вы получите ошибку в вашем файле
ini_set('memory_limit', '-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
В вашем script используется слишком много памяти. Это может часто возникать в PHP, если у вас есть цикл, который закончился из-за контроля, и вы создаете объекты или добавляете массивы на каждом проходе цикла.
Проверьте наличие бесконечных циклов.
Если это не проблема, попробуйте и помогите PHP, уничтожив объекты, которые вы закончили, установив их в null. например. $OldVar = null;
Проверьте код, где происходит ошибка. Вы ожидаете, что эта линия будет выделять массивный объем памяти? Если нет, попробуйте и выясните, что пошло не так...
Выполнение:
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;
К сожалению, легко программировать на PHP таким образом, который потребляет память быстрее, чем вы понимаете. Копирование строк, массивов и объектов вместо использования ссылок сделает это, хотя PHP 5 должен делать это более автоматически, чем в PHP 4. Но обработка вашего набора данных целиком на несколько этапов также расточительна по сравнению с обработкой наименьшего логического блока вовремя. Классический пример - работа с большими результирующими наборами из базы данных: большинство программистов извлекают весь набор результатов в массив, а затем чередуют его один или несколько раз с помощью foreach()
. Эффективнее использовать цикл while()
для сбора и обработки одной строки за раз. То же самое относится к обработке файла.
Если вы хотите читать большие файлы, вы должны читать их пополам, а не читать их сразу.
Его простая математика: если вы одновременно читаете крупный файл размером 1 МБ, то для хранения данных требуется не менее 1 МБ памяти.
Итак, вы должны читать их по биту, используя fopen
и fread
.
Я столкнулся с той же проблемой в php7.2 с laravel 5.6. Я просто увеличиваю количество переменной memory_limit = 128M
в php.ini, как того требуют мои приложения. Это может быть 256M/512M/1048M..... Теперь все работает нормально.
Вы можете увеличить память, разрешенную для php script, выполнив следующую строку над всеми кодами в script:
ini_set('memory_limit','-1'); // enabled the full memory available.
А также выделите нежелательные переменные в script.
Проверьте эту библиотеку php: Освободите память с помощью PHP
У меня также была такая же проблема, я искал файлы 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' );
}
}
Btw, пожалуйста, не делайте следующий код, потому что эта плохая практика:
ini_set('memory_limit', '-1');
Если вы пытаетесь прочитать файл, это займет память в PHP. Например, если вы пытаетесь открыть и прочитать файл MP3 (например, $data = file ( " http://mydomain.com/path/sample.mp3" ) он все равно потянет в память.
Как указывает Нельсон, вы можете работать, чтобы увеличить максимальный предел памяти, если вам действительно нужно использовать эту большую память.
У нас была аналогичная ситуация, и мы опробовали данные в верхней части ответов ini_set ('memory_limit', '-1'); и все работало отлично, сжатые файлы изображений размером более 1 МБ в КБ.
Я заметил, что многие ответы просто пытаются увеличить объем памяти, выделяемый сценарию, который имеет свое место, но чаще всего это означает, что с памятью что-то слишком либерально из-за непредвиденного объема или размера. Очевидно, что если вы не являетесь автором сценария, то это зависит от автора, если только вы не амбициозны :) Документы 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/
ini_set('memory_limit', '-1');
Запись
ini_set('memory_limit', '-1');
в вашем index.php вверху после открытия тега php
пользователи Wordpress добавляют строку:
@ini_set('memory_limit', '-1');
в wp-settings.php, который вы можете найти в установленной корневой папке wordpress
Я не обновил свой хостинг, и база данных была доступна только для чтения. Joomla необходимо было написать сеанс и не мог этого сделать.
У меня была та же проблема, что запуск 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-limitmemory_limit = 128M
Как только я исправил это, мой процесс начал работать нормально.
Я получал то же сообщение об ошибке после перехода на новую тему в Wordpress. PHP работал под управлением версии 5.3, поэтому я перешел на 7.2. Это решило проблему.
Запустите эту команду в корневой директории Magento php -d memory_limit=4G bin/magento
Переключение сервера на php 7.x решило проблему в моем случае
если вы используете 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 }