PHPプログラムを作成中に、
PHP Warning: Unknown: Input variables exceeded 1000. To increase the limit change PHP in php.ini. in Unknown on line 0, referer: http://192.168.19.128/php/rpg/****.php
というエラーが表示され、あまり見たことのないエラーだったので調べてみました。
環境
OS ubuntu22.04
Webサーバ apache2.4.52
PHP 8.1
エラーの原因
エラーの内容は、画面上で使用している変数(アイテム数)がPHPで設定されている変数の上限を超えているから、変数を減らすか、設定を変更しなさいというものでした。
この変数上限は、次の設定ファイルで変更できるそうです。
$ > sudo nano /etc/php/8.1/apache2/php.ini
;max_input_vars=1000
設定ファイルを確認したところ、コメントアウトされているようでしたので、このままの状態で何件まで変数を登録することができるか確認します。
デフォルトで何件登録できるか実験する
次のプログラムを作成し、$iteを増やしながらエラーになる値を調べました。
<html>
<body>
<form action="" method="POST" name="myform">
<button type="submit" name="sb" >send</button><br>
<?PHP
$ite = 998; //ここの値を変える
for($i =1; $i <= $ite; $i++ ){
echo $i;?><input type="text" name="_<?PHP echo $i;?>" value="<?PHP echo $i;?>"><br><?PHP
}
?>
</form>
</html>
私の環境では、
$ite=999 submit 成功
$ite=1000 submit エラー
という結果になりました。
このことから、デフォルトでは1000件未満の変数を受け付ける状態になっているようです。
max_input_varsの値を変更して実験する
次は max_input_vars=100 に減らして実験します。
php.ini内の設定を
;max_input_vars=1000
↓
max_input_vars=100
に修正しました。
apacheを再起動させる前に、$ite=999 でもう一度実験をしたところ、正常にリクエストが送信できていましたので、設定の反映にはapacheの再起動が必要のようです。
次のコマンドで、apacheを再起動させたところ、
$ > sudo service apache2 restart
$ite=99 submit 成功
$ite=100 submit エラー
となり、max_input_varsの変更が反映されていることを確認できました。
また、同じ方法で、max_input_vars=3000 に変更したところ、
$ite=2999 submit 成功
$ite=3000 submit エラー
となることを確認できました。
まとめ
設定ファイルを変更すれば、ある程度大量の変数を受け渡しすることができることがわかりました。
しかし、リクエストの都度、数千もの変数を受け渡しするのはトラフィックとリソースの無駄使いですね。
今回、私は画面上に大量のselectboxを配置しようとしてこのエラーにたどり着きました。
もう一度プログラム設計を行い、大量のリクエストを送受信しない方式に修正したいと思います。