seclan のほえほえルーム

| |

WordPress ME 2.0.4 がハングしてしまう問題

・
2006/09/30 []

CMS ソフトの一つに WordPress というソフトがあります。有志の方が WordPress ME という日本語版を作成し、公開しています。その成果をありがたく利用させていただこうとしたところ、家の環境では、そのまま実行しようとするとハングしてしまいました。

何が問題かを調べていたのですが、意外な結果になりました。現在の version 2.0.4 では複数の言語に対応する方法として GNU の gettext 方式を採用しています。このファイル *.mo (例えば ja_EUC.mo) を読み出すときに問題が発生していました。

このファイルは構造持っており、読み出すときにはいろいろファイル内をシークする必要があるようです。そのため WordPress ではいったんファイルの中身を、全て文字列として取り込み、そこから seek オフセットで指定された位置から、substr 関数で文字列を切り出すようになっていました。しかし問題はまさにここにあったのです。

*.mo ファイルの先頭には、いくつかのメタ情報が格納されていますが、調べたところ、この部分の読み出しが、読み出してすぐにでたらめになってしまっていたのです。ソースコード上のロジックにミスはないにもかかわらずです。なんとも不思議な現象でした。4 バイト読み出しているはずが 5バイト分読み出されたりしていたのですから。

しばし思案していると、ひらめきました。mbstring.func_overload です。この機能は指定された php の文字列操作関数のいくつかをマルチバイト対応関数に置き換えることを指示します。そう、もし文字列化されたファイル内部に \x81\x83 のような並びがあったら substr はそれを一文字として認識してしまいます。こちらの思惑としては文字列としてではなくバイナリとして扱って欲しいのですが、substr が mb_substr に置き換えられてしまっているので、それが出来ません。

結局 wp-includes/streams.php の StringReader クラス内の read, seekto, length 関数の先頭に $ien = mb_internal_encoding();mb_internal_encoding('iso-8859-1'); を、return 直前に mb_internal_encoding($ien); を挿入し、マルチバイト処理を無効化するとハングすることはなくなり動作するようになりました。

また wp-admin/index.php 内で外部サイトの rss を自動的に読み込むようになっていますが、不要ならば当該の $rss = @fetch_rss( /*URI*/ ) をコメントアウトしておくとよいでしょう。

ついでですが、この WordPress、melon 1.80β の http サーバでは、始め動作しませんでした。現在は修正したので、うまく動くようになっています。パッケージにするのが面倒なので、修正版は気が向いたら公開します。



by seclan

関連


| |

 

配信

8.29 msec