ぐらめぬ・ぜぷつぇんのはてダ(2007 to 2011)

2007年~2011年ごろまで はてなダイアリー に書いてた記事を引っ越してきました。

realpath()でPHPに怒りを覚えた日。

realpath()、WindowsのPHP4とPHP5で、挙動が違う・・・。巫山戯るな(#゚Д゚)ゴルァ!!!!!!!!!!!!!!!!!!

事の発端はPEARPEAR_PackageFileManager で、詳細やpatchは以下のBugレポートで上がっているので参照して下さい。

http://pear.php.net/bugs/bug.php?id=12023

ここでは原因となったrealpath()の挙動の違いが、どういう物か簡単に示します。百聞は一見にしかず。
以下のディレクトリがあったとします。

C:\temp

これをrealpath()した結果を見てみます。まずは、DIRECTORY_SEPARATOR(DS)無しでcallしたとき。

> php -r "echo realpath('C:\\temp');"

これは、PHP4(4.4.7)でもPHP5(5.2.4)でも同じ結果になります。

C:\temp

で、今度はDSを付けて呼んでみます。

> php -r "echo realpath('C:\\temp\\');"

PHP4の結果:

C:\temp

PHP5の結果:

C:\temp\

・・・"\"が一個多いんですけど。

PEAR_PackageFileManagerは、暗黙の内にrealpathの結果の末尾は"/"が「無い」事を前提に、ファイルのフルパスをsubstr()する位置を調整しています。このため、PHP5.2.4 on Windowsの場合は"\"が一つ多い分、フルパスをsubstr()でカットする位置が一つ多くなってしまい、結果として正しくないファイル名がパッケージのファイルリストとして生成されてしまいました。

で、9/11位(当時1.6.1)に上記Bugを挙げていたのですが、音沙汰もなくいつの間にか1.6.2にバージョンが上がっていて、で、そのタイミングで漸くコメントが付いた訳です。う〜〜ん・・・そんなにちょくちょくバージョンアップする訳にもいかないでしょうし、しばらくは様子見かな・・・。

っつーか、まだpatch自体の評価中、みたいな感じだし。コメントくれたtimjさんがLinuxユザで、「現象が再現しないんだけど・・・Windowsだけ?」とかで、それに対する調査で今回これが分かった次第で。

っつーか、マジ、巫山戯るなPHPって感じ。