$ _SERVER ['DOCUMENT_ROOT']在通过cron运行的php脚本中不起作用

时间:2010-01-20 10:18:58

标签: php cron

我使用$ _SERVER ['DOCUMENT_ROOT']。“/ lib / sft_required.php”;在PHP脚本中包含'sft_required'文件。当我使用浏览器运行此文件时,它工作正常但是当我将其作为cron作业运行时,它不起作用。当我们通过cron运行脚本时,似乎不包含该文件。

10 个答案:

答案 0 :(得分:63)

你可以自己填充$ _SERVER ['DOCUMENT_ROOT']

$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);

如果cron文件位于文档根目录

$_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__));

如果cron文件是文档根目录

之上的一个目录

答案 1 :(得分:23)

假设您直接通过cron运行脚本(而不是通过cronjob触发的HTTP请求访问的Web服务器(例如通过运行wget的cron)),那么它当然不起作用。

没有服务器,因此未设置$_SERVER

答案 2 :(得分:7)

使用CLI解释器运行PHP脚本时,不能指望

$_SERVER包含任何正常值。将路径放在环境变量中,或者将其作为命令行参数传递给脚本。

答案 3 :(得分:4)

我回答了类似的问题here。正如人们所提到的,超级全局$ _SERVER未在CLI情境中定义。链接是一种(迄今为止)用于获取DOCUMENT_ROOT位置的万无一失的方法。希望它证明是有用的。

答案 4 :(得分:1)

define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1));

对于cronjobs,这将为您提供与$_SERVER['DOCUMENT_ROOT']相同的数据。

答案 5 :(得分:1)

示例1:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/cron/script.php - CRON PHP脚本;

<?php
/** DOCUMENT_ROOT -> /var/www/site.com/ */
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../');
?>

示例2:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/sub_dir/cron/script.php - CRON PHP脚本;

<?php
/** DOCUMENT_ROOT -> /var/www/site.com/ */
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../');
?>

答案 6 :(得分:0)

我有同样的问题.. 而且我在Internet上找到的解决方案无法与我的Web服务器cron一起使用,因此我需要找到另一种方法来轻松地更改该路径。

而且这几乎不是很大的问题,当您有1-2个cron文件(可以根据需要轻松编辑文件路径),但是我有20个cron文件,并且当我需要更改服务器或更改路径或smt时,则必须更改所有这些文件,更改它们上的文件路径...

所以我找到了至少FOR ME优秀的解决方案:在cron文件夹中创建了一个文件path.php ,并将其与cron文件放在了相同的文件夹中,然后您就可以包括它了而不会出错。

path.php中,我有$path = '/server/root/path';

然后我将该path.php包含到我的cron文件中(我大约有20个cron文件)

现在我在cron文件中使用该$ path,如下所示:

include 'path.php';
include $path.'/includes/db.php';

现在,如果我需要更改路径,则只需打开path.php文件,对其进行更改即可正常工作。

希望我能帮助某人,因为解决方案极大地改变了我的生活! 它仍然不完美,bc完美是当所有功能都可以自动运行时,但是对我来说,这比以前的系统要容易得多,所以我将分享我的经验,也许我可以帮助某人:)!

答案 7 :(得分:0)

这是我解决的类似问题的解决方案。

$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "wp-content" ) );

就我而言,我正在运行一个cron,该cron在主题内执行文件。 (我没有将WordPress用于玉米,所以我无法访问ABSPATH之类的东西。)

这样,我通过使用指向脚本的根目录下的 first 子文件夹来获取“根目录”,而不是从脚本目录返回目录。

/var/more_directories/public_html/wp-content/themes/theme-name/includes/cron-jobs /var/more_directories/public_html/

这意味着我不必担心移动脚本,因为它始终位于第一个子文件夹下。

答案 8 :(得分:0)

就我而言,此问题是由$_SERVER['DOCUMENT_ROOT']路径引起的,该路径在常规站点操作期间具有斜杠,而在cron作业期间没有斜杠。

我不确定导致这种情况发生的原因,但是作为一种变通办法,我切换了代码以改为使用ABSPATH,因为它似乎返回了一致的值。

因此,换句话说,我对此进行了更改:

$private_folder = realpath($_SERVER['DOCUMENT_ROOT'] . "../private_html");

对此:

$private_folder = realpath(ABSPATH . "../private_html");

对于该问题,还有其他几种解决方案,例如使用str_replacertrim

答案 9 :(得分:0)

这个解决方案对我有用:

$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "public_html" ) ).'public_html';