Wildfly利用にあたって、1回のPOST処理内に含まれる要素数(input の数、といえばよいか?)について古いJBOSSと異なり制約があることを今更知った。
そういえばPHPでも同じような話があったよな、と思い少し調べてみた。
POSTをenctype defaultで実行すると、POSTの実体はGETと同じようにkey1=value&key2=value のような&で区切られたパラメータとして扱われる。
結構前から各処理系においてDoS対策などのためにこの要素数の上限が設定されている。
PHPにおいてはphp.ini内の"max_input_vars"で要素数制限ができる。
defaultは1000。
で、今回のポイント。
JAVAなどで組んでいたシステムではこのパラメータ数を回避する策として、enctypeをmultipart/form-data として、boundaryで区切られているがデータとしては1件として送るような対策を打った。
ところが、PHPの場合はこれが機能しない。
PHPにおいてはPOSTされたデータは $_POST スーパーグローバル変数に格納されるのだが、ご丁寧にmultipart/form-dataの場合でも内容をちゃんと解析して連想配列として納してくれるのだ。
このためmultipartとして1000を超える要素を送っても、PHPで処理をしようとするときにはすでに1000要素まで切り詰められたものしか処理できないということになる。
回避策としては普通にPOSTするのではなくストリームとして処理するようにする必要があるようである。 うーむ。