【问题标题】:PHP getenv always returns falsePHP getenv 总是返回 false
【发布时间】:2020-12-27 23:34:55
【问题描述】:

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)

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

var_dump($_ENV); // array:1["APP_ENV" => "dev"]

那么我错过了什么?

【问题讨论】:

标签: php symfony environment-variables


【解决方案1】:

我没有使用 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;

一开始我并不知道这个问题,但似乎是因为 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";

我希望这能解决您的问题

【讨论】:

    【解决方案2】:

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

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

    framework:
        secret: '%env(APP_SECRET)%'
    

    如果您仍然希望能够使用 getenv(),我不推荐出于多种原因,您可以这样做:

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

    编辑:

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

    【讨论】:

      【解决方案3】:

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

      替换

      (new Dotenv())->bootEnv(dirname(__DIR__).'/.env');
      

      (new Dotenv())->usePutenv()->bootEnv(dirname(__DIR__).'/.env');
      

      这对我有用。

      【讨论】:

        【解决方案4】:

        原因是强烈建议不要使用 getenv() 和 putenv(),因为这些函数不是线程安全的,但是仍然可以指示 PHP dotenv 使用这些函数。可以调用 Dotenv::createUnsafeImmutable,而不是调用 Dotenv::createImmutable,这将在幕后添加 PutenvAdapter。您的环境变量现在可以使用 getenv 方法以及超级全局变量获得:

        $s3_bucket = getenv('S3_BUCKET');
        $s3_bucket = $_ENV['S3_BUCKET'];
        $s3_bucket = $_SERVER['S3_BUCKET'];
        

        【讨论】:

          猜你喜欢
          • 2014-05-03
          • 2014-08-26
          • 2012-08-23
          • 2016-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多