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)
这对我有用。
默认情况下,Symfony 不使用 putenv() (我认为这是出于安全原因,不太记得了),因此如果您使用 Symfony 的“假”环境变量,则无法直接使用 getenv() 。
我认为最好的解决方案是使用依赖注入。您可以在 Symfony 配置中访问环境变量。例如,使用 yaml 配置文件:
framework:
secret: '%env(APP_SECRET)%'
Run Code Online (Sandbox Code Playgroud)
如果您无论如何都希望能够使用 getenv() ,但由于多种原因我不推荐,您可以这样做:
编辑 :
小智 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)
我希望这能解决您的问题