CakePHPで10万件程度のマスタから条件検索してリストを作成して、それを加工してデータベースに登録する処理を書いていた時のこと。*1
ある上限を境にして、それ以降のPOSTデータが受け取れなくなった。
途中までは正常に登録できるのに、毎回同じ件数で登録が終わってしまう。
文字列も多かったからもしかしたら送信サイズの問題だろうか?
それともCakePHP側で何か制限がかかっているのか?
色々試行錯誤して調べた結果、PHP5.3.9以降から「max_input_vars」というディレクティブが追加されたそうだ。デフォルトで1000になっており、1000個以上の送信パラメータは削られてしまうらしい。
知らなかったよー。
max_input_varsは「PHP_INI_PERDIR」なのでini_setでは変更できない。
今回はクローズドなシステムだし、.htaccessで対応した。
php_value max_input_vars 100000
一般向けのシステムでこんなパラメータの渡し方はしないと思うけど、もしやるならmax_input_varsは脆弱性につながるみたいだしAjaxで件数を分けて処理するかな。
- メール送信先リストを作成するのにありがちなやつ。今回は違うけど [↩]