首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP getenv总是返回false

PHP getenv总是返回false
EN

Stack Overflow用户
提问于 2020-09-09 21:58:28
回答 4查看 5.1K关注 0票数 1

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

代码语言:javascript
复制
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)

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

代码语言:javascript
复制
var_dump($_ENV); // array:1["APP_ENV" => "dev"]

那么我错过了什么呢?

EN

回答 4

Stack Overflow用户

发布于 2021-01-10 19:15:35

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

代码语言:javascript
复制
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()不是线程安全的

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

代码语言:javascript
复制
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";

我希望这能解决你的问题

票数 8
EN

Stack Overflow用户

发布于 2020-09-09 22:41:06

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

在我看来,最好的解决方案是使用依赖注入。您可以在Symfony配置中访问env vars。例如,使用yaml配置文件:

代码语言:javascript
复制
framework:
    secret: '%env(APP_SECRET)%'

如果你想使用getenv(),出于多种原因,我不推荐使用getenv(),可以这样做:

Symfony 5.1之前的公共配置:在新的Dotenv(true)

  • Symfony 5.1和更高版本的配置/bootstrap.php文件中:-> /.php,在Dotenv实例之前添加以下内容->

编辑:

使用putenv PHP函数的

  • 不是线程安全的,这就是此设置缺省为false的原因。
  • 一开始并没有注意到您使用Dotenv组件作为独立库,所以您可以忽略我关于依赖注入的建议。
票数 1
EN

Stack Overflow用户

发布于 2021-05-16 16:55:17

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

替换

代码语言:javascript
复制
(new Dotenv())->bootEnv(dirname(__DIR__).'/.env');

使用

代码语言:javascript
复制
(new Dotenv())->usePutenv()->bootEnv(dirname(__DIR__).'/.env');

这对我很有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63813272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档