PhpStorm项目级环境变量仅在显式配置的运行/调试配置中生效,Terminal不读取该配置,故getenv()返回false;需通过右键运行PHP文件或启用对应环境配置才能生效。

PhpStorm 的项目级环境变量不是靠改系统 PATH 或全局设置实现的,它只在你明确指定的运行/调试配置里生效,且不污染 CLI 全局环境。
为什么 getenv() 在 Terminal 里读不到你配的变量
PhpStorm 的 Terminal 工具窗口默认继承系统 shell 环境(比如你的 ~/.zshrc 或 Windows 的系统 PATH),完全不读取你在「Environments」里建的那些变量。这些变量只对 PHP 脚本执行、PHPUnit、PHPCS、CLI 运行配置等“被 PhpStorm 显式调用”的场景起作用。
- 你在 Terminal 里敲
php -r "var_dump(getenv('APP_ENV'));",返回false是正常的——它没走 PhpStorm 的环境注入逻辑 - 但如果你右键一个 PHP 文件 →
Run 'xxx.php',或执行一个配好了环境的PHPUnit配置,getenv('APP_ENV')就能拿到值 - 想验证是否生效?直接在运行配置里点「Modify options」→ 勾选「Show command line afterwards」,看实际执行命令前拼了哪些
-d variables_order=EGPCS和APP_ENV=local
怎样创建并绑定一个项目专用的环境
别在 Settings 里找「全局环境变量」——那只是影响所有项目的默认值。项目级隔离必须用「Environments」功能,路径是:项目视图中右键 Project → New → Environment。
- 名称建议带项目缩写,比如
myapp-dev,避免和别人冲突 - 添加变量时,键名不要带空格或特殊符号;值如果是路径,Windows 用双反斜杠
C:\myapp\config或正斜杠C:/myapp/config,macOS/Linux 用标准斜杠 - 创建后不会自动启用,必须手动右键该环境 →
Enable;禁用时同理,右键 →Disable - 多个环境可以共存,但同一时间只能启用一个;切换后需重启当前运行配置才能生效
运行/调试配置里怎么选对环境
即使你建好了 myapp-prod 环境,不把它挂到具体配置上,它就是个摆设。关键步骤在 Edit Configurations → 对应的 PHP Script / PHPUnit / CLI Tools 配置里。
立即学习“PHP免费学习笔记(深入)”;
- 打开配置后,切到
Environment标签页,下拉框里选你刚启用的环境名(不是变量列表) - 如果下拉为空,说明你没启用过任何环境,或者项目结构没刷新——试着重启 PhpStorm 或点击项目根目录右键 →
Reload project - 勾选
Include parent environment variables是个陷阱:它会把系统 PATH、HOME 等全塞进来,可能覆盖你精心配的DB_HOST;一般保持不勾选更可控 - 调试 Web 请求(比如 Xdebug)时,环境变量不通过这个入口传;得靠 Web Server 配置或
$_SERVER注入,和这里无关
导出/导入环境配置的实操要点
团队协作或部署 CI 时,靠截图或口头同步变量容易出错。PhpStorm 支持导出为 JSON 文件,但要注意格式兼容性。
- 导出路径:项目视图 → 展开
Environments→ 右键环境 →Export to file→ 保存为.env.json - 导入时,文件内容必须是纯 JSON 数组,形如
[{"name":"APP_ENV","value":"staging"},{"name":"CACHE_DRIVER","value":"redis"}];多一层外层对象或注释都会失败 - 导入后变量不会自动启用,仍需右键启用;且导入不覆盖已有同名环境,而是新建一个带编号的副本(如
myapp-dev (1)) - 别把敏感值(如数据库密码)硬编码进 JSON 提交 Git;用
.gitignore排除*env.json,改用 dotenv 插件 +.env.local
真正容易被忽略的是:环境变量只在 PhpStorm 主动启动的进程里有效,它不会修改 $_ENV 的运行时快照,也不会让 putenv() 生效;如果你在脚本里动态改了环境变量,后续子进程是否继承,取决于你用的是 exec() 还是 shell_exec() ——这和 PhpStorm 无关,是 PHP 自身行为。



















