今回はニンジャスレイヤーの書籍版の話でもしようかと思いましたが、そういえば、弊社はIT会社だったような気がしたので、たまには技術についての話でもしてみようと思います。
3月にPHP5.4がリリースされました。今回大きな変更が入っていて、5.3以前で動いていたスクリプトが動かなくなる事例が多々出ているようです。メンテナンスされているアプリケーションならばパッチが提供されますが、すでに開発がフリーズされているプロジェクトの場合そうもいきません。例えばpukiwiki。この国産wikiクローンは、2006年を最後にリリースが止まっていますが、その使い勝手の良さから未だ多くのユーザーが存在しています。
さて、このpukiwikiの動くシステムにPHP5.4を適用するとどうなるか?画面が真っ白になってしまいます。
なかなかパンチの効いた不具合で、こんなんもうとっくに騒ぎになってもよさそうなものですが、幸い各ディストリビューションのレポジトリが、PHP5.4の採用に慎重になっているおかげで被害はさほどのものになっていません。これに引っかかっているのは、無自覚にdebianのtestingを使用しているような人たちくらいです。そう私のような。
具体的に、何が原因で動かなくなるのかを挙げてみます。
1.参照渡しの変更
php5.4では以下の構文でエラーが出ます。
array_walk($args, ‘plugin_ls2_check_arg’, & $params);
これを以下のように直してやらなければなりません。
array_walk($args, ‘plugin_ls2_check_arg’, $params);
上記はプラグインには必ず入っているので、使用するプラグインは全部直さなきゃならないです。また、newの参照渡しも引っかかります。
2.hex2bin関数のネイティブ実装
hex2bin関数が内部関数となったため、lib/func.phpに書かれているhex2bin関数とぶつかってしまうようになりました。これはlib/func.phpの関数をコメントアウトする必要があります。
3.htmlspecialchars関数のデフォルトがUTF8に変更
php5.3まで、htmlspecialchars関数の第3引数を指定しない場合、それはlatin1とみなされていましたが、php5.4からはutf-8とみなされるようになりました。結果、htmlspecialchars関数の第3引数を指定していないpukiwikiにおいて、EUC-JP SHIFT_JISのソースは軒並み表示がおかしくなります。EUC-JPで書かれたpukiwkiは結構な数があるので、これも影響大です。なお、UTF-8を使っている場合、この影響は受けません。
他に、lib/init.phpに、date_default_timezone_set(‘Asia/Tokyo’); を追記しないといけないというのがあるらしいのですが、私の環境では出ませんでした。
まとめますと以下のようになります。
UTF-8のpukiwiki
参照渡しと、hex2bin関数の修正が必要となります。
修正方法について書かれたサイトは多々ありますが、それらを実行してなお真っ白になる場合、使用プラグインの参照渡しの修正が行われていない可能性が大きいです。私は、ヘッダだけが表示される状態になり、調べた所MenuBarの中に&onlineというプラグインを使っており、これでエラーが出ていました。
UTF-8以外のpukiwiki
上記に加え、htmlspecialchars関数を使っているソースすべての修正が必要です。非常に対象ファイルが多く骨が折れる作業です。修正ファイル一覧を公開している方もいますが、カスタマイズすることも多いpukiwikiですから、まっさらな状態でない限り、grep -Rで地道に拾って修正していったほうががいいでしょう。
具体的な修正方法については、詳細な説明をしているサイトが多々ありますので、そちらを参考に。php5.4 pukiwki あたりの検索ワードで山ほど出てきます。
(記:社員R)