【发布时间】:2011-01-07 05:13:07
【问题描述】:
我使用 $_SERVER['DOCUMENT_ROOT']."/lib/sft_required.php";在 PHP 脚本中包含“sft_required”文件。当我使用浏览器运行此文件时,它可以正常工作,但是当我将其作为 cron 作业运行时,它不起作用。当我们通过cron运行脚本时,似乎没有包含该文件。
【问题讨论】:
我使用 $_SERVER['DOCUMENT_ROOT']."/lib/sft_required.php";在 PHP 脚本中包含“sft_required”文件。当我使用浏览器运行此文件时,它可以正常工作,但是当我将其作为 cron 作业运行时,它不起作用。当我们通过cron运行脚本时,似乎没有包含该文件。
【问题讨论】:
在使用 CLI 解释器运行 PHP 脚本时,不能期望$_SERVER 包含任何正常值。要么将路径放在环境变量中,要么将其作为命令行参数传递给脚本。
【讨论】:
假设您直接通过 cron 运行脚本(而不是从由 cronjob 触发的 HTTP 请求访问的 Web 服务器(例如,通过运行 wget 的 cron)),那么它当然不起作用。
没有服务器,所以$_SERVER没有设置。
【讨论】:
$_SERVER 超全局但它包含不同的值。
DOCUMENT_ROOT 是什么?不是很明显(其实几年后我还是不明白为什么DOC_ROOT是空白的(REMOTE_ADDR等比较明显)
您可以自行填充 $_SERVER['DOCUMENT_ROOT']
$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__);
如果 cron 文件在文档根目录中
$_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__));
如果 cron 文件是文档根目录之上的一个目录
【讨论】:
dirname(dirname(__FILE__))可以改写为dirname(__FILE__, 2)
我回答了一个类似的问题here。正如人们所提到的,超全局 $_SERVER 没有在 CLI 情况下定义。链接中是(到目前为止)获取 DOCUMENT_ROOT 位置的万无一失的方法。希望它被证明是有用的。
【讨论】:
define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1));
这将为您提供与 $_SERVER['DOCUMENT_ROOT'] 相同的 cronjobs 数据。
【讨论】:
示例 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__).'/../../');
?>
【讨论】:
我有同样的问题.. 我在互联网上找到的解决方案不适用于我的网络服务器 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 文件,更改它即可。
希望我帮助了某人,因为解决方案让我的生活变得更轻松! 它仍然不是完美的,当一切都自动运行时,它会完美,但对我来说这比以前的系统要容易得多,所以我坚持我会分享我的经验,也许我可以帮助某人:)!
【讨论】:
这是我处理过的类似问题的解决方案。
$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "wp-content" ) );
就我而言,我正在运行一个在我的主题内执行文件的 cron。 (我不为玉米加载 WordPress,所以我无权访问 ABSPATH 之类的东西。
这样,我通过使用通向我的脚本的根目录中的 first 子文件夹来获取我的“根目录”,而不是从脚本目录返回。
/var/more_directories/public_html/wp-content/themes/theme-name/includes/cron-jobs
/var/more_directories/public_html/
这意味着我不必担心移动我的脚本,因为它总是在第一个子文件夹下的某个地方。
【讨论】:
在我的情况下,这个问题是由$_SERVER['DOCUMENT_ROOT'] 路径在正常站点操作期间具有斜杠而在 cron 作业期间没有斜杠造成的。
我不确定导致这种情况发生的原因,但作为一种解决方法,我将代码切换为使用 ABSPATH,因为它似乎返回了一致的值。
所以,换句话说,我改变了这个:
$private_folder = realpath($_SERVER['DOCUMENT_ROOT'] . "../private_html");
到这里:
$private_folder = realpath(ABSPATH . "../private_html");
对于这个问题还有其他几种解决方案,例如使用str_replace 或rtrim。
【讨论】:
这个解决方案对我有用:
$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "public_html" ) ).'public_html';
【讨论】: