PHP, PEARの不可解なエラー

投稿: 2010年2月21日

FreeBSDにPHPをインストールしていろいろとやろうとしていると、時々PEAR (PHPのライブラリーなんかを管理するための仕組みを実現するソフトウェア (という理解で正しいのだろうか)) を使うと、どうにもならないようなエラーが出て困ることがあった。ちょっとこれについて追求してみた。

どんなエラーか

具体的にどういうことが起こるかというと、PHPのライブラリー管理に関連する作業をしようと思って /usr/local/bin/pear を実行すると、 (おそらく指示したタスクを完了した後で) segmentation faultが起きて core dumpする、もしくは、何もせずに以下のようなエラーを出して終了してしまう。

ALERT - canary mismatch on efree() - heap overflow detected (attacker 'REMOTE_ADDR not set', (略)

pearそのものはshell scriptで、その中で /usr/local/bin/php を呼び出して、PHPで書かれたスクリプトを実行している。つまり、pearに問題があると言うよりは、PHPに問題があると見る方が適切だと思う。

Segmentation Fault

Pearのスクリプトをちょっと覗いてみたりもしたのだが、どうにもエラーの原因が分からないので、いろいろと検索を試みてみた。そしてSegmentation Faultの問題については、PHPのPostgresql用のモジュールをアンインストールしたら解決したとか、libxmlをダウングレードしたら解決したとか、そんな情報が目についた。libxmlをダウングレードするというのは種々の事情であまり現実的ではなかったのでやらなかったが、とりあえずPostgresqlのモジュールをアンインストールするというのを試してみた。が、状況は改善しなかった。

それでは、ということで一度PHPモジュールを全てアンインストールしてからPEARとそれに必要なモジュール (PHPそのものも含む) をインストールし直してみた。するとPEARは問題なく動作した。それで、他のソフトウェアの動作に必要なモジュールを改めてインストールしてから試してみると、やはりSegmentation Faultが出てしまった。

仕方がないので、 extentions.ini (FreeBSD Ports Collectionからインストールした場合は /usr/local/etc/php/extentions.ini にある) を編集して、そこにリストされているモジュールを一つずつコメントアウトしては試す、というのを繰り返してみた。その結果、 ImageMagick用のモジュールをコメントアウトすると、この問題は発生しないことが分かった。

というわけで、どうやらこの問題、何らかのモジュールが悪さをして発生するようだが、どのモジュールかというのはその時使っているバージョンなんかによって違っているらしい、というのがこの問題に対する結論である。

heap overflow

こちらの方についても結局自分ではよく分からなかったので、Googleに頼った。結論だけ書くと、これはどうやらApacheのMPMがprefolkでインストールされた時にPHP本体をインストールしたのに、その後Apacheをworkerにして再インストールしたことが原因だったようだ。ということで、PHP関連を全てアンインストールしてから作り直してインストールし直す、つまりFreeBSD Ports Collection的には:

% sudo pkg_delete -f php5-\* pecl-\* pear-\*

とやってから、再インストールすれば良い。 lang/php5-extentions を使っている場合は、これを再インストールしてやればほぼ問題ないだろうし、たとえば今回の僕のようにMediawikiとphpMyAdminで必要でPHPを使っているような場合なら、これらを再インストールする作業をしてやれば、自然に必要なPHPモジュールをインストールすることができる。

このように、分かってしまえば単純なことではあるのだが、今回の問題解決にはかなりの時間をかけてしまった。元々PHPはあまり好きではないのだけれど、今回のことでさらに印象が悪くなった。もしMediawikiと同程度の機能を持つソフトウェアでPHP以外の言語で実装されているものがあるならば、すぐさま乗り換えたいと思った。ということで、そのようなソフトウェアについてお勧めがありましたらぜひお教えください。