0

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

require('../vendor/autoload.php');在 db.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] 处的任何环境文件。”

有人可以帮我吗?谢谢你。

4

2 回答 2

1

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

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

与其相对工作,我更喜欢建立一个基础并向上工作。

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

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

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

$dotenv=Dotenv\Dotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);
于 2020-12-11T11:07:18.360 回答
0

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

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

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

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

你应该使用这样的东西:

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

中的每个文件都public应该包括bootstrap.phpdotenv 将在其中执行。而不是类似的东西'./env',你可以使用__DIR__/ . '.env'. 这样做有几个好处:

  • 您不会冒泄露敏感文件/数据的风险
  • 你总是有相同的包含路径,不用担心从哪里调用这个文件

缺点:

  • 您必须将服务器配置为提供公用文件夹而不是根目录。
于 2020-12-11T11:02:42.747 回答