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

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

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

Ответы [ 20 ]

294 голосов
/ 10 января 2009

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

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

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

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

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

56 голосов
/ 10 марта 2011

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

  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

42 голосов
/ 06 января 2009

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

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

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

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

34 голосов
/ 07 марта 2015

делает:

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;
16 голосов
/ 07 января 2009

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

13 голосов
/ 22 января 2009

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

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

7 голосов
/ 08 июля 2018

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

6 голосов
/ 19 ноября 2015

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

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

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

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

4 голосов
/ 05 января 2017

У меня тоже была такая же проблема, я искал файлы 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');
3 голосов
/ 23 декабря 2010

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

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