2010-02-19 37 views
5

我爲我的包含路徑使用$_SERVER['DOCUMENT_ROOT'],因此文件會找出它們的運行位置(即它們是否處於活動狀態或暫存狀態)並且工作正常,除了由cron運行的腳本,我必須硬編碼路徑。

是否有另一個變量,我可以使用,可以從cron和瀏覽器工作?

回答

10

當通過cron運行你的PHP腳本時,我假設它是在CLI的上下文中而不是web服務器上執行的。在從CLI執行PHP的情況下,$ _SERVER ['DOCUMENT_ROOT']未正確填充。您可以使用下面的代碼來解決此問題:

if ($_SERVER['DOCUMENT_ROOT'] == "") 
    $_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__); 
+1

如果從子文件夾運行的腳本將返回子文件夾。 –

5

下面將爲您,您的腳本所在的目錄:

realpath(dirname(__FILE__)); 

這同時適用於Web請求和cron腳本。

+0

使用realpath幫助我在windows系統上工作時,謝謝。 – CrandellWS

3

要做的最好的事情是定義自己的常量,您可以從應用程序中的任何其他地方引用它。例如,你可以把這樣的事情在MyAppDirectory /的public_html/index.php文件:

define('APPLICATION_PATH', realpath(dirname(__FILE__).'/..')); 

這會給你一個一致的參考回到MyAppDirectory /無論在哪裏的index.php被稱爲或包括在內。定義你自己的常量不僅可以讓你從cron或通過瀏覽器調用你的應用程序,而且還可以讓你以更大的方式改變你的存儲結構,只需要最少的修改就可以跟蹤。 Zend Framework在Zend_Application引導過程中大量使用它,並且使用「php APPLICATION_PATH」搜索將爲您提供各種其他引用。

0

可以使用chdir()功能,如果您的腳本通過cron運行:

chdir(dirname(__FILE__)); //avoid conflict with "cron path" and app base path (if script runs via 'Cron') 

我在Windows上運行,所以用「nnCron」但它也必須在Linux上工作。

相關問題