ApacheのDocumentRoot配下に2つのディレクトリを作成し、それぞれにPHPサイトの構築を検討しています。

それぞれのサイトの処理はほとんど同じなのですが、requreで読み込まれる処理とDBの参照先を変えることで異なるサービスを実現しようとしています。

そこで質問ですが、これを実現するために、それぞれのサイトのrequireの参照先を変えたいのですが、うまくいきません。
PHP.iniのinclude_pathでは共通設定なのでそれぞれのサイトの参照先を変えることができませんし、それぞれのサイトのディレクトリ配下に.htaccessを設置してもrequireの指定ファイルを読み込むことができませんでした。

方法について、みなさんのお知恵をお借りしたいと思いますので、よろしくお願いいたします。

回答の条件
  • URL必須
  • 1人3回まで
  • 登録:
  • 終了:2009/11/28 18:23:44
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:hnagoya No.3

回答回数26ベストアンサー獲得回数3

ポイント30pt

回答者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.phphttp://.../b/index.php の表示をチェックしましたところ Local Value が .htaccess での指定に変更されていました。


4. ということで、cochoo さんのお手元でうまくいかない理由は残念ながらわからないのですが

  • 期待している .htaccess ファイルが本当に読み込み解釈されているかどうか
  • 他のファイル(別ディレクトリの .htaccess など)で期待している .htaccess ファイルでの設定が上書きされていないかどうか

あたりを念のため再チェックしてみてはいかがでしょうか。

id: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の意味合いがわかりました。

いろいろとお調べいただいて本当にありがとうございました!

2009/11/28 18:21:11

その他の回答2件)

id:rouge_2008 No.1

回答回数595ベストアンサー獲得回数351

ポイント25pt

以下のような記述を.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());

・・・のように記述すれば大丈夫ではないかと思います。

※どちらも優先順位は、記述した順番になります。

※カレントディレクトリが一番優先されますので、読み込むファイルはカレントディレクトリ以外のディレクトリに置く必要があります。


※コメント欄を開けて置いた方がやり取りがしやすいと思います。

id:cochoo

遅くにご回答いただきありがとうございます。

対象サーバは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ファイルを編集せずに対応したいのですが、

対策をご存知であれば、よろしくお願いいたします。

2009/11/28 01:28:14
id:hnagoya No.2

回答回数26ベストアンサー獲得回数3

ポイント25pt

たとえば 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 あたりが使えるのではないかと。

http://www.php.net/manual/ja/reserved.variables.server.php

id:cochoo

ご回答いただきありがとうございます。

説明不十分で申し訳ありません。

実現したいのは、

/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は任意のフォルダに設置できると書かれてあったので、なぜ目的の動作を実現できないのか悩んでいます。

この件について、ご助言をいただけると幸いです。よろしくお願いいたします。

2009/11/28 09:57:00
id:hnagoya No.3

回答回数26ベストアンサー獲得回数3ここでベストアンサー

ポイント30pt

回答者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.phphttp://.../b/index.php の表示をチェックしましたところ Local Value が .htaccess での指定に変更されていました。


4. ということで、cochoo さんのお手元でうまくいかない理由は残念ながらわからないのですが

  • 期待している .htaccess ファイルが本当に読み込み解釈されているかどうか
  • 他のファイル(別ディレクトリの .htaccess など)で期待している .htaccess ファイルでの設定が上書きされていないかどうか

あたりを念のため再チェックしてみてはいかがでしょうか。

id: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の意味合いがわかりました。

いろいろとお調べいただいて本当にありがとうございました!

2009/11/28 18:21:11
  • id:rouge_2008
    結局原因が分からなかったようですが、とにかく解決して良かったです。
    .htaccessとphp.iniの両方が動作したようですので、モジュール版のようですが、今後は、ローカルなのかレンタルサーバーなのか等、出来るだけ詳細な環境を明記する方が良いと思います。

この質問への反応(ブックマークコメント)

トラックバック

  • include_pathの設定変更 id:cochooさん 以下の質問について、コメントに書きたかったのですが、開いていなかったので日記にしました。 http://q.hatena.ne.jp/1259333967 おそらくレンタルサーバーだと
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません