webman需手动实现多环境配置:先在start.php和windows.php开头用putenv()解析-e参数写入app_env,再拼接.env.{app_env}路径并由vlucas/phpdotenv加载,三步缺一不可。

Webman 本身不支持 .env.dev、.env.prod 自动加载,也不能靠设置 APP_ENV 就触发环境切换——你必须手动解析命令行参数、提前写入环境变量、再让 vlucas/phpdotenv 加载对应文件,三步缺一不可。
如何让 -e APP_ENV=prod 真正生效
Webman 的 start.php 和 windows.php 默认不处理命令行参数,putenv() 必须在框架加载前执行,否则 .env 已被 Dotenv 读完,再写就晚了。
-
-e必须紧挨等号,如-e APP_ENV=prod,中间不能有空格;写成-e APP_ENV = prod会失败 - 代码要放在
start.php开头、require __DIR__ . '/vendor/autoload.php'之前 - Windows 下同样要改
windows.php,否则双系统部署时环境不一致 - 别用
$_SERVER['APP_ENV']判断——putenv()只影响getenv(),$_SERVER不同步
为什么 APP_ENV=prod 后 Dotenv 还是只读 .env
vlucas/phpdotenv 默认只加载固定文件名,它根本不看 APP_ENV 值。想按环境加载不同文件,得自己拼路径并控制加载时机。
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
- 先调
getenv('APP_ENV'),再拼出.env.'.'.getenv('APP_ENV')(如.env.prod) - 必须在
Dotenv::createUnsafeImmutable()实例化前确定路径,否则重复加载会覆盖变量 - 敏感配置(如
DB_PASS='p@ss w0rd!')务必用单引号包裹,否则空格或特殊字符会被 shell 解析错误 -
.env.prod和.env一样属于敏感文件,必须加进.gitignore
配置文件里怎么安全读取环境变量
Webman 的 config/database.php 是纯返回数组的 PHP 文件,不是运行时脚本。直接写 env('DB_HOST') 能用,但有陷阱。
-
env()函数必须来自vlucas/phpdotenv的实例,Webman 没内置该函数 - 避免在配置文件里写
if (env('APP_ENV') === 'prod')—— 此时APP_ENV可能还没被putenv()写入 - 推荐统一在
config/bootstrap.php或start.php里读取、判断、赋值,再用config('database.host', $host)注入 - 数据库密码等字段,一定要用
getenv('DB_PASSWORD') ?: ''方式读取,不要硬编码
常见踩坑:Docker / Supervisor / 多实例下环境错乱
容器或进程管理器启动 Webman 时,容易忽略环境变量传递链路,导致本地调试正常、线上全错。
- Docker 中
php start.php start -e APP_ENV=prod要写在ENTRYPOINT或CMD,不能只靠ENV APP_ENV=prod——putenv()不继承父进程ENV - Supervisor 的
environment=配置项无效,它不触发 PHP 的putenv(),仍需命令行传-e - 多实例部署时,所有进程必须用相同
-e参数启动,否则部分实例读.env.dev、部分读.env.prod,数据不一致 - 别把
.env放在public/下——Web 服务器若未禁用,可能被直接下载
真正关键的不是“能不能切环境”,而是“在哪一刻写入、由谁加载、是否被覆盖”。顺序错了,APP_ENV 就只是个字符串;时机晚了,.env.prod 就永远读不到。










