有人可以帮助解释为什么通过Symfony的Dotenv组件加载的环境变量有时没有设置?
我有一个PHP应用程序,它产生几个并发的本地HTTP请求(实质上是调用另一个脚本)。每个请求加载都会尝试加载.env
文件,并通过getenv()
使用其数据。在每次运行期间,某些请求会加载信息,而其他请求则不会。几乎看起来Dotenv库的load()
方法异步工作。
我的主脚本使用GuzzleHttp
汇集了大量HTTP请求。在每个请求中,我有以下代码尝试加载和访问变量:
的index.php
require dirname(__DIR__) . '/vendor/autoload.php';
$dotenv = new \Symfony\Component\Dotenv\Dotenv();
$dotenv->load(dirname(__DIR__) . "/.env");
$instance = new App\Controllers\Controller();
Controller.php这样
$host = getenv("DB_HOST");
$name = getenv("DB_NAME");
$user = getenv("DB_USER");
$password = getenv("DB_PASSWORD");
$this->client = new PDO(
"mysql:host={$host};dbname={$name}",
$user,
$password,
[
PDO::ATTR_TIMEOUT => 600,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]
);
在某些请求中,这些getenv()
调用的值将为空。如果我重新运行脚本,其他请求将为空白。
我尝试在Dotenv
方法中移动Controller
加载程序调用,但这不起作用。
我不确定我的代码中是否有错误,或者我误解了dotenv文件的加载方式。
编辑:系统信息
操作系统:Windows 10 x64
PHP版本:5.6.31
配置命令:
cscript / nologo configure.js" - enable-snapshot-build" " - 禁用-ISAPI" " - 使能调试包" " - 无需-MSSQL" " - 无需-PDO-MSSQL" " - 无需-Pi3Web服务器" " - 与-PDO-OCI = C:\ PHP-SDK \ ORACLE \ 86 \ instantclient_12_1 \ SDK,共享" " - 与-oci8-12c = C:\ PHP-SDK \ ORACLE \ 86 \ instantclient_12_1 \ SDK,共享" " - 使对象-OUT-DIR = .. / OBJ /" " - 使-COM-DOTNET =共享" " - 与-mcrypt的静态=" " - 无需分析器" " - 与-PGO"
答案 0 :(得分:2)
所以似乎问题实际上是getenv()
检索变量。我转而使用$_ENV
,它每次都有效。
$host = $_ENV["DB_HOST"];
$name = $_ENV["DB_NAME"];
$user = $_ENV["DB_USER"];
$password = $_ENV["DB_PASSWORD"];
这stackoverflow answer阐明了getenv
与$_SERVER
的区别。所以我的猜测是Dotenv
保存变量的方式存在一些脱节,而getenv
正在检索它们。