PhpStorm本身不读取.env文件,getenv()返回空属正常;需手动加载vlucas/phpdotenv库或在Run配置中显式设置环境变量才能生效。

PhpStorm 本身不读 .env 文件,运行 PHP 脚本时 getenv() 返回空是正常的——除非你手动加载了 dotenv 库,或在运行配置里显式注入变量。
为什么右键 Run PHP 文件却读不到 .env 里的值
因为 PhpStorm 的「Run」操作默认只调用系统 PHP 解释器执行脚本,不自动解析项目根目录下的 .env 文件。它既不调用 vlucas/phpdotenv,也不走 symfony/dotenv 的加载逻辑。哪怕你把 .env 放在项目最顶层,echo getenv('APP_ENV') 依然输出空字符串。
- PHP 原生不支持
.env——$_ENV和getenv()只读操作系统级环境变量,不是文本文件 - WebStorm/PhpStorm 的
EnvFile插件仅影响 IDE 内部补全、HTTP Client 和调试器变量显示,不改变实际 PHP 进程的$_ENV - Terminal 窗口完全不继承项目级环境配置,
php -r "var_dump(getenv('APP_ENV'))"必然为false
让 getenv() 在 PhpStorm 运行时生效的两种可靠方式
选一种,别混用。否则容易出现变量重复、覆盖或加载时机错误。
-
方式一:用
vlucas/phpdotenv(推荐)
在入口文件顶部(index.php或public/index.php)加三行:
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__ . '/..');
$dotenv->load();
// 后续代码才能安全使用 getenv('DB_HOST')
打开
Edit Configurations → Environment variables,直接写:APP_ENV=local;DB_HOST=localhost注意:
; 是分隔符(Windows/macOS/Linux 统一用分号),不是冒号多环境 .env 文件怎么切换(比如 .env.local / .env.prod)
别指望 PhpStorm 自动识别多个文件名。vlucas/phpdotenv 默认只加载 .env,要支持其他名字,得显式传参:
立即学习“PHP免费学习笔记(深入)”;
- 加载
.env.local:Dotenv::createImmutable(__DIR__, '.env.local')->load() - 按优先级链式加载(开发时覆盖生产):
Dotenv::createImmutable(__DIR__, ['.env', '.env.local'])->load() - 如果用
symfony/dotenv,语法类似:(new Dotenv())->usePutenv()->load(__DIR__.'/../.env.local'); - 切记:这些路径必须相对于
createImmutable()的第一个参数,不是相对于当前脚本
容易被忽略的关键点
加载 .env 不是“配完就完事”。几个硬性条件卡住就全白干:
-
.env文件不能放在 Web 可访问目录下(如public/),否则可能被直接下载泄露 -
load()必须在任何依赖环境变量的代码之前执行——比如在new PDO(...)前,不能在require 'config.php'之后 - 如果用了
opcache.enable=1,修改.env后需重启 PHP-FPM 或清 opcache,否则旧值缓存不刷新 -
createImmutable()比create()更安全,避免多次调用导致重复定义警告


















