realpath()でPHPに怒りを覚えた日。
realpath()、WindowsのPHP4とPHP5で、挙動が違う・・・。巫山戯るな(#゚Д゚)ゴルァ!!!!!!!!!!!!!!!!!!
事の発端はPEARの PEAR_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って感じ。