Конфигурация PHP: увеличение порога памяти скриптов

Раздел: Настройка сервера -> Конфигурация PHP

Увеличение лимита памяти PHP

Какой самый надёжный способ установить значение memory_limit 512MB или выше для всего сервера?

Наиболее эффективное решение - изменение основного конфигурационного файла php.ini. Оно действует для всех веб-запросов и скриптов командной строки, если используется один и тот же файл конфигурации.


; Отредактируйте php.ini (путь может отличаться в зависимости от ОС и окружения)
; Найдите строку memory_limit и установите:
memory_limit = 512M
; или для более высоких значений:
memory_limit = 1024M
  

Php ниже рекомендуемого значения 512mb (увеличение лимита памяти php)

После изменения перезапустите веб-сервер (Apache, Nginx, OpenLiteSpeed) и, если используется PHP-FPM, перезагрузите его службу.

Типичная ошибка: Изменение не применяется, если загружается другая версия php.ini (например, для CLI и веба отдельные файлы). Проверьте актуальную конфигурацию с помощью phpinfo().

Решение: С помощью phpinfo() найдите строку Loaded Configuration File и редактируйте именно тот файл.

Как изменить лимит памяти только для конкретного каталога через .htaccess?

Если доступ к php.ini отсутствует (например, на shared-хостинге), можно использовать файл .htaccess (для Apache) или .user.ini (для Nginx/FPM). Этот способ влияет на все скрипты в данном каталоге и его подкаталогах.


; Пример для .htaccess (Apache):
php_value memory_limit 512M
  

найти php ini (поиск файла php.ini)


; Пример для .user.ini (PHP-FPM, Nginx):
memory_limit = 512M
  

Php ini сервера (настройка php.ini на сервере)

Ошибка: Директива php_value может быть запрещена настройками сервера (AllowOverride None). В этом случае способ не работает.

Решение: Использовать ini_set() в самом скрипте или обратиться к администратору хостинга.

Как временно увеличить память для одного скрипта с помощью ini_set()?

Когда необходимо изменить лимит только для небольшого участка кода, не затрагивая остальную конфигурацию, используется функция ini_set(). Это удобно для обработки больших файлов или ресурсоёмких операций.


<?php
// Устанавливаем лимит памяти для текущего выполнения
ini_set('memory_limit', '1024M');

// Код, требующий большого объёма памяти
$largeArray = range(1, 1000000);
?>
  

Php extension required (требуемое расширение php)

Проблема: Если лимит задан через ini_set(), но при этом в php.ini установлено меньшее значение, то может не хватить оперативной памяти на уровне ОС до того, как сработает ограничение PHP.

Решение: Перед вызовом ini_set() проверяйте доступную память через memory_get_usage(true) и корректируйте запрос.

Как настроить лимит памяти для PHP-FPM с помощью пула?

Если используется PHP-FPM, можно задать memory_limit для конкретного пула (например, для отдельного сайта) в файле конфигурации пула (обычно /etc/php/*/fpm/pool.d/*.conf). Это даёт гибкость в разграничении ресурсов между приложениями.


; В файле пула (например, www.conf):
php_admin_value[memory_limit] = 512M
  

Set limit php (установка лимита в php)

После изменения перезапустите PHP-FPM.

Ошибка: Использование php_admin_value может быть переопределено в скрипте через ini_set(). Чтобы избежать этого, применяйте php_admin_flag или обратитесь к документации.

Решение: Для обязательного ограничения используйте php_admin_flag[memory_limit] = 1 (но это нестандартный подход). Лучше настроить мониторинг.

Как проверить текущий лимит памяти в PHP-скрипте?

Перед тем как увеличивать память, полезно узнать текущее значение с помощью функции ini_get().


<?php
echo 'Текущий memory_limit: ' . ini_get('memory_limit');
?>
  

настройка settings php (настройка файла settings.php)

Текущий memory_limit: 128M
  

Частая проблема: На некоторых хостингах ini_get() возвращает значение из родительской конфигурации, а не фактическое ограничение.

Решение: Использовать memory_get_usage() и сравнивать с реальным выделением.

Расширенные примеры настройки памяти PHP

Пример

<?php
// Пример: динамическое увеличение памяти под конкретную задачу
function processLargeImage($path) {
    $neededMemory = 200 * 1024 * 1024; // 200 MB
    $currentMemory = memory_get_usage(true);
    $availableMemory = ini_get('memory_limit');
    $availableBytes = returnBytes($availableMemory);

    if ($neededMemory > $availableBytes - $currentMemory) {
        $newLimit = ($neededMemory + $currentMemory + 64 * 1024 * 1024) / 1024 / 1024;
        ini_set('memory_limit', round($newLimit) . 'M');
    }

    // Обработка изображения
    $image = imagecreatefromjpeg($path);
    // ...
    imagedestroy($image);
}

function returnBytes($val) {
    $val = trim($val);
    $last = strtolower($val[strlen($val)-1]);
    $val = (int)$val;
    switch ($last) {
        case 'g': $val *= 1024;
        case 'm': $val *= 1024;
        case 'k': $val *= 1024;
    }
    return $val;
}
?>
Функция увеличит memory_limit, если текущего недостаточно для работы с большим JPEG-изображением (например, 20 МБ файл).
Пример

<?php
// Пример: работа с памятью при загрузке CSV-файла больше 1 ГБ
ini_set('memory_limit', '1024M');
ini_set('max_execution_time', 300);

$handle = fopen('huge.csv', 'r');
$batch = [];
while (($row = fgetcsv($handle, 0, ',')) !== FALSE) {
    $batch[] = $row;
    if (count($batch) >= 1000) {
        processBatch($batch);
        $batch = [];
        echo 'Освобождено после пакета: ' . memory_get_usage(true) / 1024 / 1024 . " MB\n";
        gc_collect_cycles();
    }
}
fclose($handle);

function processBatch($data) {
    // Имитация работы с данными
    foreach ($data as $record) {
        // ...
    }
}
?>
Вывод: После каждого пакета освобождается память, что позволяет обрабатывать файлы больше 1 ГБ без превышения лимита.
Пример

# Команда для проверки лимита памяти в CLI
php -r "echo ini_get('memory_limit');"
512M
Пример

# Установка лимита памяти через опцию -d в командной строке
php -d memory_limit=2G myscript.php
Скрипт выполнится с временным лимитом 2 ГБ, не затрагивая системные настройки.
Пример

<?php
// Пример: использование .user.ini для различных окружений
// В корне проекта создайте файл .user.ini со следующим содержимым:
; memory_limit = 256M
; для продакшена
memory_limit = 512M
; для отладки можно дополнительно увеличить
; xdebug.memory_limit = 1024M
?>
Файл .user.ini автоматически применяется ко всем скриптам в данной папке при использовании PHP-FPM.
Пример

<?php
// Пример: безопасное увеличение памяти с проверкой прав
if (ini_get('memory_limit') < '512M') {
    if (ini_set('memory_limit', '512M') === false) {
        // Не удалось увеличить – возможно, запрещено конфигурацией
        error_log('Не удалось увеличить memory_limit до 512M');
    }
}
?>
Логирование ошибки помогает отследить случаи, когда хостинг не позволяет изменять лимит.

Увеличение лимита памяти PHP - comments

En
Php ниже рекомендуемого значения 512mb (php)