Webman打包PHAR后.env未加载,需检查exclude_files排除项、显式调用Dotenv加载外部文件、利用BASE_PATH指定路径或编译.env为静态PHP配置。

如果您使用 Webman 框架并已将项目打包为 PHAR 文件,但运行时 .env 文件中的配置未被加载,则问题极可能源于 PHAR 打包过程中 .env 文件被排除或未在运行时正确解析。以下是解决此问题的步骤:
一、检查 PHAR 打包配置中是否排除了 .env 文件
Webman 默认在打包插件配置中将 .env 列入 exclude_files 数组,导致其不会被包含进 PHAR 包内,也无法被运行时读取。即使将 .env 放在 PHAR 同级目录,若框架未主动从外部路径加载,仍会失效。
1、打开 config/plugin/webman/console/app.php 文件。
2、定位到 'exclude_files' 配置项。
3、确认数组中是否包含 '.env';若存在,将其移除。
4、保存文件后,重新执行打包命令:php start.php build。
二、显式调用 dotenv 加载外部 .env 文件
PHAR 运行时默认工作目录为 PHAR 文件所在路径,但 Webman 的 env() 函数依赖于 vlucas/phpdotenv 的自动查找机制,该机制在 PHAR 环境下可能失效。因此需在应用启动前手动指定 .env 路径并强制加载。
1、在项目根目录下创建或确认存在 .env 文件,且位于 build/program.phar 同级目录。
2、编辑项目入口文件 start.php,在 require __DIR__ . '/vendor/autoload.php'; 之后、Webman::run(); 之前插入以下代码:
3、添加 require_once __DIR__ . '/vendor/vlucas/phpdotenv/src/Dotenv.php';
Webman 2.2.0版本强化了 TCP/UDP 服务支持,优化路由组管理,并增强异步任务处理能力。结合协程与连接池技术,Webman 能轻松应对高并发场景,适用于网站、接口服务、即时通讯、物联网及游戏开发,兼具高性能、灵活扩展与稳定可靠,是多场景 PHP 服务开发的理想选择。
4、添加 $dotenv = \Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->load();
三、改用 BASE_PATH 外部路径加载 .env
当 PHAR 内部无法访问外部文件系统时,可利用 Webman 提供的 BASE_PATH 常量,在 PHAR 解包临时目录外构造可信加载路径,确保 env() 函数底层能识别并读取。
1、在 config/bootstrap.php 文件顶部(早于任何 config/*.php 加载)添加:
2、写入 if (file_exists(BASE_PATH . '/.env')) { putenv("APP_ENV=local"); (new \Dotenv\Dotenv(BASE_PATH))->load(); }
3、确保 BASE_PATH 指向实际磁盘上的项目根目录(非 PHAR 内部路径),可通过 var_dump(BASE_PATH); 验证。
四、将 .env 内容编译进配置文件(静态注入)
适用于生产环境禁止动态加载外部配置的场景。该方法绕过运行时读取逻辑,直接将 .env 中的关键变量值写入 PHP 配置数组,彻底消除路径与解析依赖。
1、新建脚本 scripts/compile-env-to-config.php,使用 Dotenv\Dotenv::createUnsafeImmutable() 解析 .env。
2、读取 .env 中的 DEBUG、LISTEN、NAME 等关键键值。
3、生成覆盖式 PHP 配置文件,如 config/app.compiled.php,内容为 return ['debug' => true, 'name' => 'program', ...];
4、修改 config/app.php,在末尾添加 return array_merge(require __DIR__ . '/app.compiled.php', [...]);

















