pukiwiki を PHP 5.4 に対応させる方法 (1)

FreeBSD

Seichanです.こんばんわ.
サーバの移行に伴い,PHP のバージョンが 5.3 から 5.4 に上がったのですが,それが原因で pukiwiki が真っ白に…
最新版の 1.4.7 でも対応出来ていなく,みんな個別に修正しているようです.

いっその事,他の wiki に移行しようかなぁ.なんて思ったのですが,他のものは高機能すぎたり,機能がたらなすぎたりなんかしっくりきそうな物がありませんでした.
pukiwiki の派生版として PukiWiki Plus! というのも見つけたのですが,これも PHP5.4 には未対応でした.
Pukiwiki Advance というものは PHP5.3 以降に対応.という事でこれは良いかも? と思ったのですが設置が微妙にめんどくさいなぁ… と.

という事で,Pukiwiki 1.4.7 の UTF-8 版を PHP5.4 に対応させることにしたのです.
# と言っても,あんまり大きな変更は無いのですけどね.

1. エラーをちゃんと表示させる
Pukiwiki のデフォルト状態だと index.php のエラーレポート設定は下の通りになっています.

error_reporting(E_ERROR | E_PARSE);

これを下の通り,全部表示させます.

error_reporting(E_ALL);

2. Fatal error の hex2bin をやっつける
エラーレポートを E_ALL にした後にアクセスしてみるとこんなエラー表示が出てきます.

Fatal error: Cannot redeclare hex2bin() in /home/seichan/public_html/wiki/lib/func.php on line 317

PHP5.4 で hex2bin が組み込み関数になってしまい,Pukiwiki に収録されている関数とバッティングしてしまった事が原因です.Pukiwiki の hex2bin は PHP5.4 標準の物で問題なさそうなのでまるごとコメントアウトします.
lib/func.php の 311行 から 317行をまるごとコメントアウトします.該当箇所は下の通り.

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;
}

3. Fatal error の Call-time pass-by-reference をやっつける
#ls2 を使用するコンテンツへアクセスすると以下のようなエラーが表示されます.

Fatal error: Call-time pass-by-reference has been removed in /home/seichan/public_html/wiki/plugin/ls2.inc.php on line 69

PHP5.4 で関数への参照渡しが出来なくなったため has been removed と表示されてストップしてしまいます.
これは参照渡しではなく値渡しに変更することで対応出来ます.

plugin/ls2.inc.php function plugin_ls2_convert() の

array_walk($args, 'plugin_ls2_check_arg', & $params);

を以下のように & を取り去り値渡しに変更します.

array_walk($args, 'plugin_ls2_check_arg', $params);

4. Deprecated: Assigning the return value of new by reference is deprecated in 淡々とやっつける
new 演算の戻り値は = で参照渡しになるのに,さらに =& で参照渡しで受け取ろうとすると Deprecated と怒られます.この箇所は error_reporting をデフォルトの状態にすることで抑制出来る箇所ではあるのですが…
直しておくにこしたことはありません.

lib/func.php の function get_autolink_pattern の場合

$config = &new Config('AutoLink');

を以下のように & を取り去ります.

$config = new Config('AutoLink');

こんなのが以下の個所で存在していますので,全ての & を取り去ります.

lib/func.php function get_autolink_pattern(& $pages)
  $config = &new Config('AutoLink');

lib/config.php function read()
  $obj = & new ConfigTable('');
  $obj = & new ConfigTable($line);
  $obj = & new ConfigTable_Direct('', $obj);
  $obj = & new ConfigTable_Sequential('', $obj);

lib/config.php function & get_object($title)
  $this->objs[$title] = & new ConfigTable('*' . trim($title) . "\n");

lib/convert_html.php function convert_html($lines)
  $body = & new Body(++$contents_id);

lib/convert_html.php function & toPara($class = '')
  $obj = & new Paragraph('', $class);

lib/convert_html.php function Table
  $row[] = & new TableCell($cell, $is_template);

lib/convert_html.php function Body($id)
  $this->contents      = & new Element();

lib/link.php function & links_get_objects($page, $refresh = FALSE)
  $obj = & new InlineConverter(NULL, array('note'));

plugin/attach.inc.php function plugin_attach_convert()
  $obj  = & new AttachPages($page);

plugin/attach.inc.php function attach_filelist()
  $obj = & new AttachPages($page, 0);

plugin/attach.inc.php function attach_upload($file, $page, $pass = NULL)
  $obj = & new AttachFile($page, $file['name']);

plugin/attach.inc.php function attach_info($err = '')
  $obj = & new AttachFile($refer, $file, $age);

plugin/attach.inc.php function attach_delete()
  $obj = & new AttachFile($refer, $file, $age);

plugin/attach.inc.php function attach_freeze($freeze)
  $obj = & new AttachFile($refer, $file, $age);

plugin/attach.inc.php function attach_rename()
  $obj = & new AttachFile($refer, $file, $age);

plugin/attach.inc.php function attach_open()
  $obj = & new AttachFile($refer, $file, $age);

plugin/attach.inc.php function attach_list()
  $obj = & new AttachPages($refer);

plugin/attach.inc.php function add($file, $age)
  $this->files[$file][$age] = & new AttachFile($this->page, $file, $age);

plugin/attach.inc.php function AttachPages($page = '', $age = NULL)
  $this->pages[$_page] = & new AttachFiles($_page);

と,今日はここまで…

コメント

タイトルとURLをコピーしました