laravel本地数据库连接失败的首要原因是db_host=localhost触发unix socket连接而非tcp,导致“no such file or directory”错误;应改为127.0.0.1并执行php artisan config:clear清除配置缓存。

DB_HOST 写成 localhost 而不是 127.0.0.1
这是本地开发中最常踩的坑:MySQL 默认监听 127.0.0.1(TCP/IP),但当你在 .env 里写 DB_HOST=localhost,PHP 的 MySQL 扩展会尝试走 Unix socket 连接,而 socket 文件路径可能没配对或根本不存在。
现象是报错:SQLSTATE[HY000] [2002] No such file or directory,哪怕 MySQL 服务明明在运行。
- 直接改
.env:把DB_HOST=localhost换成DB_HOST=127.0.0.1 - 不用重启 PHP-FPM 或 Apache,但要清缓存:
php artisan config:clear - 如果用 Docker,确认容器网络互通,
127.0.0.1指的是容器内网关,不是宿主机
APP_DEBUG=false 却没开错误详情
连不上数据库时,页面只显示 “Whoops, looks like something went wrong.”,啥线索都没有——因为 Laravel 在 APP_ENV=production 或 APP_DEBUG=false 下主动屏蔽了真实错误。
你根本不知道是密码错、库名错,还是连接超时。
- 先检查
.env中APP_DEBUG=true是否生效(注意别被config:cache锁死) - 运行
php artisan config:clear确保新配置加载 - 再刷新,看到具体报错如
Access denied for user或Connection refused,才能往下定位
配置缓存没清,.env 修改不生效
很多人改完 .env 就去测试,结果还是连老库、用旧密码。原因很直接:php artisan config:cache 把所有配置固化成 PHP 数组,env() 函数不再读取文件。
本地开发阶段,这个命令几乎没必要跑;一旦跑了,每次改 .env 都必须手动清掉。
- 判断是否缓存了:看
bootstrap/cache/config.php文件是否存在 - 清除它:
php artisan config:clear(不是cache:clear) - 顺手也清路由缓存:
php artisan route:clear,避免其他配置干扰
MySQL 用户权限没给全,尤其本地新装环境
报错 Access denied for user 'xxx'@'localhost' 不一定密码错——更可能是用户没被授权访问目标库,或者只允许从特定 host 连接。
本地 MySQL 8+ 默认创建用户时绑定 'user'@'localhost',但 Laravel 用 127.0.0.1 连,就匹配不到该用户。
- 登录 MySQL:
mysql -u root -p - 查用户:
SELECT User, Host FROM mysql.user; - 如果只有
'myuser'@'localhost',但你用127.0.0.1连,就加一条:CREATE USER 'myuser'@'127.0.0.1' IDENTIFIED BY 'xxx'; GRANT ALL ON mydb.* TO 'myuser'@'127.0.0.1'; FLUSH PRIVILEGES;
最麻烦的其实是组合问题:比如你改了 DB_HOST,但忘了清配置缓存,又开着 APP_DEBUG=false,结果卡在“谁错了都不知道”的状态。本地连库看似简单,实则每一步都依赖前一步的正确性。











