How do I solve the error "Fatal error: 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') ?"
所以我在 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] 的任何环境文件。”
有人可以帮我吗?谢谢。
让我们来看看这个。
您的目录结构似乎是这样的:
/
|- register.php
|- login.php
|- .env
|- /config
|- db.php
这有几个问题。其中之一是:不应 可通过网络浏览器访问的文件是可访问的。 (尝试调用你的-domain.com/.env 如果你没有通过 .htaccess 文件保护它,那么你将把你的数据库信息泄露给 public)
但是回到你的问题:
../
是相对路径。相对于文件,这是调用的入口点。
让我们看一下:如果你调用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'
这样的东西。
这样做有几个好处:
- 你不要冒险泄露理智files/data
- 你总是有相同的包含路径,不用担心从哪里调用这个文件
缺点:
- 您必须将服务器配置为服务于 public 文件夹而不是根目录。
看起来您正在使用相对路径,但希望它像绝对路径一样发挥作用。
../ 符号表示父目录,因此如果您移动文件,父目录也会更改。
与其相对工作,不如立足向上工作
使用 $_SERVER['DOCUMENT_ROOT']
,这是应用程序根目录的文件路径。
require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');
然后在 createImmutable
静态调用中使用相同的表示法。我不知道你应该把它指向哪里。如果是根,使用...
$dotenv=Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);
所以我在 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] 的任何环境文件。”
有人可以帮我吗?谢谢。
让我们来看看这个。 您的目录结构似乎是这样的:
/
|- register.php
|- login.php
|- .env
|- /config
|- db.php
这有几个问题。其中之一是:不应 可通过网络浏览器访问的文件是可访问的。 (尝试调用你的-domain.com/.env 如果你没有通过 .htaccess 文件保护它,那么你将把你的数据库信息泄露给 public)
但是回到你的问题:
../
是相对路径。相对于文件,这是调用的入口点。
让我们看一下:如果你调用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'
这样的东西。
这样做有几个好处:
- 你不要冒险泄露理智files/data
- 你总是有相同的包含路径,不用担心从哪里调用这个文件
缺点:
- 您必须将服务器配置为服务于 public 文件夹而不是根目录。
看起来您正在使用相对路径,但希望它像绝对路径一样发挥作用。
../ 符号表示父目录,因此如果您移动文件,父目录也会更改。
与其相对工作,不如立足向上工作
使用 $_SERVER['DOCUMENT_ROOT']
,这是应用程序根目录的文件路径。
require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');
然后在 createImmutable
静态调用中使用相同的表示法。我不知道你应该把它指向哪里。如果是根,使用...
$dotenv=Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);