萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> PHP 程式設計

PHP 取得網站根目錄實體路徑的三種常用方法

在 PHP 專案中,取得網站根目錄的實體絕對路徑是載入設定檔、引入類庫、寫入日誌的基礎。本文整理三種主流做法,說明適用場景與優缺點。

方法一:__FILE__ + $_SERVER['PHP_SELF'] 推導 (傳統相容)

define('WWWROOT', str_ireplace(
    str_replace('/', '\\', $_SERVER['PHP_SELF']),
    '',
    __FILE__
) . '\\');
  • 原理:用目前執行腳本的 URL 路徑 (PHP_SELF) 從絕對檔案路徑 (__FILE__) 中移除,得到根目錄。
  • 優點:PHP 4/5 早期版本皆可用,無額外函數呼叫。
  • 缺點:若腳本在子目錄、或透過符號連結、重寫規則存取,易算錯;Windows/Unix 路徑分隔符處理繁瑣。

方法二:dirname(__FILE__) 向上導航 (現代標準,PHP 5.3+)

define('WWW_PATH', str_replace('\\', '/', realpath(dirname(__FILE__) . '/../')));
  • 原理:__FILE__ → 所在目錄 → ../ 回專案根目錄 → realpath() 解析絕對路徑並統一分隔符。
  • 優點:語意清晰、跨平台、realpath() 自動解析符號連結。
  • 注意:/../ 層數需依專案結構調整 (如 public/index.php 則為 /../,public/api/v1/index.php 則為 /../../../)。

方法三:$_SERVER['DOCUMENT_ROOT'] (最簡單,但受伺服器設定影響)

$root = $_SERVER['DOCUMENT_ROOT']; // 例如 /var/www/html 或 C:/inetpub/wwwroot
  • 來源:Web 伺服器 (Apache/Nginx/IIS) 設定的虛擬主機根目錄。
  • 優點:零運算、效能最佳。
  • 缺點:若 PHP 以 CLI 模式執行 (排程、佇列工作者) 此值為空;虛擬主機、別名、符號連結可能導致與實際專案根目錄不符。

最佳實踐建議

  1. 入口檔 (public/index.php) 統一定義常數:
    // public/index.php
    define('ROOT_PATH', realpath(__DIR__ . '/../'));
  2. 全專案統一使用 ROOT_PATH,避免重複計算與不一致。
  3. Composer 專案可直接用 vendor/autoload.php 所在目錄推導:realpath(__DIR__ . '/../../')。
  4. CLI 腳本啟動時同樣 require 入口檔或自行定義,確保常數可用。

快速對照表

方法PHP 版本CLI 可用符號連結安全推薦度
__FILE__ + PHP_SELF≥ 4.0否否★
dirname + realpath≥ 5.3是是★★★
DOCUMENT_ROOT≥ 4.0否視設定★★

採用「入口檔定義 ROOT_PATH + realpath」模式,是現代 PHP 專案 (Laravel, Symfony, ThinkPHP, 原生) 的標準作法。

copyright © 萬盛學電腦網 all rights reserved