webman 打包成phar后,自定义命令中获取不到数据库配置

xiaopi

问题描述

前提:打包成phar文件后,未包含.env文件。

自定义命令中执行查询数据库操作,提示错误SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO) 调试发现自定义命令中并未获取到.env中的配置。

请问如何使打包后,自定义命令依旧可以读取xxx.phar文件同级目录下.env文件

514 2 0
2个回答

xiaopi

在调试过程中发现,以往的版本是不支持打包phar文件后,获取同级目录的.env文件的。
现在的新版本已经支持,如

php8 build/xxx.phar start

启动服务后,项目中是可以获取.env配置的

但是自定义方法依旧不支持,如

php8 build/xxx.phar custom:command // 获取数据库中结果

这种就不能获取.env

这就比较奇怪了,还在调试php8 build/xxx.phar startphp8 build/xxx.phar custom:command的区别

  • 暂无评论
xiaopi

调试发现是路径不对,在support/bootstrap.php文件中,加载Dotenv的方法并没有兼容打包后的程序。
按原有代码逻辑,当打包后,会去寻找xx.phar/.env,而我的.env是与xx.phar同一目录的。base_path()应该改为run_path(),由于base_path()方法中通过传递false已经实现了run_path(),所以修改代码为:
support/bootstrap.php文件

if (class_exists('Dotenv\Dotenv') && file_exists(base_path() . '/.env')) {
    if (method_exists('Dotenv\Dotenv', 'createUnsafeMutable')) {
        Dotenv::createUnsafeMutable(base_path())->load();
    } else {
        Dotenv::createMutable(base_path())->load();
    }
}

改为

if (class_exists('Dotenv\Dotenv') && file_exists(base_path(false) . '/.env')) {
    if (method_exists('Dotenv\Dotenv', 'createUnsafeMutable')) {
        Dotenv::createUnsafeMutable(base_path(false))->load();
    } else {
        Dotenv::createMutable(base_path(false))->load();
    }
}

ps:
之所以打包后,php8 build/xxx.phar start可以读取到env,是因为在support\App::run()方法中,又使用了run_path()设置了一遍env.

上述解决方案中是否会引起其他问题? 还待测试

  • walkor 2023-05-18

    感谢反馈,主干已经做了修改,等下个版本一起发布

🔝