
Laravel 应用在切换数据库后仍连接旧库,常见于环境变量中残留的 DB_SOCKET 等隐式配置;本文详解如何定位并彻底解决此类“缓存已清却仍连错库”的顽固问题。
laravel 应用在切换数据库后仍连接旧库,常见于环境变量中残留的 `db_socket` 等隐式配置;本文详解如何定位并彻底解决此类“缓存已清却仍连错库”的顽固问题。
在 Laravel 8+ 项目中,即使你已正确修改 .env 中的 DB_HOST、DB_DATABASE 等关键参数,并执行了 php artisan config:clear、php artisan config:cache、php artisan optimize:clear,甚至重启 Nginx、PHP-FPM 和数据库服务,应用仍持续连接旧数据库(如 DB1),而 php artisan db:sql 却能正确连接新库(DB2)——这种“行为不一致”往往指向一个被忽视的底层连接参数:DB_SOCKET。
DB_SOCKET 是 MySQL 连接时用于指定 Unix 域套接字路径的选项(如 /tmp/mysql.sock 或 /var/run/mysqld/mysqld.sock)。当它被显式设置在 .env 中时,Laravel 会优先通过该 socket 路径连接本地 MySQL 实例(通常是默认安装的 DB1),完全忽略 DB_HOST 的值(即使你已设为 DB2 的 IP 或域名)。这正是导致 php artisan tinker 和 Web 请求始终连错库,而 php artisan db:sql(可能绕过部分配置逻辑或使用不同连接方式)却表现正常的根本原因。
✅ 正确排查步骤如下:
-
检查
.env中是否存在DB_SOCKETDB_SOCKET=/tmp/mysql.sock ← 删除这一行!
即使你未主动添加,某些部署脚本、Docker 模板或历史迁移可能遗留该配置。只要存在,Laravel 就会强制走本地 socket 连接,
DB_HOST形同虚设。 -
确认
config/database.php中 MySQL 配置是否受环境变量影响
检查mysql连接配置块,确保unix_socket键来自环境变量且无硬编码:'mysql' => [ 'driver' => 'mysql', 'url' => env('DATABASE_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), // ← 关键:若 .env 中有值,此处即生效 // ... 其他配置 ], -
清理并验证
删除DB_SOCKET=行后,务必执行:php artisan config:clear php artisan cache:clear # 如使用 OPcache,可额外执行: php -r "opcache_reset();"
然后通过 Tinker 快速验证:
>>> \DB::connection()->getPdo()->getAttribute(\PDO::ATTR_CONNECTION_STATUS) => "Connected to localhost via UNIX socket" // 若仍显示 UNIX socket,说明 DB_SOCKET 未彻底清除(检查 .env、.env.example、服务器级环境变量等)
⚠️ 注意事项:
-
DB_SOCKET与DB_HOST互斥:一旦设置unix_socket,PDO 会忽略host和port,直连本地 socket 文件; - 某些 Docker 环境或 macOS MAMP/XAMPP 可能默认注入
DB_SOCKET,需检查容器启动参数或全局.env; - 使用
php artisan tinker测试时,务必在清除配置后新开终端会话,避免读取旧 shell 环境变量; - 若需连接远程 DB2,确保
DB_SOCKET为空(或直接删除该行),并确认DB_HOST为 DB2 的可访问地址(非localhost或127.0.0.1)。
总结:当 Laravel “顽固”连接旧库,且常规缓存清理无效时,请优先审查 .env 中所有以 DB_ 开头的变量——尤其是 DB_SOCKET。它像一个沉默的重定向开关,悄无声息地覆盖你的所有主机配置。删除它,再清缓存,90% 的类似问题将迎刃而解。











