29

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

?

谢谢!

4

6 回答 6

33

技术上看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';
于 2010-06-25T14:18:01.023 回答
31

所有人都尊重所有当前的答案,他们都采用了“更改 php 代码”的方法。

我不喜欢仅仅为了从 a 运行它而更改我的 PHP 文件,cron因为它降低了代码的可移植性并增加了忘记更改一两个相对路径并破坏程序的机会。

而是更改cron选项卡行的目录,并保持所有相对路径和 PHP 文件不变。例如

1 1 * * * cd /home/username/public_html/&& php -f script.php

检查这个答案

也检查这篇文章,我会引用相关部分

根据您的 PHP 脚本中的代码,它可能只有在从特定目录调用时才能正确运行。例如,如果脚本使用相对路径来包含文件,则只有从正确的目录调用它才会运行。以下命令显示如何从特定目录调用 PHP 脚本:

cd /home/username/public_html/; php -q script.php
于 2019-03-27T20:19:28.817 回答
29

不,不。您需要在 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
于 2010-06-25T14:19:28.743 回答
3

推荐绝对路径规范的解决方案的替代方法是chdir在您的脚本中使用 a 。这样,您的相对路径将按预期工作。

例如,要切换到脚本的目录:

$curr_dir = dirname(__FILE__);
chdir($curr_dir);

切换到脚本的父目录:

$curr_dir = dirname(__FILE__);
chdir($curr_dir . "/..");

等等。

于 2017-09-03T14:20:35.580 回答
0

如果相对路径不起作用,则说明cron任务运行时设置的当前目录不是/home/username123/public_html。在这种情况下,您只能使用绝对路径。

于 2010-06-25T14:21:42.017 回答
0

这听起来很简单,就像您正在运行的一些脚本正在设置 include_path 并且您正在包含该脚本。使用 phpinfo() 检查 include_path 全局与本地设置。

于 2010-06-25T14:29:07.923 回答