HOWTO · PHP

PHP でルートディレクトリパスを見つける

このチュートリアルでは、PHP プロジェクトのルートディレクトリパスを見つける方法を紹介します

このページの内容

PHPアプリケーションでは、複数の異なるパスが「ルート」と呼ばれることがあります。プロジェクトルートはアプリケーションが基点として扱うディレクトリ、現在のファイルのディレクトリはPHPスクリプトが置かれている場所、WebドキュメントルートはWebサーバーがリクエストに対して公開するディレクトリです。これらは異なる場合があります。どの式も常にプロジェクトルートを返すと考えず、探したいファイルに合ったパスを選んでください。

例として、プロジェクトが /var/www/html/project にあり、最上位に index.php、master/ に login.php があるとします。例示用のサーバードキュメントルートは /var/www/html です。これらはサンプルパスであり、お使いのサーバーで測定した値ではありません。

プロジェクトルートとWebドキュメントルートを区別する

プロジェクトルートはアプリケーション側で定める慣例であり、PHPの設定項目ではありません。アプリケーションのコードや設定、その他のファイルが置かれることがあります。Webドキュメントルートはサーバーで設定され、公開用のWebファイルをどこから配信するかを決めます。この例ではプロジェクトはドキュメントルートの下にありますが、デプロイ先によってはプロジェクトが別の場所に置かれたり、公開用のサブディレクトリがドキュメントルートに設定されたりすることがあります。

この違いを覚えておきましょう。__DIR__ と dirname() はPHPファイルの場所を基準にパスを求めます。一方、$_SERVER['DOCUMENT_ROOT'] が示すのは現在のリクエストに対するサーバー設定です。これらの値のどれも、アプリケーション固有のルートを自動的に見つけるものではありません。

現在のファイルのディレクトリを __DIR__ で取得する

__DIR__ マジック定数は、それが記述されたファイルを含むディレクトリの絶対パスです。そのため、master/login.php では /var/www/html/project ではなく、/var/www/html/project/master を表します。この値はスクリプトの場所から決まるため、別の作業ディレクトリからそのスクリプトを読み込んでも変わりません。スクリプトと同じ場所、またはその下にあるファイルへのパスを組み立てるときに使い、必要に応じてPHPのパス区切り文字で相対パスを追加します。

次の単独で実行できる例を見てください。提供された実行では、PHPファイルは /work に保存されていたため、2つの式はいずれもそのディレクトリを指しました。例の表示ラベルはコードと出力で英語のままですが、どちらの式も /work を示すことが読み取れます。

<?php
echo "Current file directory: ", __DIR__, PHP_EOL;
echo "Directory from __FILE__: ", dirname(__FILE__), PHP_EOL;
?>
Current file directory: /work
Directory from __FILE__: /work

__FILE__ は現在のファイルの完全なパスであり、dirname(__FILE__) はそのファイルを含むディレクトリを返します。古いPHPコードでは後者が同等の方法として役立ちますが、__DIR__ のほうが意図を直接表せます。

dirname() で親ディレクトリをたどる

dirname() を使うと、既知のファイルパスから親ディレクトリへ移動できます。master/login.php にある __FILE__ を起点にすると、1回の呼び出しで master ディレクトリが返り、もう一度適用するとプロジェクトディレクトリが返ります。このサンプル構成での結果は、それぞれ /var/www/html/project/master と /var/www/html/project です。呼び出しを入れ子にすると各段階が明確になり、利用できるPHPのバージョンが限られる任意の levels 引数に依存せずに済みます。

この処理はパスの構成要素を上方向にたどるもので、名前でフォルダーを検索したり、子ディレクトリへ下りたりするものではありません。プロジェクトの構成を変更すると、親をたどる回数も変わることがあります。その関係をコードの近くに記すか、多くのファイルで必要になる場合は、設定にプロジェクト固有の基点パスを定義してください。

Webサーバーのドキュメントルートを $_SERVER['DOCUMENT_ROOT'] で読む

Webリクエスト中、$_SERVER['DOCUMENT_ROOT'] には、そのサーバーに設定されたドキュメントルートが入ります。例示した環境では /var/www/html であり、プロジェクトルートの /var/www/html/project とは異なります。設定済みのディレクトリを基準にパスを組み立てる場合など、サーバーの公開用Webルートが必要なときに使います。プロジェクトルートと同じ意味で使わないでください。

このサーバー変数の値は、リクエスト環境とサーバー設定によって決まります。コマンドラインスクリプトでは存在しない、または適切でない場合があり、デプロイ先によって値が異なることもあります。Webリクエスト以外でも実行される可能性があるコードでは、値を利用できることを確認してください。目的のパスがサーバーの公開ディレクトリではなくプロジェクト内にある場合は、__DIR__ または設定済みのアプリケーション基点を使います。

要点として、現在のPHPファイルを含むディレクトリには __DIR__ を使い、プロジェクトディレクトリのような既知の親ディレクトリへ移動するには dirname() を入れ子にして呼び出します。Webサーバーに設定されたドキュメントルートが必要な場合に限り、$_SERVER['DOCUMENT_ROOT'] を読み取ってください。例示用のパスはあくまで例として扱い、スクリプトが実行される環境でデプロイ先固有の設定を確認してください。