Laravel 8切换至DB2失败,始终连接旧数据库DB1求助
Laravel 8 切换数据库后仍连接旧库的排查思路
问题概述
- 原有Laravel 8应用使用MySQL数据库DB1,修改
.env的DB_HOST为DB2并清理配置缓存后,应用仍始终连接DB1 - 异常现象:
php artisan db sql能正常连接DB2,但php artisan tinker无法访问DB2独有的表;停止DB1后应用直接报PDO连接错误
已尝试无效操作
- 执行
php artisan config:cache/config:clear、php artisan optimize:clear - 重启DB1/DB2、nginx、php-fpm
- 重新部署应用(含
composer install) - 在
config/database.php新增连接或硬编码DB2配置,问题依旧
下一步排查方向
检查web服务的环境变量覆盖
部分场景下,nginx或php-fpm的配置会单独设置环境变量,直接覆盖.env内容:- 查看php-fpm的pool配置文件(如
/etc/php/7.4/fpm/pool.d/www.conf),是否存在env[DB_HOST]这类自定义环境变量 - 检查nginx配置里的
fastcgi_param,是否传递了DB_HOST等数据库相关参数
- 查看php-fpm的pool配置文件(如
验证实际加载的配置值
在应用中新增测试路由,输出当前实际加载的数据库配置:Route::get('/test-db-config', function () { dd([ 'env_DB_HOST' => env('DB_HOST'), 'config_DB_HOST' => config('database.connections.mysql.host'), 'env_file_path' => base_path('.env') ]); });访问该路由,确认实际读取的
DB_HOST是否为DB2,以及.env文件路径是否正确。排查自定义代码对连接的修改
检查项目中是否有自定义服务提供者、中间件,在启动过程中修改了数据库连接配置:- 查看
app/Providers目录下的服务提供者,尤其是boot()方法里是否有重置DB连接的代码 - 检查全局中间件,是否存在强制切换数据库连接的逻辑
- 查看
检查tinker的环境文件
确认tinker是否加载了额外的环境配置文件(如.env.local、.env.tinker),这些文件的配置会覆盖主.env。可在tinker中执行:dd(config('database.connections.mysql'));查看输出的配置是否为DB2的信息。
关闭数据库持久化连接
如果config/database.php中mysql连接设置了'persistent' => true,可能导致php-fpm复用了之前的DB1持久连接。将该值改为false,重启php-fpm后再测试。确认应用运行用户的文件权限
执行artisan命令的用户和web服务运行用户(如www-data)可能不是同一个,导致两者读取的.env文件不一致。可通过ps aux | grep php-fpm查看web服务运行用户,检查该用户对项目目录下.env文件的读取权限,以及是否读取的是正确文件。
内容的提问来源于stack exchange,提问作者Jacques Martin
相关产品推荐
相关产品推荐

