首页 > 解决方案 > PHP cron 需要路径问题

问题描述

我遇到了 PHP 要求(我认为)和 crontab 的问题。我正在使用 AWS。

错误如下所示:

PHP Fatal error:  require(): Failed opening required '/inc/classes/core/inc.php' (include_path='.:/usr/share/pear:/usr/share/php') in /var/www/html/inc/files/core/config.php on line 16

我的 PHP 要求如下所示:

    require($_SERVER['DOCUMENT_ROOT'].'/inc/files/core/config.php');

这里有关于同一件事的类似问题,我查看了它们,但他们的解决方案似乎对我不起作用。我从 Stackoverflow 尝试的其中一件事是:

    $_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../../../');
    require($_SERVER['DOCUMENT_ROOT'].'/inc/files/core/config.php');

另一个是将其添加到我的 php ini 文件中(也是另一个线程的建议):

include_path = ".:/usr/share/php:/var/www/<directory>/"

我还尝试直接使用不起作用的路径(即/var/www/public/inc/etc)。

我的文件字典是这样的:

我应该注意,每个页面上的要求都是相同的,并且它们工作,除了在 cron 作业中。我读到这可能是因为用户在浏览时设置了 $_SERVER['DOCUMENT_ROOT'] var,并且无法由 crontab 设置,但我无法弄清楚修复方法。

crontab 看起来像这样,但它似乎每 5 分钟发送一封电子邮件,所以我认为这里没有任何问题。

*/5 * * * * /usr/bin/php /var/www/html/inc/files/site/cron/shop.php

我希望有人对此有所了解,因为我很难过!我没有设置任何 crontab 工作,但确实离开的人,我不熟悉它。

我在这里输入了我能想到的所有信息,但我很乐意回答任何其他问题。

标签: phpcron

解决方案


$_SERVER运行php-cli时没有。它将返回空值或空值。

$_SERVER 是一个包含标题、路径和脚本位置等信息的数组。此数组中的条目由 Web 服务器创建。

https://secure.php.net/manual/en/reserved.variables.server.php

假设您正在运行的脚本的路径,替换为您想要的文件的路径。这可能有效,但也许您需要添加或删除一些../

require(__DIR__ . '/../../../files/core/config.php');

您得到的错误指向config.php文件。您可能在$_SERVER那里有另一个,您需要替换和/或找到一种方法来确定是 HTTP 请求还是 php-cli。

就像是

if($_SERVER['DOCUMENT_ROOT']) {
    require($_SERVER['DOCUMENT_ROOT'] . ...);
} else {
    require(__DIR__. ...);
}

您可能想要添加一个指向项目根目录的全局常量。

if($_SERVER['DOCUMENT_ROOT']) {
    const BASEDIR = $_SERVER['DOCUMENT_ROOT'];
} else {
    const BASEDIR = __DIR__. ...;
}

然后对整个应用程序使用 BASEDIR。

编辑:正如@YvesLeBorg 所建议的,您可以创建一个不同的文件,使用 curl 或 wget 调用您的入口点。

*/5 * * * * /usr/bin/php /path/to/my_script.sh

然后在my_script.sh你可以写

wget http://my_web_page/shop.php

然后您将拥有一个$_SERVER并且无需重构。请注意安全性,因为任何人都可以调用您的页面并运行您的进程。您可能需要使用令牌并验证 IP 地址,以确保只有您可以调用此shop.php页面。


推荐阅读