【问题标题】:PHP: Require path does not work for cron job?PHP:要求路径不适用于 cron 作业?
【发布时间】:2011-03-08 07:36:13
【问题描述】:

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

?

谢谢!

【问题讨论】:

标签: php include cron require absolute-path


【解决方案1】:

技术上看到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';

【讨论】:

  • 为了使调试更容易,我可以这样说: if(file_exists('/home/username123/public_html/includes/common.php')) { set_include_path('/home/username123/public_html/includes /');需要'common.php'; } 否则需要'../includes/common.php';还是我每次都需要手动更改它并执行此操作:// LIVE set_include_path('/home/fini7463/public_html/includes/');需要'common.php'; // 调试 // 需要 '../includes/common.php'; ?
  • 我猜第一个应该没问题
【解决方案2】:

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

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

改为更改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

【讨论】:

  • 这个答案更好。
  • 我在 HostGator 上安装了 WordPress,这确实是唯一的解决方案,因为包含的核心文件中的相对路径会触发错误并且无法直接修改。
  • 更好、更清洁的解决方案。
  • 这绝对应该是公认的答案(但我知道它是在第一个答案之后将近十年出现的)。这是一个更加可持续的解决方案。
  • 这是所有案例的 100% 正确答案
【解决方案3】:

诺诺。您需要在 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

【讨论】:

  • 不,你没有......但你必须考虑到你可能在不同的目录中运行,并且使用不同的 include_path
  • 是的,你是对的,我认为更好的措辞可能是推荐而不是你需要。好吧,我总是尝试这样做
  • 我试过你的,但它仍然不适合我,所以我使用了@Robus 答案,效果很好
【解决方案4】:

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

例如切换到脚本所在目录:

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

要切换到脚本的父目录:

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

等等。

【讨论】:

    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2015-10-29
        • 2013-10-15
        • 2013-02-06
        • 2016-07-22
        • 2014-04-26
        • 2012-06-29
        • 2011-03-09
        • 2017-11-12
        • 2012-04-28
        相关资源
        最近更新 更多