问题
I have a simple Symfony project, using "symfony/dotenv": "4.3.*",
in the composer.json
and trying to read in the value of an environment variable.
This is my command:
var_dump($_ENV['MY_NEW_VAR']);
This is my .env
file
MY_NEW_VAR=testing
Upon executing the command I get the following
string(7) "testing"
All good so far.... But now if I want to use environment variables to override the setting it returns an error. First I set the environment variable
export MY_NEW_VAR="something_else"
Then execute the command again, with the following results
[ErrorException]
Notice: Undefined index: MY_NEW_VAR
If I remove the environment variable using unset MY_NEW_VAR
and execute the command again I get the value from the .env
file
I would expect the environment variable to override the .env
setting as explained in the comments of the .env
file
# In all environments, the following files are loaded if they exist,
# the later taking precedence over the former:
#
# * .env contains default values for the environment variables needed by the app
# * .env.local uncommitted file with local overrides
# * .env.$APP_ENV committed environment-specific defaults
# * .env.$APP_ENV.local uncommitted environment-specific overrides
#
# Real environment variables win over .env files.
Why does it not work with environment variables? Am I missing something?
回答1:
The code in your question is correct, so I'd wager the problem lies somewhere else.
There are many vagaries and inconsistencies about how getenv()
, $_ENV
and $_SERVER
work. I have found $_SERVER
to be more reliable in my experience, and many times it safer to check both. E.g. if you check the code on config/bootstrap.php
for Symfony 4.3 you'll see stuff like this:
$_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev';
In any case, if your $_ENV
superglobal is initially empty, it could be because on the variables_order
setting. Check its value, and if doesn't include an E
, prepend it to the existing value and with that it should be populated correctly.
The docs say that S
is equivalent to ES
...
In both the CGI and FastCGI SAPIs, $_SERVER is also populated by values from the environment; S is always equivalent to ES regardless of the placement of E elsewhere in this directive.
but I have not found it to be consistently so.
来源:https://stackoverflow.com/questions/57002564/unable-to-read-environment-variables