エラーメッセージ
大量のフォームデータを送信した際にエラーが発生したため、この記事に辿り着いたのではないでしょうか。この警告は通常、管理画面やECサイトのチェックアウトなどで、一度に数百のフィールドを処理しようとした時に表示されます。
PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.
警告の原因は?
PHPはバージョン5.3.9でmax_input_varsディレクティブを導入しました。これは、ハッシュ衝突によるサービス拒否(DoS)攻撃に対するセキュリティガードとして機能します。この設定は、1回のリクエストで処理できる入力変数(GET、POST、COOKIEの合計)の数を制限するものです。
デフォルトの制限値は1000です。例えば、1行に6つの入力項目(価格、SKU、在庫数など)がある200行の商品一覧を想像してください。これだけで1,200個の変数になり、制限を即座に超えてしまいます。この制限に達すると、PHPは超過したデータを黙って破棄します。フロントエンドでクラッシュすることはありませんが、データベースには「一部のデータが保存されない」あるいは「情報が欠落する」という結果を招きます。
ステップバイステップの解決方法
サーバーのアクセス権限に合わせて、制限値を増やすための最適な方法を選択してください。
方法1: php.iniを編集する (グローバルアクセス)
自分でサーバーを管理している場合、これが最もクリーンな解決策です。
php.iniファイルを見つけます。場所が不明な場合は、ターミナルでphp -i | grep "Loaded Configuration File"を実行してください。max_input_varsを検索します。行の先頭にセミコロン (;) がある場合は、それを削除してコメントアウトを解除します。- 値を 3000 または 5000 に増やします。
max_input_vars = 3000
- 保存後、変更を反映させるためにサービスを再起動します。
# Apacheの場合
sudo systemctl restart apache2
# Nginx + PHP-FPMの場合
sudo systemctl restart php8.2-fpm
方法2: .htaccessを編集する (Apache)
メインの設定を変更できない共用サーバーでは、プロジェクトのルートにある.htaccessファイルを使用します。以下の行を追加してください。
php_value max_input_vars 3000
注意: この方法は、サーバーがPHPをApacheモジュール (mod_php) として実行している場合にのみ機能します。
方法3: .user.iniを編集する (CGI/FastCGI)
Nginxを使用している最近のホスティング環境では、.user.iniファイルをサポートしていることが多いです。公開ルートディレクトリにファイルを作成し、以下を追加します。
max_input_vars = 3000
方法4: PHP-FPMのプール設定を編集する (Nginx)
NginxでPHP-FPMを使用している場合、特定のプール(例: /etc/php/8.2/fpm/pool.d/www.conf)に限定して変更を適用できます。これはマルチテナントサーバーに最適です。以下を追加してください。
php_admin_value[max_input_vars] = 3000
保存後、PHP-FPMを再起動します。
修正を確認する
正しく設定されたか、思い込みで判断せず確認しましょう。ウェブのルートディレクトリに一時的な info.php ファイルを作成して、新しい制限値を確認します。
<?php phpinfo(); ?>
yourdomain.com/info.php にアクセスし、max_input_vars を検索します。「Local Value」が新しい値になっていることを確認してください。セキュリティ漏洩を防ぐため、確認後はすぐにこのファイルを削除してください。
予防策とベストプラクティス
制限値を増やすことで症状は解決しますが、長期的な観点から以下の調整も検討してください。
- UIの監査: ユーザーは本当に1つの画面で500行を編集する必要がありますか?ページネーションを導入するか、フォームを複数のステップに分割することを検討してください。
- JSONを使用する: 複雑なデータの場合は、AJAX経由で単一のJSON文字列を送信します。ペイロード全体が1つの変数としてカウントされるため、変数の数による制限を完全に回避できます。
- 構文を確認する:
php.iniのわずかなタイポがサーバーエラーの原因になります。複雑な設定を管理する場合、私は YAML ↔ JSON コンバーター のようなツールを使用して、本番環境にデプロイする前にデータ構造を検証しています。 - セキュリティのバランス: 理由もなく制限を100,000などに設定しないでください。3,000〜5,000程度に抑えておくことで、リソース枯渇攻撃からサーバーを保護できます。

