相当于$ _SERVER ['DOCUMENT_ROOT'],当cron调用脚本时它会起作用?

时间:2010-02-19 19:38:48

标签: php

我正在使用$_SERVER['DOCUMENT_ROOT']作为我的包含路径,因此文件将确定它们的运行位置(即它们是在实时还是暂存)并且它工作正常,除了由cron运行的脚本我必须对路径进行硬编码。

我可以使用另一个可以在cron和浏览器中使用的变量吗?

4 个答案:

答案 0 :(得分:12)

通过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脚本。

答案 2 :(得分:3)

最好的办法是定义自己的常量,您可以从应用中的任何其他位置引用该常量。例如,您可以在MyAppDirectory / public_html / index.php中输入类似的内容:

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

这将为您提供一致的MyAppDirectory /的引用,无论index.php在哪里被调用或包含。定义自己的常量不仅允许您从cron或通过浏览器调用您的应用程序,而且还允许您以更小的方式更改存储结构,只需最少的更改即可跟踪。 Zend Framework在Zend_Application引导过程中大量使用它,并且用于“php APPLICATION_PATH”的Google搜索将为您提供各种进一步的参考。

答案 3 :(得分:0)

如果您的脚本通过cron运行,则可以使用chdir()函数:

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

我在Windows上工作,所以使用“nnCron”,但它也必须在Linux上工作。