Установка значений лимитов в PHP: подробная инструкция
Настройка ограничений ресурсов в PHP
Основное решение: изменение директив в php.ini или использование функции ini_set()
Наиболее эффективный способ установить лимиты в PHP - это редактирование основного конфигурационного файла php.ini. Для временного изменения в рамках скрипта применяется функция ini_set(). Ниже приведены ключевые директивы и примеры.
Как изменить максимальный объём памяти, выделяемый скрипту?
Директива memory_limit задаётся в байтах, килобайтах (K), мегабайтах (M) или гигабайтах (G).
; php.ini
memory_limit = 256MPhp 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).