PHPで現在のディレクトリを取得する方法について

採用はこちら

PHPで現在のディレクトリを取得する方法には、いくつかの種類があります。

代表的なものは、getcwd()__DIR__dirname(__FILE__)$_SERVER['DOCUMENT_ROOT'] です。

ただし、これらはすべて同じ意味で使えるわけではありません。

取得できるディレクトリの基準が異なるため、用途に応じて正しく使い分ける必要があります。

特に、ファイルの読み込みやログファイルの保存先を指定する場合は、どのディレクトリを基準にしているのかを理解しておくことが重要です。

目次

PHPで取得できる「現在のディレクトリ」とは

PHPで「現在のディレクトリ」といった場合、主に次のような意味があります。

取得方法取得できる内容主な用途
getcwd()現在の作業ディレクトリカレントディレクトリを確認したいとき
__DIR__そのPHPファイルが置かれているディレクトリrequireinclude のパス指定
dirname(__FILE__)そのPHPファイルが置かれているディレクトリ古いコードでよく使われる書き方
$_SERVER['DOCUMENT_ROOT']Webサーバーの公開ルート公開ディレクトリを基準にパスを作りたいとき

PHPで現在のディレクトリを扱う場合は、単に「今いる場所」を取得するのではなく、何を基準にしたディレクトリなのかを意識することが大切です。

getcwd()で現在の作業ディレクトリを取得する

getcwd() は、PHPの現在の作業ディレクトリを取得する関数です。

<?php
echo getcwd();
?>

実行結果の例は次のようになります。

/var/www/html

getcwd() は「current working directory」の略で、PHPプロセスが現在作業ディレクトリとして認識している場所を返します。

たとえば、次のように変数へ代入して使うこともできます。

<?php
$currentDir = getcwd();

if ($currentDir !== false) {
    echo '現在の作業ディレクトリは:' . $currentDir;
} else {
    echo 'カレントディレクトリを取得できませんでした';
}
?>

getcwd() は成功するとディレクトリのパスを文字列で返しますが、失敗した場合は false を返す可能性があります。

そのため、厳密に処理する場合は戻り値を確認しておくと安全です。

getcwd()を使うときの注意点

getcwd() は、現在実行しているPHPファイルが置かれているディレクトリを返すとは限りません。

たとえば、次のような構成があるとします。

project/
├── index.php
└── includes/
    └── sample.php

index.php から includes/sample.php を読み込む場合を考えます。

<?php
require 'includes/sample.php';
?>

このとき、sample.php の中で次のように書いたとします。

<?php
echo getcwd();
?>

この結果は、sample.php が置かれている includes ディレクトリではなく、実行時の作業ディレクトリを返します。

つまり、getcwd() は「現在のファイルの場所」ではなく、「PHPが現在作業しているディレクトリ」を取得する関数です。

そのため、読み込まれたファイル自身のディレクトリを基準にしたい場合は、getcwd() ではなく __DIR__ を使う方が適しています。

__DIR__でPHPファイル自身のディレクトリを取得する

__DIR__ は、現在のPHPファイルが置かれているディレクトリを取得できるマジック定数です。

<?php
echo __DIR__;
?>

たとえば、次の場所にPHPファイルがあるとします。

/var/www/html/project/includes/config.php

この config.php の中で __DIR__ を表示すると、次のような結果になります。

/var/www/html/project/includes

__DIR__ は、そのコードが書かれているファイルのディレクトリを返します。

そのため、別のファイルから読み込まれた場合でも、取得される値は変わりません。

また、__DIR__ の結果には通常、末尾のスラッシュは付きません。

そのため、ファイル名と結合する場合は、次のように / を追加して書きます。

<?php
require __DIR__ . '/config.php';
?>

__DIR__はファイル読み込みでよく使う

__DIR__ は、requireinclude で別ファイルを読み込むときによく使われます。

<?php
require __DIR__ . '/config.php';
include __DIR__ . '/functions.php';
?>

このように書くと、現在の作業ディレクトリに左右されず、PHPファイル自身の場所を基準にしてファイルを読み込めます。

たとえば、相対パスだけで次のように書くこともできます。

<?php
require 'config.php';
?>

この書き方でも動作する場合はあります。

しかし、実行する場所や読み込み方によって、意図しないディレクトリを基準にしてしまうことがあります。

そのため、実務では次のように __DIR__ を使ってパスを指定する方法がよく使われます。

<?php
require __DIR__ . '/config.php';
?>

この書き方にしておくと、ファイル構成が少し複雑になった場合でも、パスの指定ミスを防ぎやすくなります。

dirname(FILE)でファイルのディレクトリを取得する

dirname(__FILE__) でも、現在のPHPファイルが置かれているディレクトリを取得できます。

<?php
echo dirname(__FILE__);
?>

__FILE__ は、そのPHPファイル自身のフルパスを返すマジック定数です。

<?php
echo __FILE__;
?>

実行結果の例は次のようになります。

/var/www/html/project/index.php

この __FILE__dirname() を使うと、ファイル名を除いたディレクトリ部分を取得できます。

<?php
echo dirname(__FILE__);
?>

実行結果の例は次のようになります。

/var/www/html/project

現在のPHPでは、dirname(__FILE__) よりも __DIR__ を使う方が簡潔です。

<?php
// 現在よく使われる書き方
require __DIR__ . '/config.php';

// 古いコードで見かけることがある書き方
require dirname(__FILE__) . '/config.php';
?>

古いPHPコードでは dirname(__FILE__) が使われていることがありますが、新しくコードを書く場合は、基本的に __DIR__ を使えば問題ありません。

__DIR__とdirname(FILE)の違い

__DIR__dirname(__FILE__) は、ほぼ同じ目的で使えます。

<?php
echo __DIR__;
echo dirname(__FILE__);
?>

どちらも、現在のPHPファイルが置かれているディレクトリを取得できます。

違いは、主に書き方の簡潔さです。

<?php
__DIR__;

の方が短く、読みやすい書き方です。

一方、dirname(__FILE__) は、__DIR__ が使えない古いPHP環境や、古くから運用されているコードで見かけることがあります。

現在の一般的なPHP環境では、__DIR__ を使うのが自然です。

上位ディレクトリを取得する方法

PHPでは、dirname() を使うことで、現在のディレクトリより上の階層を取得できます。

設定ファイルや共通ファイルをプロジェクトの上位階層に置いている場合に便利です。

1つ上のディレクトリを取得する

現在のPHPファイルが置かれているディレクトリから、1つ上のディレクトリを取得したい場合は、dirname() を使います。

<?php
echo dirname(__DIR__);
?>

たとえば、現在のPHPファイルが次の場所にあるとします。

/var/www/html/project/app/config.php

このファイル内で __DIR__ を表示すると、次のようになります。

/var/www/html/project/app

一方、dirname(__DIR__) を使うと、1つ上の階層を取得できます。

/var/www/html/project

設定ファイルや共通ファイルが1つ上の階層にある場合は、次のように使えます。

<?php
require dirname(__DIR__) . '/config.php';
?>

または、次のように ../ を使って書くこともできます。

<?php
require __DIR__ . '/../config.php';
?>

どちらの書き方も使われますが、階層が深くなる場合は dirname() を使うと見通しがよくなることがあります。

2つ上のディレクトリを取得する

2つ上のディレクトリを取得したい場合は、dirname() の第2引数を使えます。

<?php
echo dirname(__DIR__, 2);
?>

たとえば、現在のディレクトリが次の場所だとします。

/var/www/html/project/app/config

このとき、dirname(__DIR__, 2) と書くと、2階層上のディレクトリを取得できます。

/var/www/html/project

ただし、dirname() の第2引数を使う書き方は、比較的新しいPHP環境を前提にした書き方です。

古い環境を意識する場合は、次のように dirname() を重ねる書き方もあります。

<?php
echo dirname(dirname(__DIR__));
?>

現在のPHP環境であれば、dirname(__DIR__, 2) の方がすっきり書けます。

$_SERVER[‘DOCUMENT_ROOT’]で公開ルートを取得する

Webサイトの公開ルートを取得したい場合は、$_SERVER['DOCUMENT_ROOT'] を使うことがあります。

<?php
echo $_SERVER['DOCUMENT_ROOT'];
?>

実行結果の例は次のようになります。

/var/www/html

$_SERVER['DOCUMENT_ROOT'] は、Webサーバーで公開されているルートディレクトリを表します。

たとえば、Webサイトが次のような構成になっているとします。

/var/www/html/
├── index.php
├── images/
├── css/
└── uploads/

この場合、$_SERVER['DOCUMENT_ROOT'] は次のような値になることがあります。

/var/www/html

公開ディレクトリを基準にして画像やアップロードファイルのパスを作る場合に使えます。

<?php
$imagePath = $_SERVER['DOCUMENT_ROOT'] . '/images/sample.jpg';
?>

ただし、$_SERVER['DOCUMENT_ROOT'] はWebサーバー経由で実行されることを前提にした値です。

CLI、つまりコマンドラインからPHPを実行する場合は、期待通りに利用できないことがあります。

また、実行環境によっては DOCUMENT_ROOT が必ず存在するとは限りません。

安全に使う場合は、次のように確認しておくとよいです。

<?php
if (isset($_SERVER['DOCUMENT_ROOT'])) {
    echo $_SERVER['DOCUMENT_ROOT'];
} else {
    echo 'DOCUMENT_ROOT は利用できません';
}
?>

getcwd()と__DIR__の違い

getcwd()__DIR__ は、どちらもディレクトリを取得するために使えますが、意味が異なります。

getcwd()は作業ディレクトリを返す

getcwd() は、現在の作業ディレクトリを返します。

<?php
echo getcwd();
?>

getcwd() が返すのは、PHPプロセスが現在作業ディレクトリとして認識している場所です。

そのため、PHPファイル自身が置かれている場所と同じになるとは限りません。

__DIR__はファイル自身のディレクトリを返す

一方、__DIR__ は、そのPHPファイルが置かれているディレクトリを返します。

<?php
echo __DIR__;
?>

たとえば、次のようなファイル構成があるとします。

project/
├── index.php
└── sub/
    └── test.php

index.php から sub/test.php を読み込むとします。

<?php
require __DIR__ . '/sub/test.php';
?>

sub/test.php の中に次のコードを書きます。

<?php
echo 'getcwd(): ' . getcwd() . '<br>';
echo '__DIR__: ' . __DIR__ . '<br>';
?>

この場合、結果は次のようになることがあります。

getcwd(): /var/www/html/project
__DIR__: /var/www/html/project/sub

このように、getcwd() はPHPプロセスの作業ディレクトリを返し、__DIR__ はコードが書かれているPHPファイルの場所を返します。

そのため、ファイル読み込みや設定ファイルの参照では、getcwd() よりも __DIR__ の方が扱いやすい場面が多いです。

chdir()で現在の作業ディレクトリを変更する

PHPでは、chdir() を使って現在の作業ディレクトリを変更できます。

<?php
echo getcwd();

chdir('/tmp');

echo getcwd();
?>

chdir('/tmp') を実行すると、getcwd() が返す値は変更されます。

一方で、__DIR__ は変更されません。

<?php
echo __DIR__;

chdir('/tmp');

echo __DIR__;
?>

__DIR__ は、そのPHPファイルが置かれているディレクトリを表すため、chdir() の影響を受けません。

つまり、chdir() の影響を受けるのは getcwd() であり、__DIR__ は常にファイル自身の場所を基準にします。

パスを組み立てるときの注意点

PHPでディレクトリパスを扱うときは、パスの結合方法に注意が必要です。

特に、スラッシュの付け忘れや、存在しないパスに対する処理には気をつけましょう。

スラッシュの付け忘れに注意する

__DIR__ の末尾には通常、スラッシュが付きません。

たとえば、次のように書くと、ディレクトリ名とファイル名が直接つながってしまいます。

<?php
$path = __DIR__ . 'config.php';
?>

この場合、次のような意図しないパスになる可能性があります。

/var/www/html/projectconfig.php

正しくは、次のように / を入れます。

<?php
$path = __DIR__ . '/config.php';
?>

DIRECTORY_SEPARATORを使う方法もある

Windows環境との互換性を意識する場合は、DIRECTORY_SEPARATOR を使うこともできます。

<?php
$path = __DIR__ . DIRECTORY_SEPARATOR . 'config.php';
?>

ただし、PHPではWindows環境でも / が使える場面が多いため、Webアプリケーションでは次のような書き方もよく使われます。

<?php
$path = __DIR__ . '/config.php';
?>

プロジェクトの方針に合わせて、読みやすい書き方を選ぶとよいでしょう。

パスが正しいか確認する方法

取得したディレクトリや作成したパスが正しいか確認したい場合は、file_exists()is_dir()realpath() などを使います。

file_exists()でファイルの存在を確認する

ファイルが存在するか確認する例です。

<?php
$path = __DIR__ . '/config.php';

if (file_exists($path)) {
    echo 'ファイルは存在します';
} else {
    echo 'ファイルが見つかりません';
}
?>

file_exists() は、指定したファイルまたはディレクトリが存在するかを確認するときに使えます。

is_dir()でディレクトリの存在を確認する

ディレクトリが存在するか確認する例です。

<?php
$dir = __DIR__ . '/uploads';

if (is_dir($dir)) {
    echo 'ディレクトリは存在します';
} else {
    echo 'ディレクトリが見つかりません';
}
?>

is_dir() は、指定したパスがディレクトリかどうかを確認する関数です。

realpath()で絶対パスを確認する

既に存在するファイルやディレクトリの正規化された絶対パスを確認したい場合は、realpath() が使えます。

<?php
echo realpath(__DIR__ . '/../config.php');
?>

realpath() は、存在するパスに対して正規化された絶対パスを返します。

ただし、対象のファイルやディレクトリが存在しない場合は false を返します。

そのため、これから作成する予定のファイルパスを確認する用途には向いていません。

実務での使い分け

PHPでディレクトリを取得する場合は、目的に応じて使い分けるのが基本です。

ファイル読み込みには__DIR__を使う

requireinclude で別ファイルを読み込む場合は、__DIR__ を使うのがおすすめです。

<?php
require __DIR__ . '/config.php';
require __DIR__ . '/functions.php';
?>

1つ上の階層にあるファイルを読み込む場合は、次のように書けます。

<?php
require dirname(__DIR__) . '/config.php';
?>

または、次のように書くこともできます。

<?php
require __DIR__ . '/../config.php';
?>

作業ディレクトリの確認にはgetcwd()を使う

PHPが現在どのディレクトリを作業ディレクトリとして認識しているか確認したい場合は、getcwd() を使います。

<?php
var_dump(getcwd());
?>

特に、相対パスでファイルを読み込もうとして失敗する場合、getcwd() を使って現在の作業ディレクトリを確認すると、原因を見つけやすくなります。

公開ルートを基準にするならDOCUMENT_ROOTを使う

Webサーバーの公開ルートを基準にしてファイルパスを作りたい場合は、$_SERVER['DOCUMENT_ROOT'] が使えます。

<?php
$uploadPath = $_SERVER['DOCUMENT_ROOT'] . '/uploads/sample.jpg';
?>

ただし、CLI環境やサーバー設定によっては使えない場合があるため、必要に応じて isset() で確認しておくと安全です。

<?php
if (isset($_SERVER['DOCUMENT_ROOT'])) {
    $uploadPath = $_SERVER['DOCUMENT_ROOT'] . '/uploads/sample.jpg';
}
?>

よくある使用例

PHPで現在のディレクトリを取得する処理は、設定ファイルの読み込み、アップロード先の指定、ログファイルの保存などでよく使われます。

config.phpを読み込む

<?php
require __DIR__ . '/config.php';
?>

1つ上の階層にあるconfig.phpを読み込む

<?php
require dirname(__DIR__) . '/config.php';
?>

または、次のように書けます。

<?php
require __DIR__ . '/../config.php';
?>

uploadsディレクトリのパスを作る

<?php
$uploadDir = __DIR__ . '/uploads';
?>

logsディレクトリ内のログファイルを指定する

<?php
$logFile = __DIR__ . '/logs/error.log';
?>

Web公開ルートから画像パスを作る

<?php
$imagePath = $_SERVER['DOCUMENT_ROOT'] . '/images/sample.jpg';
?>

現在の作業ディレクトリを確認する

<?php
echo getcwd();
?>

初心者が間違えやすいポイント

PHPで現在のディレクトリを取得するときは、似たような書き方を混同しやすいです。

特に、getcwd()__DIR__ の違い、相対パスの扱い、DOCUMENT_ROOT の利用範囲には注意しましょう。

getcwd()をファイル自身の場所だと思ってしまう

getcwd() は、現在の作業ディレクトリを返します。

そのPHPファイルが置かれているディレクトリを返すわけではありません。

ファイル自身の場所を取得したい場合は、次のように __DIR__ を使います。

<?php
echo __DIR__;
?>

相対パスだけでファイルを読み込んでしまう

次のような相対パスの指定でも動作する場合はあります。

<?php
require 'config.php';
?>

しかし、ファイル構成や実行方法によっては、想定と違う場所を参照する可能性があります。

そのため、安定したパス指定にしたい場合は、次のように __DIR__ を使います。

<?php
require __DIR__ . '/config.php';
?>

DOCUMENT_ROOTをどこでも使えると思ってしまう

$_SERVER['DOCUMENT_ROOT'] はWebサーバーの公開ルートを取得するために便利です。

しかし、CLIで実行するPHPスクリプトでは、期待通りに使えない場合があります。

そのため、Webサーバー経由で使うのか、CLIでも動かすのかを考えたうえで使い分けることが大切です。

まとめ

PHPで現在のディレクトリを取得する方法には、主に getcwd()__DIR__dirname(__FILE__)$_SERVER['DOCUMENT_ROOT'] があります。

現在の作業ディレクトリを取得する場合

現在の作業ディレクトリを取得したい場合は、getcwd() を使います。

<?php
echo getcwd();
?>

PHPファイル自身のディレクトリを取得する場合

現在のPHPファイルが置かれているディレクトリを取得したい場合は、__DIR__ を使います。

<?php
echo __DIR__;
?>

古いコードでは、次のような書き方も使われます。

<?php
echo dirname(__FILE__);
?>

Webサーバーの公開ルートを取得する場合

Webサーバーの公開ルートを取得したい場合は、$_SERVER['DOCUMENT_ROOT'] を使います。

<?php
echo $_SERVER['DOCUMENT_ROOT'];
?>

実務では__DIR__を基準にすると扱いやすい

実務では、requireinclude、設定ファイルの読み込み、ログファイルの保存先指定などでは、__DIR__ を基準にする書き方がよく使われます。

<?php
require __DIR__ . '/config.php';
?>

一方、getcwd() は現在の作業ディレクトリを確認するための関数です。

ファイル自身の場所を取得する目的では、__DIR__ を使う方が安全です。

以上、PHPで現在のディレクトリを取得する方法についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次