Symfony Dotenv并不总是加载

时间:2018-04-17 16:40:40

标签: php symfony

有人可以帮助解释为什么通过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"

1 个答案:

答案 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正在检索它们。