php - 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)。
我的文件字典是这样的:
- 上市
- -- 公司
- ---- 文件
- - - - 地点
- -------- 定时任务
- - ETC
- - ETC
我应该注意,每个页面上的要求都是相同的,并且它们工作,除了在 cron 作业中。我读到这可能是因为用户在浏览时设置了 $_SERVER['DOCUMENT_ROOT'] var,并且无法由 crontab 设置,但我无法弄清楚修复方法。
crontab 看起来像这样,但它似乎每 5 分钟发送一封电子邮件,所以我认为这里没有任何问题。
*/5 * * * * /usr/bin/php /var/www/html/inc/files/site/cron/shop.php
我希望有人对此有所了解,因为我很难过!我没有设置任何 crontab 工作,但确实离开的人,我不熟悉它。
我在这里输入了我能想到的所有信息,但我很乐意回答任何其他问题。
解决方案
$_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
页面。
推荐阅读
- php - 尽管启用了mbstring,但调用未定义的函数mb_convert_encoding()
- java - Drools - 使用 java 常量作为 drools 规则名称
- nginx - 使用 nginx map 指令动态设置代理上游
- c - Visual Studio - C 编程
- java - 将 JSON 值从 PHP 获取到 Android
- c++ - Visual Studio 中基于 For 循环的 C++17 广义范围
- android - 使用 Android 架构组件处理输入
- vba - 如何复制动态单元格内容并添加到静态超链接的末尾
- c# - 在 Jarray 中填充字段
- c++ - 模板函数的#pragma 链接