Увеличение лимита max_input_vars для приема множества переменных

Раздел: Администрирование PHP -> Настройки PHP

Настройка максимального количества переменных в PHP (max_input_vars)

Директива max_input_vars определяет лимит принимаемых PHP переменных из запросов (GET, POST, Cookie). Превышение приводит к отбрасыванию части данных и появлению предупреждения. Ниже рассмотрены способы изменения этого параметра и сопутствующие нюансы.

Как увеличить лимит через php.ini (наиболее стабильный метод)?

Редактирование главного конфигурационного файла PHP гарантирует применение значения для всех запросов на сервере.

; В файле php.ini найти или добавить строку:
max_input_vars = 3000

Php open basedir (директива open_basedir в php)

  1. Откройте php.ini (расположение: php --ini в командной строке).
  2. Установите нужное значение (например, 3000).
  3. Перезапустите веб-сервер (Apache, Nginx) или PHP-FPM.

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

После изменения значения переменные всё равно отбрасываются. Решение - проверить, какой именно php.ini загружается (используйте phpinfo()). Иногда директиву блокирует опция PHP_INI_PERDIR - изменение разрешено только в php.ini, .htaccess или .user.ini, но не через ini_set().

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

Если нет доступа к php.ini, можно задать параметр для конкретной директории.

# В корневой .htaccess или в папке с приложением:
php_value max_input_vars 5000

Php max vars (максимальное количество переменных в php (max_input_vars))

Проверьте, что модуль mod_php активен. .htaccess влияет только на текущую папку и подпапки.

Если директива не срабатывает - сервер может использовать FastCGI (PHP-FPM). Тогда .htaccess игнорируется. В таком случае применяется .user.ini.

Как задать значение через .user.ini (для PHP-FPM)?

Файл .user.ini размещается в корне приложения и перечитывается при каждом запросе.

; .user.ini в директории public_html:
max_input_vars = 4000

Php max execution (максимальное время выполнения скрипта в php (max_execution_time))

Обязательно наличие директивы user_ini.filename в основном php.ini (по умолчанию .user.ini).

Проблема: значение применяется только для скриптов, находящихся в той же или вложенной директории. Убедитесь, что .user.ini расположен в корне сайта.

Можно ли изменить лимит прямо в скрипте через ini_set()?

Нет, max_input_vars относится к директивам типа PHP_INI_PERDIR (может быть установлен только в php.ini, .htaccess или .user.ini). Вызов ini_set('max_input_vars', 2000) внутри скрипта не повлияет на уже принятые переменные.

// Попытка изменить после запуска - бесполезна:
ini_set('max_input_vars', 5000);

Разработчики часто ошибочно полагают, что ini_set сработает. На самом деле переменные уже обработаны до выполнения скрипта. Используйте только конфигурационные файлы.

Как проверить текущее значение max_input_vars?

Вызовите phpinfo() и найдите строку max_input_vars в разделе Core. Либо выполните команду:

php -r "echo ini_get('max_input_vars');"
1000

Расширенные примеры работы с max_input_vars

1. Определение превышения лимита и логирование

Когда количество переменных превышает max_input_vars, PHP записывает предупреждение в лог. Пример скрипта для имитации ситуации:

Пример

<?php
// Генерируем 2000 GET-параметров
$params = [];
for ($i = 0; $i < 2000; $i++) {
    $params["var$i"] = $i;
}
$query = http_build_query($params);
// Делаем запрос самому себе
$ch = curl_init("http://example.com/test.php?$query");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo "Получено GET-переменных: ", count($_GET);
?>
Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.
Получено GET-переменных: 1000

2. Настройка через Nginx с PHP-FPM

При использовании Nginx и PHP-FPM директива задаётся в php.ini (пул) или через .user.ini. Пример конфигурации пула:

Пример

; /etc/php/8.2/fpm/pool.d/www.conf
php_admin_value[max_input_vars] = 5000

После изменения перезапустите PHP-FPM: sudo systemctl restart php8.2-fpm.

3. Использование в Symfony/Laravel (оптимизация форм)

Фреймворки часто генерируют много скрытых полей. Пример увеличения лимита в .env (для Laravel):

Пример

# .env (не влияет напрямую, нужно менять php.ini или .user.ini)
PHP_INI_SCAN_DIR=/etc/php/8.2/cli/conf.d

Лучше создать файл config/php.ini внутри проекта и подключить через директиву веб-сервера.

4. Мониторинг использования переменных

Скрипт, который показывает текущий лимит и количество пришедших переменных:

Пример

<?php
$limit = ini_get('max_input_vars');
$actual = count($_GET) + count($_POST) + count($_COOKIE);
echo "Лимит: $limit, количество принятых: $actual";
if ($actual >= $limit) {
    echo " (возможно, часть данных потеряна)";
}
?>
Лимит: 1000, количество принятых: 1500 (возможно, часть данных потеряна)

5. Изменение через дополнительные ini-файлы

Можно создать отдельный файл /etc/php/8.2/mods-available/custom-vars.ini и включить его:

Пример

; custom-vars.ini
max_input_vars = 2000
# Активировать:
phpenmod custom-vars
systemctl restart php8.2-fpm

Такой подход удобен для модульного управления настройками.

Максимальное количество переменных в PHP (max_input_vars) - comments

En
Php max vars (php)