PHPの警告: Input variables exceeded 1000 (max_input_vars) の解決方法

beginner🐘 PHP2026-06-15| PHP 5.3.9以降、Apache、Nginx (PHP-FPM)、または共用サーバー (Linux/Windows) で動作している環境。

Error Message

PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change max_input_vars in php.ini.
#php#max_input_vars#トラブルシューティング#サーバー設定

エラーメッセージ

大量のフォームデータを送信した際にエラーが発生したため、この記事に辿り着いたのではないでしょうか。この警告は通常、管理画面や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程度に抑えておくことで、リソース枯渇攻撃からサーバーを保護できます。

Related Error Notes