先日、保守契約しているある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 に変更となっております。」との回答。
どうもこの変更が今回のトラブルのトリガーとなったようです。
ちなみにこの通知はクライアントへはメールで事前に通知されていたとのこと。
ということで、色々とありましたが、無事解決となりました。
めでたしめでたし。