extensionの読み込み順でハマった

php_exifエクステンションを有効にしたら、また昨日みたいに動かなくなった。
しかも今度はコマンドラインですらエラーが出る始末。

php_mbstring.dll が見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すとこの問題は解決される場合があります。

こんなダイアログが出てくる。
ちなみに、「開始できませんでした」といいつつ普通に動く。exifは無効になっているがmbstringは有効になっている状態で。

ロード順に注意

どうやらphp_exifphp_mbstringに依存しているようなので、php_mbstringを先にロードしてあげなければいけないらしい。

extension=php_mbstring.dll
extension=php_exif.dll

こんな感じでphp_mbstringを先に書いておく。
標準で添付されているphp.ini-distやphp.ini-recommendedはファイル名のアルファベット順で並んでいるから、単にコメント解除するだけだとこういうことになる。なんだよちくしょうヽ(`Д´)ノ

PHPXref

ちなみにphp_exifを有効にしたのは画像処理がしたかったわけでもなんでもなく、単にPHPXref用に全ての関数一覧を取りたかっただけ。PHP4の関数一覧しか同梱されてなかったので。


だけど、試しにCakePHPのソースを丸ごと食わせてみたらCore 2 Duo 2.33GHz、2.48GBメモリのPCでも8分弱かかったのと、なんだか実装コードが微妙だったので利用は見送ることになりそう。
まぁクロスリファレンスなんで処理が大変なのかもしれないけど。

PHPXref用関数一覧作成

今回使ってみたv0.7にはPHP4のリストしか同梱されていなかったのでPHP5の一覧を取得する。

<?php
$list = get_defined_functions();
$internal = $list['internal'];
sort($internal);
foreach ($internal as $func) {
    echo "$func\n";
}

しかし、同梱のphp4_functionlist.txtと比較すると何故かものすごい勢いで関数が足りない。
同梱のリストは3488あるのに、PHP 5.2.9-1で上記のスクリプトを実行*1しても1981しか出てこない。PECLとかてんこ盛りバージョンなんだろうか。


というわけで、自力extension分までどうにかするのは面倒なので、マージすることにした。

use strict;
use warnings;

my %list;
while (<>) {
    chomp;
    $list{$_}++ if ($_ ne '_');
}
print "$_\n" for (sort keys %list);


PHPXref自身はperlで出来てたので、perlで書いてみた。'_'は謎。

*1:OracleSybase以外のextensionは全て有効にして実行