所以我在php应用程序中使用vlucas/phpdotenv来存储和使用环境变量。我创建了一个db.php文件,其中包含数据库连接的配置。文件夹结构为root/config/db.php。
我在db.php文件中有require('../vendor/autoload.php');
,然后我使用了
$dotenv=DotenvDotenv::createImmutable('../');
$dotenv->load();
print_r($_ENV);
访问环境变量,因为.env文件位于目录的根目录中。当我访问服务器上的db.php文件时,一切都很好,但当我将此文件包含在根目录中的register.php文件中时,我会收到错误";致命错误:require((:无法打开必需的"/vendor/autoload.php'(include_path='C:\examplep\php\PEAR'("。
然而,当我更改autoload.php的目录以匹配路径时,我会收到以下错误:"未捕获的Dotenv\Exception\InvalidPathException:无法读取[../.env]中的任何环境文件;
有人能帮我吗?非常感谢。
看起来您使用的是相对路径,但期望它像绝对路径一样发挥作用。
../表示法意味着父目录,所以如果移动文件,父目录也会更改。
与其相对工作,我更喜欢建立一个基础并向上工作。
使用$_SERVER['DOCUMENT_ROOT']
,它是应用程序根目录的文件路径。
require($_SERVER['DOCUMENT_ROOT'] . '/vendor/autoload.php');
然后在createImmutable
静态调用中使用相同的表示法。我不知道你应该把它指向哪里。如果它是根,请使用。。。
$dotenv=DotenvDotenv::createImmutable($_SERVER['DOCUMENT_ROOT']);
$dotenv->load();
print_r($_ENV);
让我们来看看这个。您的目录结构似乎是这样的:
/
|- register.php
|- login.php
|- .env
|- /config
|- db.php
这有几个问题。其中之一是:不应被web浏览器访问的文件是可访问的。(试着调用你的域.com/.env如果你没有通过.htaccess文件保护它,那么你会将数据库信息泄露给公众(
但回到你的问题:CCD_ 4是相对路径。相对于文件,这是调用的入口点。让我们来看一下:如果您调用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'
。这有几个好处:
- 您不会有泄露敏感文件/数据的风险
- 您总是有相同的包含路径,不必担心从哪里调用此文件
缺点:
- 您必须将服务器配置为提供公用文件夹而不是根目录