phpのバージョンを5.3.28にバージョンアップした際、リクエストのpostデータが消えてしまう事象が発生

先日、保守契約しているあるcakePHPで作られたWEBシステムで、問い合わせがあり、あるデータが更新できなくなっているとの問い合わせがありました。

既にリリースされてから1年以上立っていたため、何が原因だろうと調べていたのだけれど、当初はさっぱり理由がわかりませんでした。
全てのデータが更新出来ないわけではなく、その問い合わせがあった1件のデータだけが更新できなくなっていました。
で、サーバ側の処理にデバックを入れて原因を探ってみると、なんと、そのデータのリクエストパラメータが空になっているではありませんか。

このシステムは一般的なWEBシステムでformのpostでリクエストパラメータをサーバ側に渡しているのですが、
サーバ側で渡ってくるpostパラメータを調べてみると、なんと空っぽ。。。謎は深まるばかりです。

ということで、ローカル開発環境に同様のデータをリストアし、再現してみることに。
しかし、ローカル環境では再現せず、ちゃんとリクエストが渡ってきました。

ということで、この時点で、おそらくサーバ側の環境の問題だろうということが推測できます。

続いて、サーバ側のphpのバージョンを調べて見ると5.3.28 。ほほう。
そしてローカル側は5.3.27 微妙に異なっています。

つづいて、php側php.iniの設定を確認、該当しそうなpost_max_sizeやmemory_limitなどを調べてみましたが、どちらも十分な値に設定されていて問題なさそうです。

色々と他の設定も調べてみたのですが、どうにも原因がつかめません。
ということで、原因究明とは別に、とりあえず対処方法を検討することに。。

まずリクエストが空になってしまうデータと正常に処理されるデータを比較すると、
空になってしまうデータは大量の入力パラメータデータがあることが分かりました。

そこで、画像ファイルなどアップロードする際にformで使うenctype=multipart/form-dataに設定してみると。。
なんと、先ほどまで空だったpostパラメータがうまく渡ってくるようになりました。
なんとか、これで謎な現象は回避できそうなのですが、もう一つ問題が。。。



それは、リクエストパラメータが届くようになったのですが、途中で切れている状態でした。
で、この現象はローカル環境でも同様の現象だったので、別の原因だと思われます。

ということで、色々と調べてみるとphp.iniのmax_input_varsの設定が入力パラメータの数を制限していることがわかりました。
ということで、max_input_varsの値を1000から10000に変更してみると。。。
ビンゴです。ようやくうまく処理されました。

そこで、postした入力パラメータが空になってしまう場合、
formのenctype属性にmultipart/form-dataを追加

入力パラメータが途中で切れてしまう場合、
php.iniのmax_input_varsの値を変更するということで解決できそうです。


で、最後にもう一つ最大の謎が残されているのですが、問題のデータは、つい先日までは、ちゃんと更新ができていて
ある日から突然、更新出来なくなってしまいました。

その間にプログラムの修正などは行っていなかった為、原因がさっぱりわからなかったのですが、
念のため、サーバ会社にapacheやphpの設定を変更したりしていないか確認すると、
「PHP5.3.13 から PHP5.3.28 に変更となっております。」との回答。
どうもこの変更が今回のトラブルのトリガーとなったようです。
ちなみにこの通知はクライアントへはメールで事前に通知されていたとのこと。

ということで、色々とありましたが、無事解決となりました。
めでたしめでたし。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です