PHP require在Linux下的路徑

今天用到了Linux的定時執行任務(crontab),發現始終無法正確進行發送郵件,最後發現問題出在require的路徑上。


錯誤:

require('../includes/common.php');(在windows系統下似乎是可以正確執行的,但是定時執行Linux不認,故更好的應對應該使用絕對路徑如下)



正確的應該是:

require(dirname(__FILE__).'/../includes/common.php');



以下有朋友遇到的相同的問題,較爲詳細:

有時,會遇到這樣的包含文件的方法:
 


複製代碼 代碼示例:
require_once('../../lib/some_class.php');
這種寫法的缺點:
它首先查找指定的php包含路徑,然後查找當前目錄。
因此會檢查過多路徑。
如果該腳本被另一目錄的腳本包含,它的基本目錄變成了另一腳本所在的目錄。


另外一個問題就是:當定時任務運行該腳本,它的上級目錄可能就不是工作目錄了。


因此,最佳選擇是使用絕對路徑,例如:
 


複製代碼 代碼示例:
define('ROOT' , '/var/www/project/');
require_once(ROOT . '../../lib/some_class.php');

以上代碼定義了一個絕對路徑, 值被寫死了。


下面,加以改進,路徑 /var/www/project 也可能會改變, 那麼每次都要改變它嗎? 不是的,可以使用__FILE__常量,例如:
 


複製代碼 代碼示例:
define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
require_once(ROOT . '../../lib/some_class.php');

 
現在,無論移到哪個目錄,如移到一個外網的服務器上,代碼無須更改便可正確運行。
也就是用到了pathinfo__FILE__常量,實現了可移植的代碼。


轉載自:http://www.jbxue.com/article/12927.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章