なおすけの落書き帳

毎日がエブリデイ。

PHP5.3系の上で動くPukiWiki1.4.7をアップデートしてPHP5.6系に移すまで

はじめに

こんにちは。なおすけです。たかまつちほーは先日梅雨入りしましたが、梅雨入り当日以外はほぼ雨が降っていません。
今日はそのジメジメ気分をふっとばすPHPについてです。
と言っても、PukiWikiをゴニョゴニョしていたので軽めです。

PukiWiki とは

PukiWikiは、自由にページを編集できるツール(CMS:コンテンツ管理システム)です。

だそうです。

FrontPage - PukiWiki-official

2006年リリースの1.4.7で更新が止まってたけど、2014年に突如1.5.0がリリースされたことでニュースになりました。
現行バージョンは2016年リリースの1.5.1です。

もともとPukiWikiを動かしていたサーバの状態

某社某サービスのレンタルサーバを利用していました。
PHP5.3 で、FastCGIで動作していました。

ちなみに、利用していたPukiWikiは1.4.7でした。

これが突然PHP7.0にアップデートしたもんだから色々と悲しいことが起こったというお話です。

どうしたか

  • ひとまず本番サーバをメンテ状態に
  • 身代わりサーバとして自分のサーバにPukiWikiのみを移動
  • ひとまず公開し、本番サーバでPHP7化対応 (予定)

原因のPHPコード

PukiWikiソースコードがPHP5.4以降で動かない理由は、大きく2点でした

  • PukiWikiで独自定義している hex2bin 関数が、PHP5.4以降で実装された標準関数 hex2bin と衝突する
  • PHPのリファレンス渡しが廃止となり、PukiWikiの実装内部のいろいろが動かなくなる

解決策

まず提示さているパッチを当てる

公式が提供しているパッチを当てればいいだけかと最初は思いました。
というわけでパッチをダウンロードして当ててみました。

$ cd path/to/old/pukiwiki/root
$ patch -p1 < ../update_pukiwiki_147to150_eucjp.patch

で、ブラウザで確認すると…まあ大いに文字化けをしていました。なんでやねん。
自分のサーバの設定がだめなのかと思い、nginxやfastcgiの設定をいじりましたが直りません。なんでやねん。
2時間くらい格闘したけどだめだったので、この方法は断念。

最新版のソースコードをDLしてきて、過去の記事情報なんかを流し込み

仕方がないので、PukiWiki1.5.1をダウンロードしてきて、1.4.7のデータから wiki/ 以下に記事ファイルを流し込む作戦に変更。

$ cd path/to/new/pukiwiki/
$ cp path/to/old/pukiwiki/wiki/* wiki/

これで記事データは問題なく転送成功。 その後、諸々の設定ファイルなんかを流し込み。

$ cp old/pukiwiki/pukiwiki.ini.php ./
$ cp -r old/pukiwiki/skin/* ./skin/

画面が真っ白になったら、 index.php を以下のように編集してエラー箇所を確認するなど。

<?php
// ここを追加
ini_set( 'display_errors', 1 );
error_reporting(E_ALL); // Debug purpose
// ここまで

// PukiWiki - Yet another WikiWikiWeb clone.
// $Id: index.php,v 1.9 2006/05/13 07:39:49 henoheno Exp $
// Copyright (C) 2001-2006 PukiWiki Developers Team
// License: GPL v2 or (at your option) any later version

// Error reporting
//error_reporting(0); // Nothing <- ここを消して
//error_reporting(E_ERROR | E_PARSE); // Avoid E_WARNING, E_NOTICE, etc 
//error_reporting(E_ALL); // Debug purpose

// Special
//define('PKWK_READONLY',  1);
//define('PKWK_SAFE_MODE', 1);
//define('PKWK_OPTIMISE',  1);
//define('TDIARY_THEME',   'digital_gadgets');

// Directory definition
// (Ended with a slash like '../path/to/pkwk/', or '')
define('DATA_HOME', '');
define('LIB_DIR',   'lib/');

require(LIB_DIR . 'pukiwiki.php');
?>

でわちゃわちゃしてると動きました。

まとめ

無事、PHP5.6でも正しく動くようになりました。
というか、これこのままPHP7になった本番サーバに乗っけても動くのではと思います。
あとは、本番サーバで動く他のPHPアプリケーションを修正しないとなというところです。