今天用到了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