Webman 默认不支持多环境 .env 文件自动加载,需手动通过 -e 参数注入环境变量、动态拼接 .env 文件路径并提前加载,且配置文件中应避免条件判断,敏感配置须单引号包裹并加入 .gitignore。

Webman 默认不支持 .env 多环境文件自动加载(比如 .env.dev、.env.prod),也不能靠设置 APP_ENV 环境变量就自动切换配置目录。它的环境变量机制是「手动注入 + 运行时读取」,不是框架原生驱动的多环境配置系统。想实现开发/测试/生产自动切换,必须自己补全参数解析、环境变量写入、配置加载三步链路。
Webman 启动时如何通过 -e 参数注入环境变量
Webman 的 start.php 和 windows.php 是 CLI 启动入口,但默认不解析命令行参数。你得手动加一段循环来捕获 -e 后面的键值对,并用 putenv() 注入:
-
-e必须紧跟一个等号形式的字符串,例如-e APP_ENV=prod,中间不能有空格 - 代码要放在
start.php开头、require框架前,否则putenv()生效太晚,.env已被Dotenv加载完毕 - Windows 下同样要改
windows.php,否则双系统部署会漏掉 - 别用
$_SERVER或$_ENV读取 ——putenv()只影响getenv()和env()函数
为什么 vlucas/phpdotenv 不会自动识别 APP_ENV 切换文件
Dotenv 库本身只加载固定文件名(默认 .env),它不关心 APP_ENV 值,也不会自动去加载 .env.prod。即使你通过 -e APP_ENV=prod 设置了环境变量,Dotenv::createUnsafeImmutable() 仍只会读 .env。
- 若想按环境加载不同文件,得自己写逻辑:先
getenv('APP_ENV'),再拼路径如.env.'.'.getenv('APP_ENV') - 注意顺序:必须在
Dotenv实例化前确定文件路径,否则重复加载会覆盖变量 - 不要把
.env.prod提交进 Git —— 它和.env一样属于敏感配置,应加入.gitignore -
Dotenv的load()方法不支持传入多个文件,需显式调用多次或合并数组
配置文件中如何安全读取环境变量
Webman 的配置文件(如 config/database.php)是 PHP 数组返回值,不是运行时脚本。你在里面直接写 env('DB_HOST') 是可以的,但要注意:
-
env()函数必须来自vlucas/phpdotenv的Dotenv实例,不能依赖框架自带(Webman 没内置) - 避免在配置文件里做条件判断(如
if (env('APP_ENV') === 'prod')),因为配置合并发生在启动早期,此时APP_ENV可能还没被putenv()写入 - 推荐做法:在
config/bootstrap.php或start.php里统一处理环境逻辑,然后把最终值写入config('database.host', $host) - 数据库密码等敏感字段,一定要用单引号包裹在
.env里,比如DB_PASS='p@ss w0rd!',否则空格或特殊字符会截断
容易被忽略的兼容性细节
这套方案在 Linux 和 Windows 都能跑通,但有几个边界情况实际踩过坑:
-
putenv()设置的变量在 CLI 下有效,但在 Web SAPI(如 Nginx + PHP-FPM)下完全无效 —— FPM 进程不继承 shell 环境,得改www.conf里的env[APP_ENV]=prod - 如果你用 Supervisor 管理 Webman 进程,必须在
environment=段显式声明变量,否则-e参数不会透传 -
str_contains()是 PHP 8+ 函数,Webman 项目若还跑在 PHP 7.4,得换成strpos($s, $needle) !== false - 多级嵌套配置(如
redis.cluster.nodes)不能靠env()直接映射,得手动explode('.', $key)逐层赋值
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











