应先查看pdoexception的message字段:出现“connection refused”说明mysql未启动或网络不通,“access denied”表明账号密码错误或host不匹配,“no such file”指向socket路径问题,“caching_sha2_password”则提示mysql 8.0+认证插件兼容性不足。

ThinkPHP数据库连接失败,别急着改配置,先盯住错误信息本身——真正有用的线索,90%藏在 PDOException 的 message 字段里。它不是“数据库连接失败”这种笼统提示,而是明确告诉你:是服务没开、密码错、还是认证方式不兼容。
看日志里真实的 PDOException message
打开 runtime/log/ 下最新日志文件,找到带 PDOException 的那一行,直接读它的 message:
- Connection refused → MySQL 进程没启动,或 host/port 根本不通(比如 Docker 里写了 127.0.0.1 却连的是容器自身)
- Access denied for user → 账号密码错误,或该用户只允许从 localhost 连,但 PHP 实际运行环境(如 Nginx 容器、WSL2)无法匹配这个 host
- No such file or directory → 配置写了 localhost,但 MySQL 没启用 socket,或路径不对(常见于 Mac M1 + Homebrew 安装)
- caching_sha2_password cannot be loaded → MySQL 8.0+ 默认认证插件,PHP 版本偏低(如 7.4 以下)不支持
用命令行直连验证 MySQL 状态
别只信配置文件,去服务器或容器里执行:
-
mysql -h 127.0.0.1 -P 3306 -u root -p—— 注意用 IP,不用 localhost,避免 socket 干扰 - 能登录,说明服务、账号、端口都 OK;登不上,ThinkPHP 肯定也连不上
- Docker 环境中,host 改为
mysql(容器名)或host.docker.internal(宿主机网关)
确认 .env 是否真被加载
前后端分离项目常用 .env 管理配置,但它有三个硬性条件:
- .env 必须放在项目根目录(和
think命令同级),不是 config/ 或 app/ 下 -
APP_DEBUG=true必须开启,否则环境变量加载逻辑会被跳过 - 键名全大写加下划线,例如
DB_HOST=127.0.0.1,写成db_host或Db_Host都无效
临时在控制器加一行:dump(env('DB_HOST'));,输出 null 就说明上面某条没满足。
检查 MySQL 8.0+ 认证兼容性与网络通路
如果报错含 caching_sha2_password:
- 执行 SQL 修改用户认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 别忘了
FLUSH PRIVILEGES;
云服务器上还要确认:
- 安全组放行 3306 端口
- MySQL 用户的 host 字段设为
%或具体 IP,不能是localhost(远程无法连入) - MySQL 配置中
bind-address = 127.0.0.1且skip-networking = OFF
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











