PHPプロジェクトのルートディレクトリパスを取得する


115

私のPHPプロジェクトには、このフォルダー構造があります。(これは日食に示されているとおりです)

-MySystem
    +Code
    +Data_Access
    -Public_HTML
        +css
        +js
        +Templates
    -resources

このコードを試すと

echo $_SERVER['DOCUMENT_ROOT']

出力は

D:/ workspace

MySystemフォルダ名をハードコーディングせずに、システム()のRootDirectoryへのパスを取得するにはどうすればよいですか?

回答:


146

以下のためのPHP> = 5.3.0試してみます

PHP マジック定数

__DIR__

そして、あなたの道を相対的にしてください。

以下のためのPHP <5.3.0試してみます

dirname(__FILE__)

3
これはすごいです、$ _ SERVER ['DOCUMENT_ROOT']、dirname()、$ _ SERVER ['SCRIPT_NAME']などを試しましたが、これはうまくいきました!
webblover 2014年

78
使用する場所によって異なります__DIR__ 。これはファイル自体に関連しているため、インクルード内のサブディレクトリ内では、ルートディレクトリだけを返しません。
アイリス、2015年

10
ルートディレクトリは提供されません
inrsaurabh

1
質問の答えを探してこの答えを見つけた人のための簡単なメモ、プロジェクトルートにあるファイルで呼び出さない限り、DIRは現在のファイルのディレクトリをプロジェクトルートではなく取得しますが、phpはそうではありませんプロジェクトの概念を持っているすべてのパスは現在の場所に対して絶対的または相対的である必要があります
MikeT

それがあなたを助けたという理由だけで、質問に正しく対処しない回答を賛成しないでください。
ElYeante

73

あなたがそれを言うとき

$_SERVER['DOCUMENT_ROOT']

このパスが含まれています:

D:/workspace

そして、D:あなたが探しているもの、それはないですか?その場合、スラッシュで文字列を分解し、最初の文字列を返すことができます。

$pathInPieces = explode('/', $_SERVER['DOCUMENT_ROOT']);
echo $pathInPieces[0];

これにより、サーバーのルートディレクトリが出力されます。

更新:DIRECTORY_SEPARATORハードコードされたスラッシュ('/')の代わりに定数を使用すると、このコードはWindowsでも機能します。

アップデート2:$_SERVERグローバル変数は常に利用可能ではありません。たとえば、コマンドライン(cli)で。したがって、の__DIR__代わりに使用する必要があります$_SERVER['DOCUMENT_ROOT']__DIR__phpファイル自体のパスを返します。


2
また、の__DIR__代わりに使用できます$_SERVER['DOCUMENT_ROOT']
Armin

申し訳ありませんが、私の質問を適切に説明していない場合、実際に必要なのは「D:/ workspace / MySystem」です
Nalaka526

1
ルートディレクトリパスが/ var / public / wwwの形式の場合、このメソッドを使用すると、配列の最初の文字列は空になります(0)/(1)/(2)/(3)。ルートは2番目の文字列$ pathInPieces [1]
tbradley22

36

PHP関数を使用します。

getcwd()

現在の作業ディレクトリを取得します。


1
これは、現在実行中のファイルパスを返します。ルートパスではない
Yousha Aleayoub

9

Wordpressがこれを処理する方法を指摘したいと思います。

define( 'ABSPATH', dirname(dirname(__FILE__)) . '/' );

WordpressはWeb全体で非常に頻繁に使用されており、ローカルでも正常に動作するため、この方法を信頼しています。


1
これは、2つのレベルのディレクトリがある場合にのみ機能すると思います。正しい?つまり、base_project_directory / folder1 / folder2 / folder3 / file.phpから呼び出すと、base_project_directoryは返されません。
Ali Khalili

「WordpressはWeb全体で非常に頻繁に使用されており、ローカルでも正常に動作するため、この方法を信頼しています。」WPコードの品質とセキュリティの実績を考えると、これは特に良い議論ではないと思います。
Alex Barker

1
@AlexBarker WPのセキュリティ実績が悪いというあなたの示唆に反対するでしょう。それは実際にはかなり安全で、セキュリティに焦点を合わせた鋭敏なチームを持っています-コアは、ここ数年、悪用されたセキュリティ問題(コメントした時点を含む)をほとんど持っていません。
ウィリアムパットン

3

あなたが試すことができます: $_SERVER['PATH_TRANSLATED']

見積もり:

サーバーが仮想から実際のマッピングを行った後の、現在のスクリプトへのファイルシステム(ドキュメントルートではない)ベースのパス。注:PHP 4.3.2以降PATH_TRANSLATED、Apache 1の状況とは異なり、Apache 2 SAPIで暗黙的に設定されることはありません。Apacheが設定されてSCRIPT_FILENAMEいない場合、サーバー変数と同じ値に設定されます。
この変更は、PATH_TRANSLATED PATH_INFOが定義されている場合にのみ存在する必要があるというCGI仕様に準拠するために行われました。Apache 2ユーザーはAcceptPathInfo = On内部httpd.confを使用して定義することができますPATH_INFO

ソース: php.net/manual



0

概要

この例では、Apacheルートフォルダーが '/ var / www /'であることが常にわかっていて、次のフォルダーパス( '/ var / www / my_website_folder'など)を見つけようとしていると想定しています。また、これはスクリプトまたはWebブラウザーから機能するため、追加のコードがあります。

コードPHP7

function getHtmlRootFolder(string $root = '/var/www/') {

    // -- try to use DOCUMENT_ROOT first --
    $ret = str_replace(' ', '', $_SERVER['DOCUMENT_ROOT']);
    $ret = rtrim($ret, '/') . '/';

    // -- if doesn't contain root path, find using this file's loc. path --
    if (!preg_match("#".$root."#", $ret)) {
      $root = rtrim($root, '/') . '/';
      $root_arr = explode("/", $root);
      $pwd_arr = explode("/", getcwd());
      $ret = $root . $pwd_arr[count($root_arr) - 1];
    }

    return (preg_match("#".$root."#", $ret)) ? rtrim($ret, '/') . '/' : null;
}

echo getHtmlRootFolder();

出力:

/var/www/somedir/

詳細:

基本的に、最初に「/ var / www /」が含まれているDOCUMENT_ROOTを取得しようとし、それを使用します。それ以外の場合は、現在のディレクトリ(プロジェクト内に多く存在します)を取得し、$ rootパスの数に基づいて次のパス値を取得します。注:パスがすべての場合に「/」で終わることを保証するためにrtrimステートメントを追加しました。/ var / www /より大きい必要があるかどうかはチェックしません。可能な応答として/ var / www /を返すこともできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.