先看PDOException的message字段,它直接告诉你错在哪;“[2002] Connection refused”表示MySQL未启动或端口不通,“[1045] Access denied”说明认证失败,“[2002] No such file”指向socket路径问题。

连不上 MySQL,别急着改配置——先看 PDOException 的 message 字段,它直接告诉你错在哪。90% 的问题靠这一步就能定位。
一、看报错信息,锁定错误类型
ThinkPHP 不自己抛连接异常,真正报错的是 PDO 层。你看到的错误里只要含 PDOException,就盯住它的 message:
- “SQLSTATE[HY000] [2002] Connection refused” → MySQL 服务没启动,或端口不通
- “SQLSTATE[HY000] [1045] Access denied for user” → 用户名、密码、host 三者至少一个不匹配
-
“SQLSTATE[HY000] [2002] No such file or directory” → 误用了 Unix socket(比如 host 写了
localhost,但 MySQL 没监听 socket 文件)
二、手动验证连接,绕过框架干扰
在项目根目录终端执行:
mysql -h 127.0.0.1 -P 3306 -u root -p
注意必须用 127.0.0.1,不是 localhost——后者在 macOS/Linux 下默认走 socket,容易和 PHP 配置错位。如果这步都连不上,ThinkPHP 肯定也连不上。
立即学习“PHP免费学习笔记(深入)”;
三、检查配置是否真正生效
ThinkPHP 6+ 默认读 .env,但它不会自动加载——以下三点必须同时满足:
-
.env文件必须放在项目根目录(和think命令同级),不能放app/或config/下 -
APP_DEBUG必须为true,否则环境变量加载逻辑被跳过(最常被忽略) -
.env里的键名必须全大写加下划线,如DB_HOST=127.0.0.1,不能写成db_host或Db_Host
验证是否加载成功:控制器里临时加一句 dump(env('DB_HOST'));,输出 null 就说明上面至少有一条没做到。
四、确认 MySQL 8.0 认证兼容性
MySQL 8.0 默认使用 caching_sha2_password 插件,而旧版 PHP/PDO 不支持。表现为:
解决方式不是降级 MySQL,而是改用户认证方式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';<br>FLUSH PRIVILEGES;
若用户 host 是 localhost,请对应改成 'your_user'@'localhost'。



















