こんにちは。

PHPファイルのincludeに関する質問です。

「/index.php」と「/test/test.php」に同じphpファイル「/inc/inc.php」を読み込みたいと考えております。
その際の「/index.php」と「/test/test.php」に記述する内容ですが、
<?php require_once('[サーバーのルートからのパス]inc/inc.php');?>
だとうまくいきました。

ここで、問題なのですが、
じつはサイトがテストサイトと本サイトの二つがあり、
ファイルを更新した際に、
いちいちそのつど、パスを書き換えないといけないのが非常に手間に感じます。
例えば、
<?php require_once('/inc/inc.php');?>
のように書けたら便利だと思うのですが、この方法だとうまくいかず、
他に良い方法がわかりません。

ぜんぜん違うサーバーにある同じファイルに、
共通して書ける絶対パスの書き方はないでしょうか?

ここまで書いておいてなんですが、当方PHP超初心者です。
恐縮ですが、記述例を記載していただくなど、初心者にでもわかるように噛み砕いて教えていただければ幸いです。
宜しくお願いいたします。

回答の条件
  • URL必須
  • 1人10回まで
  • 登録:
  • 終了:2008/05/30 13:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:Leclerc No.1

回答回数86ベストアンサー獲得回数6

ポイント60pt

/.htaccessに、

php_value include_path "inc"

/test/.htaccessに、

php_value include_path "../inc"

として、

require_once('inc.php');

で統一してはどうでしょう?

http://q.hatena.ne.jp

id:fablies2007

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

ちなみにこのphp_value include_path "inc"をhtaccessファイルに記述するというのはどう意味なのでしょうか?

お手数をかけてすみません。

宜しくお願い致します。

2008/05/23 14:42:48
  • id:tezcello
    「締切」になっているのでこちらへ書きます。

    > ちなみにこのphp_value include_path "inc"をhtaccessファイルに記述するというのはどう意味なのでしょうか?
    include() は、指令したファイルを、カレントディレクトリ -> スクリプトのディレクトリの順で探します。
    で、それぞれのディレクトリで探す再に、ファイル名が './', '../', '/' で始まっていない場合は、ファイル名に include_path に指定された値を付けて探すようです。
    http://jp.php.net/manual/ja/function.include.php

    ちなみに、include_path は PHP 動作時の挙動を決める設定値です。

    #1の回答者さんのやろうとしているのは、上記を利用してPHPが探しにいくディレクトリを特定のものに決めてしまおうとしているんです。
      回答のように設定してあると、require_once('inc.php') は、
      /index.php からは、inc/inc.php つまり /inc/inc.php
      /test/test.php からは、../inc/inc.php これは /test/../inc/inc.php やはり /inc/inc.php
      を探しに行く訳です。

    他の方法もいくつか考えましたが、PHPだけでできる方法は少ないです。
    ・サーバ名に応じて値をセットしておく
    // … はそのサーバの名前に置き換えてください
    // パスは例です
    if ($_SERVER['SERVER_NAME'] == '…'){
    define('INC_DIR', '/home/hoge/inc/');
    }elseif ($_SERVER['SERVER_NAME'] == '…'){
    define('INC_DIR', '/home/fuga/inc/');
    }
      としておいて、
    include_once(INC_DIR.'inc.php');
      としていすればOKです。
      他へも応用できるので一旦定数に置いてから使う例を示しましたが、
      define の代わりに直接 include_once を書いてしまっても問題ないです。

    ・スクリプトのディレクトリに、目的のファイルへのリンクを置いておく

    ・サーバ毎にインクルードするファイルのパスを環境変数をセットしておき、
     $_ENV['○○'] として読み出す


  • id:fablies2007
    わざわざご回答ありがとうございます。
    おかげさまで、理解することができました。

    また、自分の質問の答えについてですが、
    さんざんググった結果、
    「ドキュメントルート」のパスが格納されているスーパーグローバル変数「$_SERVER["DOCUMENT_ROOT"].」をurlの前に付け加えることによって、可能な様です。

    http://www.shigeweb.jp/php/project_p/?page=ctrl2&section=first
  • id:tezcello
    $_SERVER["DOCUMENT_ROOT"]を直ぐに思いついたのですが、ユーザーのホームディレクトリ(/~hoge/public_html/ のような)以下にスクリプト等を配置しているとうまくいかないような気がしますが、どうでしょうか?
    $_SERVER["DOCUMENT_ROOT"] で解決されているのでしたらよいのですが...

  • id:KeyKey
    テスト環境と本番環境でファイルの相対関係が同じならrealpathを使うのはどうでしょうか?

    //「/index.php」
    $path = realpath(dirname(__FILE__));
    //「/test/test.php」
    $path = realpath(dirname(dirname(__FILE__)));

    require_once $path . '/inc/inc.php';

    dirnameをさらに重ねるとドキュメントルートより下のパスも取得できます。
  • id:fablies2007
    みなさま、ご回答いただきありがとうございます。
    いろいろと大変参考になりました。
    質問を締め切ってしまったので、
    お礼のみで恐縮ですが、
    この場を借りてお礼を言わせていただきたいと思います。
    大変ありがとうございました。

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

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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