我使用$ _SERVER ['DOCUMENT_ROOT']。“/ lib / sft_required.php”;在PHP脚本中包含'sft_required'文件。当我使用浏览器运行此文件时,它工作正常但是当我将其作为cron作业运行时,它不起作用。当我们通过cron运行脚本时,似乎不包含该文件。
答案 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)
$_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_replace
或rtrim
。
答案 9 :(得分:0)
这个解决方案对我有用:
$site_root_directory = substr( __DIR__, 0, strpos( __DIR__, "public_html" ) ).'public_html';