我在使用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)。
我的文件字典如下:
我应该注意,除了cron作业之外,每个页面上的需求都是相同的,并且它们都可以工作。我读到这可能是由于用户在浏览时设置了$ _SERVER ['DOCUMENT_ROOT'] var,而crontab无法设置该变量,但是我不知道解决方法。
crontab看起来像这样,但似乎每隔5分钟就会发送一封电子邮件,因此我认为这里没有任何问题。
*/5 * * * * /usr/bin/php /var/www/html/inc/files/site/cron/shop.php
我希望有人对此有所了解,因为我很沮丧!我没有设置crontab的任何工作,但离开的人,我对此并不熟悉。
我在这里输入了所有我能想到的信息,但很高兴回答任何其他问题。
答案 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
页。