同事回報排程腳本在瀏覽器訪問正常,但命令行執行卻報 require 路徑錯誤。經排查,發現是 CLI 模式下的「當前工作目錄」非腳本所在目錄 導致相對路徑失效。
php /path/to/script.php 的工作目錄是 執行命令時所在的目錄,而非腳本目錄。require '../lib/config.php' 會相對於「命令執行目錄」解析,導致找不到檔案。| 方案 | 做法 | 優點 | 缺點 |
|---|---|---|---|
| 1. 全部改絕對路徑 | 將所有 require/include 改為 __DIR__ . '/../lib/config.php' |
徹底解決,無執行環境依賴 | 改動量大,巢狀引入檔案易遺漏 |
2. 入口檔案統一 chdir()(推薦) |
腳本開頭加入 chdir(dirname(__FILE__)); 或 chdir(__DIR__); |
一次修正,所有相對路徑自動生效,侵入性最小 | 需確保入口檔案最先執行 |
# 檢查語法 php -l script.php # 顯示版本與運行模式 php -v # 解析並執行檔案 php -f script.php # 直接執行代碼片段(無需 標籤) php -r 'echo "hello!";' # 進入互動模式 php -a # 顯示模組列表 php -m # 指定 php.ini 路徑 php -c /path/to/php.ini # 語法高亮輸出 php -s script.php # 移除註解與空白輸出 php -w script.php
$_SERVER['SCRIPT_FILENAME']:CLI 下為絕對路徑,可靠。__DIR__ / dirname(__FILE__):永遠指向「當前檔案所在目錄」,最穩健的基準點。getcwd():返回「命令執行時的工作目錄」,CLI 下不可信。💡 最佳實踐:在所有 CLI 入口腳本(排程、佇列消費者、遷移腳本)頂部統一加入 chdir(__DIR__);,徹底消除路徑困擾。