需手动安装并初始化vlucas/phpdotenv:执行composer require vlucas/phpdotenv,在入口文件顶部加载autoload.php后调用Dotenv::createImmutable(__DIR__)->load();默认仅注入$_SERVER,应使用$_SERVER读取变量;多环境需手动指定文件名如.env.development,并预先设置APP_ENV。

Composer 本身不处理环境变量,它只是 PHP 的依赖管理工具;真正读取 .env 文件并注入环境变量的是 vlucas/phpdotenv 这个库 —— 你得手动引入并初始化它。
怎么在 Composer 项目中安装和启用 phpdotenv
先用 Composer 安装依赖:
composer require vlucas/phpdotenv
然后在项目入口(如 index.php、public/index.php 或框架的启动文件)最顶部附近加载并解析 .env:
require_once __DIR__.'/vendor/autoload.php'; $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
-
createImmutable()是推荐方式,避免运行时修改环境变量;若需动态重载用createMutable() -
__DIR__表示.env文件应放在该目录下;路径不对会报Dotenv\Exception\InvalidPathException - 不要在 CLI 脚本里漏掉
->load(),否则变量根本不会生效
为什么 $_ENV 或 getenv() 读不到 .env 里的值
phpdotenv 默认只写入 $_SERVER,不自动填充 $_ENV 或影响 getenv() 的行为(取决于 PHP 配置)。
立即学习“PHP免费学习笔记(深入)”;
- PHP 7.1+ 默认
variables_order不含E,所以$_ENV为空是正常的 - 调用
getenv('DB_HOST')可能返回空,除非你显式启用Dotenv\Dotenv::createImmutable(...)->load()->required()后再调用putenv(),或改用$_SERVER['DB_HOST'] - 更稳妥的做法:始终用
$_SERVER读,或封装一个env()辅助函数统一从$_SERVER取值
如何让不同环境加载不同的 .env 文件
phpdotenv 原生不支持多环境文件自动切换,但可以手动组合:
$env = $_SERVER['APP_ENV'] ?? 'production';
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__, ".env.{$env}");
$dotenv->safeLoad(); // safeLoad() 不报错,适合 fallback 场景
- 先尝试加载
.env.development,失败则 fallback 到.env(用safeLoad()) - 注意:不能靠
APP_ENV自身从.env读 —— 那会形成循环依赖;得从服务器配置、CLI 参数或系统环境预先设好 - 常见做法:Nginx/Apache 设置
SetEnv APP_ENV development,或运行命令时加APP_ENV=local php artisan serve
最容易被忽略的一点:.env 文件权限必须严格(建议 600),且绝不能提交到 Git —— 即使写了 .gitignore,也得检查是否已有历史记录泄露过密钥。











