Workerman 不自动加载 .env 文件,需在 start.php 顶部显式调用 Dotenv::createImmutable(__DIR__)->load();reload 不重载环境变量,必须 stop 后 start;所有配置须动态读取 $_ENV 或 env(),避免硬编码覆盖。

Workerman 本身不读 .env 文件,集成后不生效,是因为你没在启动入口里主动加载它。
Workerman 启动脚本没调用 dotenv::config()
Workerman 是纯 PHP 进程管理器,不内置环境变量加载逻辑。哪怕你项目里装了 vlucas/phpdotenv,只要 start.php 里没显式调用 Dotenv\Dotenv::createImmutable(__DIR__)->load(); 或等价写法,.env 就完全不会被解析。
- 常见错误:以为 Composer 自动加载了 dotenv,或误以为框架(如 ThinkPHP)已替你做了这事——其实 Workerman 启动是绕过框架生命周期的独立进程
- ThinkPHP 集成时,必须在
start.php顶部加require __DIR__ . '/vendor/autoload.php';,再立即调用 dotenv 加载,顺序不能反 - 如果用了
Dotenv\Dotenv::createUnsafeImmutable(),注意它会忽略.env中带空格或特殊字符的值,建议统一用createImmutable()+ 引号包裹值
配置被硬编码覆盖,优先级高于 env
即使 .env 被成功加载,你在 start.php 或 Worker 初始化代码里直接写了 $worker->name = 'myapp'; 或 new Redis('127.0.0.1'),这些字面量就彻底覆盖了 env('REDIS_HOST') 的意图。
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 检查所有 Worker 实例化、连接初始化、路由注册等位置,是否把本该从环境变量取的值写死了
- 尤其注意 ThinkPHP 的
config/目录下如果有database.php等文件,它们可能通过think\facade\Config提前读取并缓存了配置,而 Workerman 进程并不共享这个缓存 - 正确做法是:所有连接参数、端口、主机名,都统一走
$_ENV['KEY']或封装好的env('KEY', 'default')函数调用
修改后没重启进程,reload 不触发重加载
Workerman 没有热重载机制。执行 php start.php reload 只会平滑重启 Worker 子进程,但不会重新执行 start.php 顶层代码——也就是说,dotenv 加载、自动加载引入、全局配置初始化这些只在主进程启动时跑一次。
-
reload命令对.env修改完全无效;必须用php start.php stop && php start.php start或restart - 开发阶段别用
-d守护模式,否则改完要手动 kill 进程,容易漏掉残留子进程 - 确认重启后是否真加载了新值:在
start.php开头加var_dump($_ENV['DB_HOST'] ?? 'not set');,看输出是否为你刚改的值
最容易被忽略的是:dotenv 加载时机必须早于任何依赖环境变量的代码,且 Workerman 主进程生命周期内只加载一次。一旦启动,.env 就只是个文本文件了。

















