ちょっと複雑な設計になってくると、パスの制限を回避したくなります。
いや、本当はそういう制限があっても問題ないのが本当はいいのだけど、いちいちdefineで宣言するのもめんどくさいし、過程よりも結果に重きをおくべきなのはいうまでもありません。
ということで、set_include_pathをいじって、システムの設計を一部変更して、テストサーバにアップしたとたんに異変が。
今まで動いていたのが、ファイルが見つからないの嵐に。
よくよく調べたら、Windowsとそれ以外ではpath設定のセパレータが異なるという。
OSのpathを利用しているからだと分かればたいしたことないのだけれど、コロンとセミコロンなんて、ぱっと見て違いに気づきませんよ、普通。
定数のPATH_SEPARATORを使えばいいのだけれど、こういう回避の仕方はphpだからこそというか、無理やりというか・・・
マニュアルのページには以下のようなコードが載っていました。
<?php if ( ! defined( "PATH_SEPARATOR" ) ) { if ( strpos( $_ENV[ "OS" ], "Win" ) !== false ) define( "PATH_SEPARATOR", ";" ); else define( "PATH_SEPARATOR", ":" ); } ?>
phpの定数とか関数の初期値は、バージョンが変われば変化してしまう危険があるので、あまり使いたくないけど、どの道php6はまだ先のことだろうから、とりあえずPATH_SEPARATORをつかってしのぐことにしようかな。
.htaccessでやればいいみたいだけど、詳しい説明が載ってない。
設定済みのものを取得私鉄かしたいような場合だと、.htaccessでは全部書き直さなければいけないようなので、phpで一度取得した後に再設定する方法がいいのだろう・・・。
と、散々愚痴っていたけど、php.iniをよく見たら
; UNIX: "/path1:/path2" ; Windows: "\path1;\path2"
このように、しっかり書かれてあった。
まとめると、以下のようになる
php.iniで設定する場合
include_path = ".;c:\php\pear;c:\php\cli\pear;c:\home\php_myLib"
.htaccessで設定
する場合
php_value include_path ".:/usr/local/lib/php:/home/user/php_myLib"
長いこと使っていても知らなかった。
というか、使うことがなかっただけかもしれない。