PHPでサーバーの絶対パス(フルパス)を調べる方法と関数・定数の使い分け

ノートパソコンで作業中

「サーバーのフルパスを書いてください」と言われて、固まった経験はありませんか。とくに自分で借りたわけではない、クライアント側のレンタルサーバーをいじるときに困りがちです。FTPでつないでも見えるのはドメイン直下の階層だけで、その上の /home/アカウント名/www/ のような“本当の住所”は教えてくれません。

私はWeb制作を25年やってきて、この「絶対パスが分からなくて作業が止まる」場面に何百回と出くわしました。サーバーの管理画面にも書いていない、サポートに聞いても即答してもらえない、そんなことも珍しくありません。そのたびに使ってきたのが、PHPでパスを一行表示させる小さなテクニックです。やり方さえ覚えてしまえば、初めて触るサーバーでも数十秒で答えにたどり着けます。

この記事では、PHPでサーバーの絶対パス(フルパス)を調べる具体的な方法と、__FILE____DIR__dirname()$_SERVER['DOCUMENT_ROOT']realpath()getcwd()といった似て非なる関数・定数の違いと使い分けまで、2026年の最新のPHP事情にあわせて整理します。

そもそも「絶対パスって何だっけ?」という方も置いていきません。相対パスとの違い、phpinfo()での確認、WordPressで使う ABSPATH の話まで、ひととおり押さえれば、もう「フルパス教えて」と言われて困ることはなくなります。

そもそも絶対パス(フルパス)とは?相対パスとの違い

本題のコードに入る前に、言葉の整理をしておきます。ここがあいまいだと、せっかくパスを調べても「で、どっちを書けばいいの?」と迷ってしまうからです。

絶対パス(フルパス)とは、サーバーのいちばん根っこ(ルート)から目的のファイルまでを、省略せずに全部書いた“住所”のことです。たとえば /home/example/www/blog/index.php のように、最初の / から始まる表記がそれにあたります。どこから見ても場所が一意に定まるのが特徴です。

いっぽう相対パスは、「いま自分がいる場所」を基準にした道案内です。同じフォルダなら image.png、ひとつ上の階層なら ../config.php といった書き方になります。短く書けて移動にも強い反面、基準がズレると一気に迷子になります。

WebページのリンクやCSSの読み込みは相対パスで書くことが多いのですが、サーバー設定ファイルやPHPの include、ファイルの読み書きでは絶対パスを求められる場面が少なくありません。だからこそ「自分のサーバーの絶対パスはこれだ」と即答できる状態にしておくと、作業が一気にスムーズになります。

PHPで絶対パスを一発で表示する基本のコード

いちばん手軽なのが、PHPのマジック定数 __FILE__ を使う方法です。たった一行のPHPファイルをサーバーに置いてブラウザで開くだけで、そのファイルの絶対パスがそのまま画面に表示されます。

手順

テキストエディタに次の一行を書きます。

<?php echo __FILE__; ?>

これを path.php のような名前で保存し(ファイル名は何でも構いません)、調べたいサーバーの任意のディレクトリにFTPなどでアップロードします。あとはブラウザで https://example.com/path.php のようにアクセスするだけ。すると、そのファイルが置かれている絶対パスが表示されます。

/home/example/www/path.php

この末尾のファイル名を取り除いた /home/example/www/ が、いま作業しているディレクトリの絶対パスというわけです。共有サーバーでもクライアントのサーバーでも、PHPさえ動けばこの方法はまず通用します。

__FILE__とは何か

__FILE__ は、実行中のPHPファイルのフルパスとファイル名を返す「マジック定数」です。PHP公式マニュアルによれば、返す値はシンボリックリンクを解決した絶対パスであると明記されています。つまり途中にシンボリックリンクが挟まっていても、実体のパスをきちんと返してくれます。

ちなみに includerequire で読み込まれたファイルの中で使うと、呼び出した側ではなく“読み込まれたファイル自身”のパスが返る点も覚えておくと安心です。

出典:PHP公式マニュアル「マジック定数」

__DIR__・dirname(__FILE__)でディレクトリだけを取得する

ファイル名はいらない、フォルダのパスだけ欲しい——というケースはとても多いです。include のベースパスを組み立てるときなどがそうですね。そんなときに毎回ファイル名を手で削るのは面倒ですし、ミスのもとです。

そこで使うのが __DIR__ です。__DIR__ は、実行中ファイルが置かれているディレクトリの絶対パスを返します。末尾にスラッシュは付きません(ルートディレクトリの場合を除く)。

<?php echo __DIR__; ?>
// 出力例: /home/example/www

同じことを、関数を使って dirname(__FILE__) と書くこともできます。PHP公式マニュアルにも「__DIR__dirname(__FILE__) と等価」とあり、どちらも同じディレクトリパスを返します。

<?php echo dirname(__FILE__); ?>
// 上の __DIR__ と同じ結果になる

__DIR__ はPHP 5.3から使える定数で、今となっては実質すべての現役環境で問題なく動きます。短く読みやすいので、新しく書くなら __DIR__ を選んでおけばまず間違いありません。古いコードで dirname(__FILE__) を見かけても、これは同じ意味だと分かっていれば慌てずに済みます。

ファイルの読み込みでよく使うのは、こんな形です。

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

こう書いておくと、どのディレクトリから呼び出されても config.php を確実に読み込めます。相対パスだけで require_once 'config.php'; と書くより、はるかに事故が少なくなります。

出典:PHP公式マニュアル「マジック定数」

$_SERVER[‘DOCUMENT_ROOT’]でドキュメントルートを調べる

もうひとつ覚えておきたいのが $_SERVER['DOCUMENT_ROOT'] です。これは __FILE__ とは目線が違い、そのファイルが置かれた場所ではなく、Webサーバーの「ドキュメントルート(公開ディレクトリの起点)」の絶対パスを返します。

<?php echo $_SERVER['DOCUMENT_ROOT']; ?>
// 出力例: /home/example/www

PHP公式マニュアルでは、この値は「現在のスクリプトが実行されているドキュメントルートのディレクトリで、サーバーの設定ファイルで定義されたもの」と説明されています。末尾にスラッシュは付きません。サイトのトップを起点にパスを組み立てたいときに便利で、たとえば次のように画像や設定ファイルへのフルパスを作れます。

<?php
$path = $_SERVER['DOCUMENT_ROOT'] . '/assets/logo.png';
echo $path;
?>

ただし注意点があります。$_SERVER['DOCUMENT_ROOT'] はWebサーバー側の設定に依存する値なので、公式も「サーバー環境を自分で管理していないなら、正しくセットされている保証はない」と注意を促しています。バーチャルホストの構成やコマンドライン実行では空だったり、想定と違う値になることもあります。確実にファイルの位置を基準にしたいなら __DIR__、サイトの公開起点を知りたいなら $_SERVER['DOCUMENT_ROOT']、と目的で使い分けるのがコツです。

出典:PHP公式マニュアル「$_SERVER」

realpath()とgetcwd()の違いと使いどころ

絶対パスがらみでよく一緒に語られるのが realpath()getcwd() です。名前は似ていませんが、どちらも「パスを正しく解決する」道具なので、違いをはっきりさせておきましょう。

realpath():相対パスを絶対パスに正規化する

realpath() は、渡したパスを正規化された絶対パスに変換して返す関数です。PHP公式マニュアルによると、シンボリックリンクをすべて展開し、/.//../、余分な / といった冗長な部分もきれいに解消してくれます。

<?php
echo realpath('../images/./logo.png');
// 例: /home/example/www/images/logo.png
?>

ここで一点、ハマりやすい落とし穴があります。realpath() は対象のファイルやディレクトリが実在しないと false を返します。「まだ作っていないファイルのパスを組み立てたい」用途には使えません。存在チェックを兼ねたいときには逆に便利、と覚えておくとよいでしょう。

出典:PHP公式マニュアル「realpath」

getcwd():現在の作業ディレクトリを返す

getcwd() は、現在の「作業ディレクトリ(カレントディレクトリ)」の絶対パスを返す関数です。一見 __DIR__ と似ていますが、返すものは別物なので要注意です。

<?php echo getcwd(); ?>

ここが混同のもとなのですが、getcwd() が返すのは「いま実行しているファイルが置かれた場所」ではなく「カレントディレクトリ」です。Webサーバー経由ではURLで指定された主スクリプトの場所が基準になり、コマンドライン(CLI)で実行した場合はコマンドを打ったときの作業ディレクトリが返ります。つまり chdir() で作業ディレクトリを変えれば、返る値も変わります。

「そのファイル自身の場所」を確実に知りたいなら、迷わず __DIR__ を使うのが正解です。getcwd() は“今どこで作業しているか”を知りたいとき限定、くらいに考えておくと混乱しません。

出典:PHP公式マニュアル「getcwd」

phpinfo()でもサーバーのパス情報を確認できる

パスを単体で表示するだけでなく、サーバーの設定全体を見渡したいときは phpinfo() が役立ちます。これもファイルに一行書くだけです。

<?php phpinfo(); ?>

これをアップロードしてブラウザで開くと、PHPのバージョンや有効な拡張機能、設定値がずらりと並びます。このなかの「SCRIPT_FILENAME」や「DOCUMENT_ROOT」といった項目を見れば、絶対パスの情報も確認できます。パスだけでなくサーバー環境をまとめて把握したいときに重宝します。

ただし phpinfo() は情報量が多いぶん、出力されると環境が丸見えになります。確認が終わったらファイルは必ず削除しておきましょう。なお環境によっては、phpinfo() を開いてもページが真っ白で何も出ないことがあります。その対処法は別記事にまとめてありますので、つまずいたら参考にしてください。

関連記事:phpinfoを実行したらページが真っ白になって何も表示されない時の対処法

WordPressなら定数ABSPATHでルートパスが分かる

WordPressを触っているなら、もっと手軽な手があります。WordPressには ABSPATH という定数が用意されていて、これがWordPressをインストールしたルートディレクトリの絶対パスを保持しています。

<?php echo ABSPATH; ?>
// 出力例: /home/example/www/

ポイントは、$_SERVER['DOCUMENT_ROOT']__DIR__ と違い、ABSPATH は末尾にスラッシュが付くことです。WordPressの本体(wp-config.php)の中では define('ABSPATH', dirname(__FILE__) . '/'); のように定義されており、スラッシュ込みでパスを返すようになっています。そのため、ファイルを連結するときはスラッシュを重ねないよう注意が必要です。

<?php
// ○ ABSPATH は末尾にスラッシュがある
require_once ABSPATH . 'wp-admin/includes/file.php';
?>

テーマやプラグインのコードでルートからのパスを組み立てたいときは、生のパスをベタ書きするより ABSPATH を使ったほうが、環境が変わっても壊れにくくなります。私もテーマの functions.php でファイルを読み込むときは、できるだけこの定数に寄せるようにしています。

WordPressのファイル構成そのものをもう少し整理したい方は、フォルダ構成の基本をまとめた記事も合わせてどうぞ。

関連記事:WEBサイトを構築する際、基本となるフォルダ(ディレクトリ) 構成

パスを調べるときの注意点

最後に、実際に作業するうえで気をつけたいポイントをまとめておきます。どれも私が現場で痛い目を見て学んだことばかりです。

  • 確認用ファイルは使い終わったら必ず削除する:絶対パスやサーバー設定は、攻撃者にとって格好のヒントになります。path.phpphpinfo() のファイルは、用が済んだら残さないのが鉄則です。
  • ファイル名は推測されにくいものにするinfo.php のようなありがちな名前は、置いた瞬間に外部からアクセスされることがあります。確認のあいだだけでも、ユニークで分かりにくい名前にしておくと安心です。
  • OSによって区切り文字が違う:Linux系サーバーは / ですが、Windows環境では \ になることがあります。パスを文字列処理するときは、DIRECTORY_SEPARATOR を使うと環境差に強くなります。
  • 目的に合った関数・定数を選ぶ:ファイル自身の場所なら __FILE__ / __DIR__、公開ルートなら $_SERVER['DOCUMENT_ROOT']、WordPressなら ABSPATH。混ぜると思わぬバグの原因になります。

まとめ

PHPでサーバーの絶対パス(フルパス)を調べる方法を、関数・定数の違いまで含めて見てきました。一行の <?php echo __FILE__; ?> をアップロードして開くだけ、という手軽さが最大の魅力です。クライアントのサーバーでも共有サーバーでも、PHPが動けばまず通用します。

大事なのは、似た役割の道具をきちんと使い分けることです。ファイル自身の絶対パスは __FILE__、そのディレクトリは __DIR__(=dirname(__FILE__))、公開の起点は $_SERVER['DOCUMENT_ROOT']、相対パスの正規化は realpath()、作業ディレクトリは getcwd()、そしてWordPressのルートは末尾スラッシュ付きの ABSPATHこの対応さえ頭に入れておけば、パス回りで迷う時間がぐっと減ります。

とくに require_once __DIR__ . '/...' の書き方は、相対パスのつもりで書いたコードが「呼び出す場所によって動いたり動かなかったり」する事故をきれいに防いでくれます。これは今日からでも取り入れる価値があります。

そして、確認用のファイルを置きっぱなしにしないこと。セキュリティの基本ですが、忙しいとつい忘れがちです。パスを調べたら消す——ここまでをワンセットにして、安全に賢くサーバーと付き合っていきましょう。困ったときは、まず一行のPHPから試してみてください!