DIMENSION 2.00

/ Nexus / Mac / Ubuntu / カメラ / beatmania / 猫 / 株 / 情報蒐集 /

PukiWikiでページが真っ白になる事案が発生 → 解決

VPSをServersManからさくらVPSに移行したので、PukiWikiを移行したら、さあ大変。
アクセスしてもページが真っ白で何も表示されず。
今までパーミッションの設定をミスってエラー出たことはあったけど、何も表示されないのは初めて。
以前のVPSから変わった点と言えば、Debianのバージョンが6から7になったくらいなんだが……

このまま放置はできないので、ググってみると出てくる出てくる。
原因としてはPHP 5.4に完全対応してないことhex2bin()が組み込み関数になり、lib/func.phpの実装とぶつかってしまっているのが原因とのこと。

アクセスしても真っ白なページから正常に表示されるまでの戦いの記録をここに記す。


エラーメッセージを確認

エラーが出ないことには原因の予想も付かないので、エラーモードをオンにしてみる。
php.ini の display_errors = On にしても、エラーが出なかったので、PukiWikiのエラーモードをオンにする。
pukiwiki の index.php の以下の部分をコメント解除(全ての作業が完了したら再びコメントアウトすることを忘れない)

//error_reporting(E_ALL); // Debug purpose
↓
error_reporting(E_ALL); // Debug purpose

この状態でトップページにアクセスするとエラーが表示される。

Fatal error: Cannot redeclare hex2bin() in /var/www/wiki/lib/func.php on line 317

先ほど述べたように、hex2bin()が何やらエラーを出してることが分かる。
原因と解決方法は以下のページで言及されている。
BugTrack2/349 - PukiWiki-dev


問題箇所の修正

修正箇所が結構あるので、下記のページから pukiwiki-1.4.7_notb_utf8-PHP5.4_debug.zip をダウンロードし、lib/の5つのファイルを置き換えるのが手っ取り早い。
PukiWiki - プログラミング探して!

これにて解決のはずだが……


コンテンツの日本語がスッポリ抜け落ちてる!!

トップページこそ表示されるようになったものの、日本語が表示されない……

これはEUC-JP版のみ発生する問題らしい。
htmlspecialchars() の第3引数に ’EUC-JP’ を明示的に指定すれば直るとのことだが、修正箇所が膨大過ぎる!

EUC-JPであることに拘りは無いし、時代の流れを考えるとEUC-JP版を捨て、UTF-8版に移行するほうが懸命。


UTF-8版への移行

既存データをUTF-8に変換

ツールを使ってEUC-JPなデータをUTF-8に変換させる
EUC-JPからUTF-8への移行について - PukiWiki Plus!

上記のページから plus-i18n-rev1726.tar.gz をダウンロードして展開。
tools/ 内の2つのファイルに用がある。

  • data2utf8.php.txt
  • conv_ts.php.txt

この2つを、現在のpukiwikiフォルダにコピーする。


data2utf8.php.txt 内の DATA_HOMEの指定をする(conv_ts.phpも一緒)
今回は本番環境からコピーしてきたpukiwiki内で実行後、UTF-8な環境にして本番環境に戻した。
設定としてはこんな感じ。

define('DATA_HOME', '/home/esf/tmp/pukiwiki/');

リネームしてから実行してみる。

$ mv data2utf8.php.txt data2utf8.php
$ php -f data2utf8.php

ちゃんとUTF-8に変換されたか、wiki/内の適当なファイルの文字コードをチェックしてみる。

$ nkf --guess 737175696A7E38397E383ADEB5E383BCE38390E381AEE6A78BE7AF89.txt 
UTF-8 (LF)

conv_ts.phpは必須ではない。タイムスタンプの修正を行いたい場合は実行する。

$ php -f conv_ts.php

UTF-8版のPukiWikiを用意

公式ページから 1.4.7のUTF-8版をダウンロードする
PukiWiki/Download/1.4.7 - PukiWiki-official

展開後、従来のPukiwiki内の以下のデータをUTF-8版に上書きする(データのみをUTF-8版のフォルダに移行する)

  • ./wiki
  • ./diff
  • ./backup
  • ./cache
  • ./attach
  • ./counter
  • ./trackback

※真っ白になる問題を解決するライブラリファイルの上書きも忘れないように

これで対策・UTF-8への移行が完了なので、UTF-8版を本番環境においてアクセスしてみる。

やった、無事に問題が解決された!