PHP cron需要路径问题

时间:2018-08-03 20:13:12

标签: php cron

我在使用PHP require和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)。

我的文件字典如下:

  • 公共
  • -inc
  • ----文件
  • ------网站
  • -------- cron
  • -等等
  • -等等

我应该注意,除了cron作业之外,每个页面上的需求都是相同的,并且它们都可以工作。我读到这可能是由于用户在浏览时设置了$ _SERVER ['DOCUMENT_ROOT'] var,而crontab无法设置该变量,但是我不知道解决方法。

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

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

我希望有人对此有所了解,因为我很沮丧!我没有设置crontab的任何工作,但离开的人,我对此并不熟悉。

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

1 个答案:

答案 0 :(得分:2)

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

  

$ _ 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页。