前提:打包成phar文件后,未包含.env文件。
自定义命令中执行查询数据库操作,提示错误SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO) 调试发现自定义命令中并未获取到.env中的配置。
SQLSTATE[HY000] [1045] Access denied for user ''@'localhost' (using password: NO)
请问如何使打包后,自定义命令依旧可以读取xxx.phar文件同级目录下.env文件
xxx.phar
.env
在调试过程中发现,以往的版本是不支持打包phar文件后,获取同级目录的.env文件的。 现在的新版本已经支持,如
php8 build/xxx.phar start
启动服务后,项目中是可以获取.env配置的
但是自定义方法依旧不支持,如
php8 build/xxx.phar custom:command // 获取数据库中结果
这种就不能获取.env
这就比较奇怪了,还在调试php8 build/xxx.phar start 和php8 build/xxx.phar custom:command的区别
php8 build/xxx.phar custom:command
调试发现是路径不对,在support/bootstrap.php文件中,加载Dotenv的方法并没有兼容打包后的程序。 按原有代码逻辑,当打包后,会去寻找xx.phar/.env,而我的.env是与xx.phar同一目录的。base_path()应该改为run_path(),由于base_path()方法中通过传递false已经实现了run_path(),所以修改代码为: support/bootstrap.php文件
support/bootstrap.php
xx.phar/.env
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.
上述解决方案中是否会引起其他问题? 还待测试
感谢反馈,主干已经做了修改,等下个版本一起发布
在调试过程中发现,以往的版本是不支持打包phar文件后,获取同级目录的.env文件的。
现在的新版本已经支持,如
启动服务后,项目中是可以获取.env配置的
但是自定义方法依旧不支持,如
这种就不能获取.env
这就比较奇怪了,还在调试
php8 build/xxx.phar start
和php8 build/xxx.phar custom:command
的区别调试发现是路径不对,在
support/bootstrap.php
文件中,加载Dotenv的方法并没有兼容打包后的程序。按原有代码逻辑,当打包后,会去寻找
xx.phar/.env
,而我的.env是与xx.phar同一目录的。base_path()应该改为run_path(),由于base_path()方法中通过传递false已经实现了run_path(),所以修改代码为:support/bootstrap.php
文件改为
ps:
之所以打包后,php8 build/xxx.phar start可以读取到env,是因为在support\App::run()方法中,又使用了run_path()设置了一遍env.
上述解决方案中是否会引起其他问题? 还待测试
感谢反馈,主干已经做了修改,等下个版本一起发布