pukiwikiのPHP 5.4.x対応

巷では、PHP 5.3.x→5.4.xの移行はスムーズだと聞いていたが実際はやはりそういうわけではなかったという話。
pukiwikiがそのままだと500エラーになります。

解決方法は大きく2つあって、

  • pukiwikiのソース修正
  • PHP 5.3系にダウングレード

のどちらかになると思います。

ダウングレードは最終手段にしたかったので、今回は1つ目の方で対応。
※実際に作業する前にバックアップは必ずとりましょう

まず500エラーになる件については、
PHP 5.4から組み込み関数として追加されたhex2bin()が、pukiwikiでユーザ関数として作られたhex2bin()と衝突してるのが問題なので、以下のようにして対応。

lib/func.php l:310
[php] // Inversion of bin2hex()
function hex2bin($hex_string)
{
// preg_match : Avoid warning : pack(): Type H: illegal hex digit …
// (string) : Always treat as string (not int etc). See BugTrack2/31
return preg_match(‘/^[0-9a-f]+$/i’, $hex_string) ?
pack(‘H*’, (string)$hex_string) : $hex_string;
}
[/php]

これを、

[php] // Inversion of bin2hex()
if (!function_exists(‘hex2bin’)) {
function hex2bin($hex_string)
{
// preg_match : Avoid warning : pack(): Type H: illegal hex digit …
// (string) : Always treat as string (not int etc). See BugTrack2/31
return preg_match(‘/^[0-9a-f]+$/i’, $hex_string) ?
pack(‘H*’, (string)$hex_string) : $hex_string;
}
}
[/php]

これで大体のpukiwikiは正常に動くようになったのですが、一部で日本語が表示されない現象が発生。
htmlspecialchars()関数が以下のようになったのが原因のようです。

http://www.php.net/manual/ja/migration54.other.php

htmlspecialchars() および htmlentities() のデフォルトの文字セットが ISO-8859-1 から UTF-8 に変わりました。出力文字セットを default_charset で変更しても、htmlspecialchars/htmlentities のデフォルトには影響が及ばないことに注意しましょう。 この変更を反映させるには、 htmlspecialchars()/ htmlentities() をコールするときに、エンコーディングとして “” (空文字列) を指定しなければなりません。 ただ、一般にこの方法はおすすめできません。 この方法を使うと、出力文字セットが実行時の設定に依存してしまうからです。 安全策として、 htmlspecialchars() や htmlentities() をコールするときには文字セットを毎回明示するようにしましょう。

対処方法としては、以下に転がってるような関数を
lib/func.php
に追加して、既存のhtmlspecialchars()関数を置き換えると上手くいきました。

https://www.assembla.com/code/pukiwiki/subversion/nodes/67/trunk/wiki-common/lib/func.php
[php] // Sugar with default settings
function htmlsc($string = ”, $flags = ENT_QUOTES, $charset = CONTENT_CHARSET)
{
return htmlspecialchars($string, $flags, $charset); // htmlsc()
}
[/php]

コマンドは手っ取り早くやるなら、

[bash] $ grep -lr –include="*.php" htmlspecialchars ./ | sed -e "s/htmlspecialchars/htmlsc/g" -i
[/bash]

とかでいいんじゃないでしょうか。
(※一応、全置換する前にしちゃいけないのが無いかは気をつけてください。先ほど追加したhtmlsc()関数内のhtmlspecialchars()関数とか。)

今のところは、この対応で上手いこと動いてますが、他にも必要な箇所はあるかもしれません。

今からPHP 5.4.xにpukiwiki載せるのであれば、PHP 5.4対応済みの、

PukiWiki Advance
http://pukiwiki.logue.be/

が良さそうです。

ただ、現状のメンテナンス状況考えると、別のCMSを使うのを選択肢に入れた方がいいかもしれませんね。