それぞれのサイトの処理はほとんど同じなのですが、requreで読み込まれる処理とDBの参照先を変えることで異なるサービスを実現しようとしています。
そこで質問ですが、これを実現するために、それぞれのサイトのrequireの参照先を変えたいのですが、うまくいきません。
PHP.iniのinclude_pathでは共通設定なのでそれぞれのサイトの参照先を変えることができませんし、それぞれのサイトのディレクトリ配下に.htaccessを設置してもrequireの指定ファイルを読み込むことができませんでした。
方法について、みなさんのお知恵をお借りしたいと思いますので、よろしくお願いいたします。
回答者2です。以下は apache + mod_php (サーバーモジュール)前提ですが
1. php.ini は httpd の起動時に1回だけ読み込まれるそうなので、スクリプトの実行毎に独立指定というのは仕様上無理ではないかと思います。
http://www.php.net/manual/ja/configuration.file.php
2. .htaccess であればスクリプトの実行毎での指定が可能だそうなので、こちらがご希望に沿う話だと思います。
http://www.php.net/manual/ja/configuration.file.per-user.php
http://www.php.net/manual/ja/configuration.changes.php
3. 手元の Linux マシン(Debian lenny + apache2 + PHP5)で試してみたところでは 2 でご希望の動作をしていることが確認できました。
具体的には各ディレクトリ直下の index.php の中身を echo phoinfo() とし、.htaccess には php_value include_path ... を記載して
http://.../a/index.php や http://.../b/index.php の表示をチェックしましたところ Local Value が .htaccess での指定に変更されていました。
4. ということで、cochoo さんのお手元でうまくいかない理由は残念ながらわからないのですが
あたりを念のため再チェックしてみてはいかがでしょうか。
以下のような記述を.htaccessに記述したのでしょうか?
http://www.iyahooi.com/entry/2008/04/htaccessphp.html
「set_include_path()」でPHPファイルに記述するのはいかがでしょうか?
http://kezy.org/2009/07/19/php-include-path
サイト1には
$path = /home/user/www/lib1/"; set_include_path($path . PATH_SEPARATOR . get_include_path());
サイト2には
$path = /home/user/www/lib2/"; set_include_path($path . PATH_SEPARATOR . get_include_path());
・・・のように記述すれば大丈夫ではないかと思います。
※どちらも優先順位は、記述した順番になります。
※カレントディレクトリが一番優先されますので、読み込むファイルはカレントディレクトリ以外のディレクトリに置く必要があります。
※コメント欄を開けて置いた方がやり取りがしやすいと思います。
遅くにご回答いただきありがとうございます。
対象サーバはUNIXですので、ご指摘の通りで.htaccessを記述してあります。
できれば、PHPファイルには手を加えずに実現したいのですが、どうしてもうまくいきません。
たとえば、私の環境で、DocumentRoot配下にtest1とtest2というフォルダを作成し、ぞれぞれに、
test1/.htaccess
test1/t1.php
test2/t2.php
を作り、
.htaccessには、php_value include_path ".:../test2"
t1.phpには、
t2.phpには、
としたのですが、t1.phpを実行するとApacheは、PHP.iniのinclude_pathのみを参照し、t2.exeは存在しないエラーが表示されます。
なお、httpd.confをDocumentRootを"AllowOverrice All"に設定しており、何が原因が不明です。
もしよろしければ、PHPファイルを編集せずに対応したいのですが、
対策をご存知であれば、よろしくお願いいたします。
たとえば DocumentRoot が /var/www だとして
/var/www/a/index.php
/var/www/b/index.php
の各々で require するファイルのパスを独立に指定できない、というようなことでしょうか。
だとすると「うまくいきません」というのが腑に落ちないのですが…何も考えずに require('/var/local/a/lib/php') とか書けばうまくいくように思います。
それはさておき、どうやってもある特定のファイルしか require できない、ということであれば、その共通で require するファイル内で、たとえば $_SERVER[XXX] の値によって処理を分岐させればよいのではないかと思います。
XXX は PHP_SELF, SCRIPT_NAME, REQUEST_URI あたりが使えるのではないかと。
ご回答いただきありがとうございます。
説明不十分で申し訳ありません。
実現したいのは、
/var/www/a/index.php … ①
/var/www/b/index.php … ②
で、index.phpの処理を変えずに、外部の設定(php.iniか.htaccess)だけで、①と②のrequireの参照先を変えたいということです。
「うまくいきません」という意味は、違う設定のphp.iniや.htaccessを/var/www/aと/var/www/bにおいても、それは認識されず、PHP本体があるphp.iniのinclude_pathだけを参照してしまうため、①と②のrequire参照先を変えることができなかったということです。
たとえば、設定は以下のように行っています。
/var/www/a/php.ini → include_path ".:/var/www/a_lib"
/var/www/b/php.ini → include_path ".:/var/www/b_lib"
/var/www/a/.htaccess → php_value include_path ".:/var/www/a_lib"
/var/www/b/.htaccess → php_value include_path ".:/var/www/b_lib
他の文献やサイトをみると、php.iniや.htaccessは任意のフォルダに設置できると書かれてあったので、なぜ目的の動作を実現できないのか悩んでいます。
この件について、ご助言をいただけると幸いです。よろしくお願いいたします。
回答者2です。以下は apache + mod_php (サーバーモジュール)前提ですが
1. php.ini は httpd の起動時に1回だけ読み込まれるそうなので、スクリプトの実行毎に独立指定というのは仕様上無理ではないかと思います。
http://www.php.net/manual/ja/configuration.file.php
2. .htaccess であればスクリプトの実行毎での指定が可能だそうなので、こちらがご希望に沿う話だと思います。
http://www.php.net/manual/ja/configuration.file.per-user.php
http://www.php.net/manual/ja/configuration.changes.php
3. 手元の Linux マシン(Debian lenny + apache2 + PHP5)で試してみたところでは 2 でご希望の動作をしていることが確認できました。
具体的には各ディレクトリ直下の index.php の中身を echo phoinfo() とし、.htaccess には php_value include_path ... を記載して
http://.../a/index.php や http://.../b/index.php の表示をチェックしましたところ Local Value が .htaccess での指定に変更されていました。
4. ということで、cochoo さんのお手元でうまくいかない理由は残念ながらわからないのですが
あたりを念のため再チェックしてみてはいかがでしょうか。
ご回答ありがとうございます。
まず、PHP.iniに関してはapacheの再起動が必要ですが、各ディレクトリ(Local Value)に設置されたPHP.iniの設定が各ディレクトリで認識されることを確認できました。
.htaccessに関しても問題なく期待通りの動作を確認できました。
結局、原因がわからずじまいなのですが、hnagoya様から1回目のご回答をいただいたときはinclude_pathが認識されていませんでした。
現状は、include_pathが認識されていますので、これで質問を終了したいと思います。
ただし、hnagoya様からの情報で、PHP.iniと.htaccessの設定方法が明確となりましたので、昨日の根本原因はそれ以外の環境問題と切り分けすることができました。もし、今後問題が再発したのであれば、PHP.iniや.htaccess以外のところを優先的に調べたいと思います。
また、PHP4とPHP5では.htaccessの設定を分けることと、phpinfo()のLocal valueの意味合いがわかりました。
いろいろとお調べいただいて本当にありがとうございました!
ご回答ありがとうございます。
まず、PHP.iniに関してはapacheの再起動が必要ですが、各ディレクトリ(Local Value)に設置されたPHP.iniの設定が各ディレクトリで認識されることを確認できました。
.htaccessに関しても問題なく期待通りの動作を確認できました。
結局、原因がわからずじまいなのですが、hnagoya様から1回目のご回答をいただいたときはinclude_pathが認識されていませんでした。
現状は、include_pathが認識されていますので、これで質問を終了したいと思います。
ただし、hnagoya様からの情報で、PHP.iniと.htaccessの設定方法が明確となりましたので、昨日の根本原因はそれ以外の環境問題と切り分けすることができました。もし、今後問題が再発したのであれば、PHP.iniや.htaccess以外のところを優先的に調べたいと思います。
また、PHP4とPHP5では.htaccessの設定を分けることと、phpinfo()のLocal valueの意味合いがわかりました。
いろいろとお調べいただいて本当にありがとうございました!