Установка значений лимитов в PHP: подробная инструкция

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

Настройка ограничений ресурсов в PHP

Основное решение: изменение директив в php.ini или использование функции ini_set()

Наиболее эффективный способ установить лимиты в PHP - это редактирование основного конфигурационного файла php.ini. Для временного изменения в рамках скрипта применяется функция ini_set(). Ниже приведены ключевые директивы и примеры.

Как изменить максимальный объём памяти, выделяемый скрипту?

Директива memory_limit задаётся в байтах, килобайтах (K), мегабайтах (M) или гигабайтах (G).

; php.ini
memory_limit = 256M

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

// runtime в скрипте (если разрешено)
ini_set('memory_limit', '512M');

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

Типичная ошибка:

Попытка установить memory_limit в значение, превышающее системное ограничение или лимит сервера, может привести к сбою. Также ini_set() не сработает, если директива помечена как PHP_INI_SYSTEM (т.е. доступна только в php.ini). Проверьте статус через ini_get('memory_limit') и документацию.

Как ограничить время выполнения скрипта?

Директива max_execution_time задаётся в секундах. Значение 0 означает бесконечное выполнение (не рекомендуется).

; php.ini
max_execution_time = 300

Php max upload (максимальный размер загрузки в php)

// runtime
ini_set('max_execution_time', 120);

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

Проблема:

На некоторых хостингах ограничение max_execution_time игнорируется (например, в CGI-режиме). Решение - использовать set_time_limit(seconds) внутри скрипта, она не сбрасывается, если время уже истекло.

Как установить лимит на размер загружаемого файла?

Директивы upload_max_filesize и post_max_size управляют максимальным размером файла и общим размером POST-данных соответственно. Обычно post_max_size должен быть больше upload_max_filesize.

; php.ini
upload_max_filesize = 64M
post_max_size = 80M

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

// runtime (но влияет только на последующие запросы)
ini_set('upload_max_filesize', '32M');
ini_set('post_max_size', '40M');

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

Ошибка:

Если post_max_size меньше upload_max_filesize, загрузка файлов будет отклоняться. Также runtime-изменения не действуют на текущий запрос, только на будущие. Используйте .htaccess или user.ini для постоянного эффекта.

Как задать лимиты через .htaccess (Apache)?

При использовании модуля mod_php можно установить директивы через php_value и php_admin_value в .htaccess.

# .htaccess в корне сайта
php_value memory_limit 128M
php_value max_execution_time 60
php_value upload_max_filesize 50M
php_value post_max_size 70M

Ограничения:

php_value работает только для директив класса PHP_INI_ALL и PHP_INI_PERDIR. PHP_INI_SYSTEM не поддерживается. На некоторых хостингах директивы могут быть заблокированы.

Как настроить лимиты через user.ini (PHP-FPM или CGI/FastCGI)?

Файл .user.ini (имя настраивается) автоматически подгружается PHP в каталоге скрипта.

; .user.ini в той же папке, что и index.php
memory_limit = 256M
max_execution_time = 120
upload_max_filesize = 32M

Важно:

Изменения вступают в силу только для файлов, находящихся в том же или вложенных каталогах (если не переопределены). Необходимо перезагружать PHP-FPM, если задействован opcache.

Как установить лимиты в конфигурации PHP-FPM pool?

В файлах pool.d/*.conf (например, www.conf) можно задать php_admin_value для директив.

; /etc/php/8.2/fpm/pool.d/www.conf
php_admin_value[memory_limit] = 512M
php_admin_value[max_execution_time] = 180

Замечание:

php_admin_value имеет более высокий приоритет, чем .user.ini и ini_set(), и не может быть переопределён в runtime. Если требуется временное исключение, используйте php_value (без admin).

Как ограничить количество одновременных подключений или запущенных процессов?

PHP-FPM pool имеет параметры pm.max_children, pm.start_servers и др. Это не директивы PHP, а настройки пула.

; /etc/php/8.2/fpm/pool.d/www.conf
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35

Типичная ошибка:

Слишком малое значение max_children вызывает отказ в обслуживании при пиковых нагрузках. При слишком большом - исчерпание памяти на сервере.

Расширенные примеры настройки лимитов

Пример 1. Динамическое изменение memory_limit в зависимости от задачи

Пример
<?
// Устанавливаем память только для обработки большого файла
$originalMemory = ini_get('memory_limit');
ini_set('memory_limit', '1024M');
echo "Память увеличена до " . ini_get('memory_limit') . "\n";
// Симуляция обработки
$bigArray = range(0, 200000);
echo "Массив создан, использование: " . round(memory_get_usage()/1024/1024, 2) . " MB\n";
// Возвращаем исходное значение
ini_set('memory_limit', $originalMemory);
echo "Память восстановлена до " . ini_get('memory_limit') . "\n";
?>
Память увеличена до 1024M
Массив создан, использование: 15.26 MB
Память восстановлена до 128M

Пример 2. Установка лимита времени выполнения с гибкой обработкой

Пример
<?
// Устанавливаем время работы 5 секунд
set_time_limit(5);
$start = time();
$counter = 0;
while (true) {
    $counter++;
    if (time() - $start >= 4) {
        echo "Прошло 4 секунды, завершаем цикл\n";
        break;
    }
}
echo "Количество итераций: $counter\n";
?>
Прошло 4 секунды, завершаем цикл
Количество итераций: 12534

Пример 3. Проверка и логирование превышения лимита памяти

Пример
<?
$limit = ini_get('memory_limit');
echo "Текущий лимит памяти: $limit\n";
// Зарезервируем почти весь лимит (90%)
$use = (int)$limit * 0.9;
ini_set('memory_limit', $use . 'M');
echo "Лимит памяти установлен в $use M\n";
// Работа с памятью
$data = str_repeat('A', $use * 1024 * 1024); // может вызвать фатальную ошибку
echo "Успешно загружено " . strlen($data) . " символов\n";
?>
Текущий лимит памяти: 128M
Лимит памяти установлен в 115M
Fatal error: Allowed memory size of 120795955 bytes exhausted (tried to allocate 120795955 bytes) in /var/www/test.php on line 8

Решение проблемы:

Перед операциями с большим потреблением памяти проверяйте доступное через memory_get_usage(true) и уменьшайте объем обрабатываемых данных.

Пример 4. Использование .user.ini для разных каталогов

Создайте файл .user.ini в каталоге /var/www/site/admin/ со следующим содержимым:

Пример
memory_limit = 256M
max_execution_time = 60
upload_max_filesize = 20M

В каталоге /var/www/site/public/ - другой .user.ini:

Пример
memory_limit = 128M
max_execution_time = 30

Настройки применяются автоматически для всех скриптов в этих папках.

Пример 5. Приоритеты директив: практический тест

Пример
<?
// Создаём временный файл php.ini в папке скрипта не сработает
// Но можно проверить приоритет ini_set vs .user.ini
echo "memory_limit в скрипте до изменений: " . ini_get('memory_limit') . "\n";
echo "Результат ini_set: " . ini_set('memory_limit', '64M') . "\n";
echo "memory_limit после ini_set: " . ini_get('memory_limit') . "\n";
?>

Если .user.ini задаёт 128M, то ini_set переопределит его только для текущего запроса (если директива типа PHP_INI_ALL).

Установка лимита в PHP - comments

En
Set limit php (php)