PHP getenv 总是返回 false

And*_*ndy 1 php environment-variables symfony

getenv()始终返回false。我正在使用 Symfony dotenv 库并从项目根目录中的 .env 文件加载我的变量。

use Symfony\Component\Dotenv\Dotenv;
use Symfony\Component\Dotenv\Exception\PathException;

if (!getenv('APP_ENV')) {
    try {
        (new Dotenv())->load(__DIR__ . '/../.env');
    } catch (PathException $ex) {
        echo $ex->getMessage();
        exit(1);
    }
}

var_dump(getenv('APP_ENV')); // bool(false)
Run Code Online (Sandbox Code Playgroud)

但是当我转储超级全局时,我可以看到我的变量

var_dump($_ENV); // array:1["APP_ENV" => "dev"]
Run Code Online (Sandbox Code Playgroud)

那么我错过了什么?

Yog*_*lvi 10

对于 Symfony 5.x+,位于 public/index.php

代替

(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
Run Code Online (Sandbox Code Playgroud)

(new Dotenv())->usePutenv()->bootEnv(dirname(__DIR__).'/.env');
Run Code Online (Sandbox Code Playgroud)

这对我有用。


Flo*_*ann 5

默认情况下,Symfony 不使用 putenv() (我认为这是出于安全原因,不太记得了),因此如果您使用 Symfony 的“假”环境变量,则无法直接使用 getenv() 。

我认为最好的解决方案是使用依赖注入。您可以在 Symfony 配置中访问环境变量。例如,使用 yaml 配置文件:

framework:
    secret: '%env(APP_SECRET)%'
Run Code Online (Sandbox Code Playgroud)

如果您无论如何都希望能够使用 getenv() ,但由于多种原因我不推荐,您可以这样做:

  • Symfony 5.1 之前:在 config/bootstrap.php 文件中 -> new Dotenv(true)
  • Symfony 5.1 及更高版本:public/index.php,在 Dotenv instantation-> Dotenv::usePutenv() 之前添加以下内容;

编辑 :

  • 使用 putenv PHP 函数不是线程安全的,这就是为什么此设置默认为 false。
  • 首先没有注意到您使用 Dotenv 组件作为独立库,因此您可以忽略我有关依赖项注入的建议。


小智 5

我没有使用 symfony,但我遇到了一些问题,我正在使用 vlucas 库,这是我第一个导致问题的代码

define('BASE_PATH',realpath(__DIR__.'/../../'));
require_once __DIR__.'/../../vendor/autoload.php';
$dotEnv = Dotenv\Dotenv::createImmutable(BASE_PATH);
$dotEnv->load();
$appName=$_ENV['APP_NAME'];
$appName2=getenv('APP_NAME'];

var_dump($appName) // return "This is my website";
var_dump($appName2) // return false;
Run Code Online (Sandbox Code Playgroud)

我一开始不知道这个问题,但似乎是因为 putenv() 和 getenv() 不是线程安全的

所以我把它改成了这个代码

define('BASE_PATH',realpath(__DIR__.'/../../'));
require_once __DIR__.'/../../vendor/autoload.php';
$dotEnv = Dotenv\Dotenv::createUnsafeImmutable(BASE_PATH);// <======== :) look here
$dotEnv->load();
$appName=$_ENV['APP_NAME'];
$appName2=getenv('APP_NAME'];

var_dump($appName) // return "This is my website";
var_dump($appName2) // return "This is my website";
Run Code Online (Sandbox Code Playgroud)

我希望这能解决您的问题