数据库连接失败时应先查看pdoexception的message字段,明确错误类型;再检查mysql服务状态、配置匹配性(如host/port)、环境变量加载条件及mysql 8.0认证插件兼容性。

数据库连接失败时先看 PDOException 的具体错误信息
ThinkPHP 本身不直接抛出连接失败的底层原因,真正报错的是 PDO 层。你看到的错误里如果包含 PDOException,重点盯住它的 message 字段——它通常会明确说“Connection refused”、“Access denied for user”或“No such file or directory”,这三类分别对应服务未启动、账号密码错、Unix socket 路径不对。
常见误区是只改 database.php 配置却不验证 MySQL 实际状态。建议先在命令行手动测试:
mysql -h 127.0.0.1 -P 3306 -u root -p
如果这里都连不上,ThinkPHP 肯定也连不上。注意:用 127.0.0.1 而非 localhost,因为后者在某些系统下会触发 Unix socket 连接,而配置里写的是 TCP,容易错位。
database.php 中 host 和 port 写对了,但还是连不上
ThinkPHP 默认配置里 host 是 127.0.0.1,port 是 3306,但实际环境常有偏差:
- Docker 环境中,
host不能写localhost或127.0.0.1,得换成容器名(如mysql)或宿主机网关(如host.docker.internal) - Mac M1 用户用 Homebrew 装的 MySQL,默认监听
/opt/homebrew/var/mysql/mysql.sock,但 ThinkPHP 强制走 TCP,需确认mysqld是否启用了bind-address = 127.0.0.1和skip-networking = OFF - 阿里云/腾讯云服务器上,安全组必须放行
3306端口,且 MySQL 的user表里该账号的host字段不能是localhost(远程连不进),得设为%或具体 IP
使用 env 文件覆盖配置后没生效
ThinkPHP 6+ 默认读取 .env,但有两个关键前提:
-
.env文件必须放在项目根目录(和think命令同级),不是app/或config/下 -
APP_DEBUG必须为true,否则环境变量加载逻辑会被跳过(这是很多人踩坑最多的一点) -
.env里的键名要全大写加下划线,例如DB_HOST=127.0.0.1,对应到配置里是env('DB_HOST'),不能写成db_host
验证是否加载成功,可在控制器里临时加一句:dump(env('DB_HOST'));。输出 null 就说明文件位置、格式或调试开关有问题。
MySQL 8.0+ 连接报 Authentication plugin 'caching_sha2_password' cannot be loaded
这是 MySQL 8.0 默认认证插件与 PHP 7.4 以下版本不兼容导致的。解决方式不是降级 MySQL,而是调整用户认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
执行完记得 FLUSH PRIVILEGES;。如果用的是 Docker,也可以在 my.cnf 里加一行:default_authentication_plugin=mysql_native_password,然后重启容器。
这个错误不会出现在本地开发机装 MySQL 5.7 的情况,但一上云或换新环境就极易复现——尤其当你用一键脚本部署 MySQL 8.0 时,几乎必踩。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










