この記事を三行にまとめると
修造式PHP道場、始まるぞ!限界を……超えろォォォッ!!
PHP5.3.9以前でも有効な気が……
修造式と言いつつも、こんな暖かい春の陽気に誘われながら終始テンションマックスな状態で臨むことは難しいので、普通のテンションで行きます。
ぶっちゃけ、つい最近まで全く知らなかったんですけど、PHPでデータをPOSTするとき、その入力数には限界があったんですね。今日はそれを知らずにいたおかげで、ちょいと足下を掬われることになったという、そんなお話。
たいした話じゃないからさらっと行くぞ。覚悟してけー。
データを送信するとき、name属性にどんな値を入れるかにもよりますけど、とりあえず$_POSTにはデータが配列で入りますよね。
例えば、以下のようなテキストボックスがあったとして、データを送信POSTしてみましょう。
この場合、入力数は「3」です。テキストボックスが3つあるから。
これが例えば、チェックボックスが10個、テキストボックスが10個あれば、入力数は20になります。
この入力数というやつに、実は上限設定があったらしいんです。
根っこですよ、これ全部。サーバーで動いているシステムを根幹で支えている、PHPの設定です。phpinfo()で確認できます。
注目してほしいのは赤い枠を囲ったとこ。「max_input_vars」って書いてあって、数値が1000となってますね。
どうやらこれが、入力数の上限を決めているらしいんですよ。つまりこの場合、一回のデータ送信で、例えばチェックボックスの値を1500個くらいPOSTしようと思ったら、エラーになっちゃうってことです。
エラーになるとは言っても、そこでシステムが止まってしまうってわけではなくて、上限数までのデータが送信されて、残りはカットされちゃうような感じです。だから例えば、max_input_varsが1000の状態で、1500個の入力値を送信したら、1000個分は$_POSTに入ってるわけですね。残りの500個は送信されない。
このmax_input_varsはPHP_INI_PERDIRというやつでして……えーと、まあ簡単に言うと、.htaccessとかphp.iniとかで設定できる値ってことですね。ini_set()では設定できない。
なので、たぶんデフォルトは1000になってると思うんですけど、もしそれよりも上限数を増やしたい場合は、.htaccessとかphp.iniとかで設定する。
上記の場合、入力数が5000まではいけるようになります。
メモリの問題とかもあると思うから、あまり大きな数にはしない方が良いと思うんですけど……普通はどれくらいまでなら、いっちゃっても良いんすかね?
些細な話ではあるんですが、でもこれを知らないと、$_POSTにデータが入ってないのは何でだぜっていう原因が分からなくて、何か別のところでバグがあるのかもしれないとか思って、無駄な時間を費やしちゃうことがありますからね。あの地球人(俺)のように。
ただ、PHPのマニュアルを見ると、このmax_input_varsってやつはPHPのバージョンが5.3.9以降で有効みたいなことが書いてあるんですけど、5.3.3でも明らかに有効っぽいのは何でだぜ?
ぶっちゃけ、つい最近まで全く知らなかったんですけど、PHPでデータをPOSTするとき、その入力数には限界があったんですね。今日はそれを知らずにいたおかげで、ちょいと足下を掬われることになったという、そんなお話。
たいした話じゃないからさらっと行くぞ。覚悟してけー。
入力数について
入力数ってのは、何て言ったら良いですかね……テキストボックスとかラジオボタンとか、そういう入力要素の合計数というか、$_POSTにおける配列の要素数というか、何かそんな感じです。データを送信するとき、name属性にどんな値を入れるかにもよりますけど、とりあえず$_POSTにはデータが配列で入りますよね。
例えば、以下のようなテキストボックスがあったとして、データを送信POSTしてみましょう。
//HTML
<input type="text" name="text1" value="data1" />
<input type="text" name="text2" value="data2" />
<input type="text" name="text3" value="data3" />
//$_POSTの中身
Array
(
[text1] => data1
[text2] => data2
[text3] => data3
)
この場合、入力数は「3」です。テキストボックスが3つあるから。
これが例えば、チェックボックスが10個、テキストボックスが10個あれば、入力数は20になります。
この入力数というやつに、実は上限設定があったらしいんです。
max_input_varsについて
これ見て下さいよ。根っこですよ、これ全部。サーバーで動いているシステムを根幹で支えている、PHPの設定です。phpinfo()で確認できます。
注目してほしいのは赤い枠を囲ったとこ。「max_input_vars」って書いてあって、数値が1000となってますね。
どうやらこれが、入力数の上限を決めているらしいんですよ。つまりこの場合、一回のデータ送信で、例えばチェックボックスの値を1500個くらいPOSTしようと思ったら、エラーになっちゃうってことです。
エラーになるとは言っても、そこでシステムが止まってしまうってわけではなくて、上限数までのデータが送信されて、残りはカットされちゃうような感じです。だから例えば、max_input_varsが1000の状態で、1500個の入力値を送信したら、1000個分は$_POSTに入ってるわけですね。残りの500個は送信されない。
限界を超えたいなら
限界を超えるのは簡単です。大丈夫やれる絶対できる。だから慌てず積極的にポジティブに向き合いましょう。このmax_input_varsはPHP_INI_PERDIRというやつでして……えーと、まあ簡単に言うと、.htaccessとかphp.iniとかで設定できる値ってことですね。ini_set()では設定できない。
なので、たぶんデフォルトは1000になってると思うんですけど、もしそれよりも上限数を増やしたい場合は、.htaccessとかphp.iniとかで設定する。
//.htaccess
php_value max_input_vars 5000
//php.ini
max_input_vars = 5000
上記の場合、入力数が5000まではいけるようになります。
メモリの問題とかもあると思うから、あまり大きな数にはしない方が良いと思うんですけど……普通はどれくらいまでなら、いっちゃっても良いんすかね?
些細な話ではあるんですが、でもこれを知らないと、$_POSTにデータが入ってないのは何でだぜっていう原因が分からなくて、何か別のところでバグがあるのかもしれないとか思って、無駄な時間を費やしちゃうことがありますからね。あの地球人(俺)のように。
ただ、PHPのマニュアルを見ると、このmax_input_varsってやつはPHPのバージョンが5.3.9以降で有効みたいなことが書いてあるんですけど、5.3.3でも明らかに有効っぽいのは何でだぜ?