laravel数据库连接失败绝大多数源于.env配置未生效或mysql服务未连通;需将db_host设为127.0.0.1而非localhost,验证mysql -h 127.0.0.1登录,检查服务状态、权限及bootstrap/cache/与storage/目录属主和775权限。

绝大多数情况是 .env 配置没生效,或者数据库服务根本没连上——不是代码问题,是环境断在了第一步。
DB_HOST 设成 localhost 就挂了
PHP 在 Linux 上用 localhost 会走 Unix socket,但 MySQL 默认可能只监听 TCP(尤其是宝塔、Docker 或自编译安装时)。localhost 找不到 /var/run/mysqld/mysqld.sock 就直接报 No such file or directory。
- 把
.env里的DB_HOST=localhost改成DB_HOST=127.0.0.1 - 顺手检查
mysql -h 127.0.0.1 -u your_user -p能否登录,排除 MySQL 本身没启或权限问题 - 如果用的是宝塔,确认 MySQL 服务状态页显示“正在运行”,别信“绿色图标”就以为活的
env() 函数在多项目共存时读串了
Apache 的线程模式(如 worker)或某些 PHP SAPI 下,getenv() / putenv() 是非线程安全的。两个 Laravel 站点(比如 site1.test 和 site2.test)共用一个 PHP 进程池时,.env 可能被互相覆盖,导致连错库、表不存在。
- 临时验证:在
config/database.php里把'host' => env('DB_HOST', '127.0.0.1')直接写死成'host' => '127.0.0.1',看是否还错 - 长期解法:换 PHP 的 NTS(Non-Thread-Safe)版本;或 Apache 改用 prefork 模式;或改用 PHP-FPM + Nginx(更推荐)
- 别依赖
php artisan config:cache来“修复”,它只是缓存已加载的 env 值,污染已经发生
storage/ 和 bootstrap/cache/ 权限不对,导致配置根本没加载
权限错了不会直接报数据库错误,而是让 env() 返回空、config:cache 写失败、甚至 APP_KEY 加载异常,最终表现为“连不上”——因为实际连接参数是空字符串或默认值。
- 确保
storage/和bootstrap/cache/目录属主是 Web 服务器用户(宝塔默认是www),权限设为775 - 执行:
chown -R www:www storage/ bootstrap/cache/,再chmod -R 775 storage/ bootstrap/cache/ - 别碰
777,尤其生产环境;也别漏掉bootstrap/cache/,很多人只改storage/
真正卡住人的地方,往往不是 SQL 写错,而是 DB_HOST 看着对、其实被 socket 绕开,或是两个站点在同一个 PHP 进程里抢 env(),又或是 bootstrap/cache/config.php 根本写不进去——这些都不会报明确的“数据库连接失败”,只会让你在日志里看到一堆空参数或超时。











