我有一个需要包含此文件的cron作业:
require '../includes/common.php';
但是,当它通过cron作业(而不是我的本地测试)运行时,相对路径不起作用。 cron作业运行以下文件(在实时服务器上):
/home/username123/public_html/cron/mycronjob.php
这是错误:
Fatal error: require(): Failed opening required '../includes/common.php'
(include_path='.:/usr/lib/php:/usr/local/lib/php') in
/home/username123/public_html/cron/mycronjob.php on line 2
使用与cron作业相同的绝对格式,common.php
位于
/home/username123/public_html/includes/common.php
这是否意味着我必须用以下代码替换我的第2行:
require '/home/username123/public_html/includes/common.php';
谢谢!
答案 0 :(得分:25)
从技术上看,php脚本是在cron所在的位置运行的;恩。如果cron在/ bin / cron中,则此语句将在/bin/includes/common.php中查找common.php。
所以是的,你可能不得不使用完整路径或使用set_include_path
set_include_path('/home/username123/public_html/includes/');
require 'common.php';
答案 1 :(得分:25)
NONO。你需要在crons上使用绝对路径。
我所做的是:
// supouse your cron is on app/cron and your lib is on app/lib
$base = dirname(dirname(__FILE__)); // now $base contains "app"
include_once $base . '/lib/db.inc';
// move on
答案 2 :(得分:3)
所有人都尊重所有当前答案,所以他们全都采用了“更改php代码”的方法。
我不想更改PHP文件只是为了从cron
运行它,因为它降低了代码的可移植性,并增加了忘记更改一个或两个相对路径并破坏程序的机会。
请改为在cron
标签行中更改目录,并保持所有相对路径和PHP文件不变。例如
1 1 * * * cd /home/username/public_html/&& php -f script.php
还要检查this article,我会引用相关部分
取决于PHP脚本中的代码,只有从特定目录中调用时,它才能正确运行。例如,如果脚本使用相对路径包括文件,则只有从正确的目录中调用脚本时,脚本才会运行。以下命令显示如何从特定目录调用PHP脚本:
cd /home/username/public_html/; php -q script.php
答案 3 :(得分:0)
如果相对路径不起作用,则表示当cron任务运行时设置的当前目录不是/ home / username123 / public_html。在这种情况下,您只能使用绝对路径。
答案 4 :(得分:0)
听起来就像您正在运行的某个脚本正在设置include_path并且您正在包含该脚本一样简单。使用phpinfo()检查include_path全局与本地设置。
答案 5 :(得分:0)
建议绝对路径规范的解决方案的替代方法是在脚本中使用chdir
。这样,您的相对路径将按预期工作。
例如,要切换到脚本目录:
$curr_dir = dirname(__FILE__);
chdir($curr_dir);
要更改为脚本的父目录:
$curr_dir = dirname(__FILE__);
chdir($curr_dir . "/..");
等等。