如何解决错误“致命错误:require(): Failed opening required '../vendor/autoload.php' (include_path='C:\xampp\php\

Posted

技术标签:

【中文标题】如何解决错误“致命错误:require(): Failed opening required \'../vendor/autoload.php\' (include_path=\'C:\\xampp\\php\\PEAR\')?”【英文标题】:How do I solve the error "Fatal error: require(): Failed opening required '../vendor/autoload.php' (include_path='C:\xampp\php\PEAR') ?"如何解决错误“致命错误:require(): Failed opening required '../vendor/autoload.php' (include_path='C:\xampp\php\PEAR')?” 【发布时间】:2021-03-22 18:42:51 【问题描述】:

所以我在我的 php 应用程序中使用 vlucas/phpdotenv 来存储和使用环境变量。我创建了一个 db.php 文件,其中包含我的数据库连接的配置。文件夹结构为root/config/db.php。

我在 db.php 文件中有require('../vendor/autoload.php'); 然后我已经使用了

$dotenv=Dotenv\Dotenv::createImmutable('../');
$dotenv->load();
print_r($_ENV);

访问环境变量,因为 .env 文件位于目录的根目录中。当我访问服务器上的 db.php 文件时,一切正常,但是当我将此文件包含在根目录中的 register.php 文件中时,我收到错误“致命错误:require():打开所需的失败”。 ./vendor/autoload.php' (include_path='C:\xampp\php\PEAR')"。

但是,当我更改 autoload.php 的目录以匹配路径时,我会收到此错误: “未捕获的 Dotenv\Exception\InvalidPathException:无法读取 [../.env] 处的任何环境文件。”

有人可以帮我吗?谢谢。

【问题讨论】:

您好,您创建了 .env 文件了吗? 是的,我在根文件夹中创建了一个 .env 文件,其中包含所有数据库信息,如用户名、密码、主机等。 【参考方案1】:

看起来您正在使用相对路径,但希望它像绝对路径一样运行。

../ 符号表示父目录,因此如果您移动文件,父目录也会更改。

比起相对的工作,我更喜欢建立一个基础,向上工作。

使用$_SERVER['DOCUMENT_ROOT'],这是应用程序根目录的文件路径。

require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');

然后在 createImmutable 静态调用中使用相同的符号。我不知道你应该指向哪里。如果是根,请使用...

$dotenv=Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);

【讨论】:

【参考方案2】:

让我们来看看这个。 您的目录结构似乎是这样的:

/
|- register.php
|- login.php
|- .env
|- /config
   |- db.php 

这有几个问题。其中之一是:不应该可由网络浏览器访问的文件是可访问的。 (尝试调用 your-domain.com/.env 如果您没有通过 .htaccess 文件保护它,那么您会将您的数据库信息泄露给公众)

但是回到你的问题: ../ 是相对路径。相对于文件,这是调用的入口点。 让我们看一下:如果你调用config/db.php,那么current working directory 将是config../ 将指向根路径。 如果您调用register.php,那么current working directory 将是根路径,../ 将指向父目录。

你应该这样做:

/
|- /public
   |- login.php
   |- register.php
|- .env
|- bootstrap.php
|- /conf
   |- db.php

public 中的每个文件都应包含bootstrap.php,其中将执行 dotenv。您可以使用__DIR__/ . '.env',而不是'./env'。 这样做有几个好处:

您不会冒泄露敏感文件/数据的风险 您始终拥有相同的包含路径,无需担心从何处调用此文件

缺点:

您必须将服务器配置为提供公用文件夹而不是根目录。

【讨论】:

是的,这正是我现在的文件夹结构。有没有一种方法可以创建对 .env 文件的访问块,以防有人在 www.website.com/.env 中键入而不更改文件夹结构?还给定您的文件夹结构,如何阻止某人访问浏览器中的 .env 文件?感谢您对此的帮助。 :D 正如@hubare 提到的,我可以使用 $_SERVER['DOCUMENT_ROOT'] 方法修复它。 > 有没有一种方法可以创建对 .env 文件的访问块,以防有人输入 www.website.com/.env 是的。您可以在.htaccess 中定义不得提供哪些文件。 (假设您使用 Apache。) > 还考虑到您的文件夹结构,如何阻止某人访问浏览器中的 .env 文件?您可以将服务器的 Web 根目录设置为 /public。所以不能访问/public 之外的任何文件。 (如果您查看任何现代框架,它们都有一个/public 文件夹) >(假设您使用 Apache。)我实际上没有使用 Apache。我正在使用 'php -S localhost':XXXX 在 PHP 服务器上运行它。> >您可以将服务器的 Web 根目录设置为 /public。所以在 /public 之外不能有任何文件被访问。哦,是的,这是有道理的。非常感谢 > 我注意到很多现代框架使用 public 作为它们的根目录。非常感谢您的帮助。

以上是关于如何解决错误“致命错误:require(): Failed opening required '../vendor/autoload.php' (include_path='C:\xampp\php\的主要内容,如果未能解决你的问题,请参考以下文章

"SQL SERVER,错误:207" 如何解决

如何解决“错误:输入中的语法错误(1)。”

如何解决此分段错误:以下代码的 11 错误?

如何解决子重复错误?

Ftp 错误代码 550,如何解决

这是啥覆盖错误,我该如何解决? [复制]