PHP:需要路径不适用于cron作业?

时间:2010-06-25 14:16:15

标签: php include cron require absolute-path

我有一个需要包含此文件的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';

谢谢!

6 个答案:

答案 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 answer

还要检查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 . "/..");

等等。