应先查看pdoexception的message字段,如“connection refused”“access denied”“no such file”,再验证mysql服务、.env加载条件(位置、app_debug=true、全大写键名)、docker/host配置及mysql 8.0认证插件兼容性。

直接看 PDOException 的 message 字段,它比 ThinkPHP 报错更准——连不上不是框架问题,是 PDO 层在告诉你“服务没开”“密码错了”或“socket 路径不对”。
怎么看 PDOException 的真实错误信息
ThinkPHP 6 不会自己造错,它抛的错全来自底层 PDO。打开 runtime/log/ 下最新日志,找带 PDOException 的那行,盯住 message 值:
-
Connection refused→ MySQL 没启动,或host/port根本不通 -
Access denied for user→ 账号密码错,或该用户只允许从localhost连,但 PHP 运行在 Docker/Nginx 容器里 -
No such file or directory→ 配置写了localhost,但 MySQL 没启用 TCP(比如 Mac M1 Homebrew 默认只开 socket)
别急着改 database.php,先在终端执行:mysql -h 127.0.0.1 -P 3306 -u root -p。能登进去,说明服务、端口、账号都 OK;登不进,ThinkPHP 必然也连不上。
env 文件没生效的三个硬条件
ThinkPHP 6 默认读 .env,但它不会自动加载——必须同时满足:
-
.env文件放在项目根目录(和think命令同级),不是config/或app/下 -
APP_DEBUG=true必须开启,否则环境变量加载逻辑被跳过(这是最多人踩的坑) - 键名全大写加下划线,比如
DB_HOST=127.0.0.1,写成db_host或Db_Host都无效
临时在控制器加一句:dump(env('DB_HOST'));。输出 null 就说明上面某条不满足。
Docker 和云服务器的 host 写法差异
本地开发用 127.0.0.1 可能通,但换到 Docker 或云服务器就断,因为网络拓扑变了:
- Docker 环境中,
host不能写localhost或127.0.0.1,得换成 MySQL 容器名(如mysql)或宿主机网关(host.docker.internal) - 阿里云/腾讯云等,安全组必须放行
3306端口,且 MySQL 用户表里的host字段不能是localhost(远程连不进),得设为%或具体公网 IP - Mac M1 用 Homebrew 装的 MySQL,默认监听
/opt/homebrew/var/mysql/mysql.sock,但 ThinkPHP 强制走 TCP,需确认mysqld启用了bind-address = 127.0.0.1且skip-networking = OFF
MySQL 8.0+ 认证插件不兼容
报错含 caching_sha2_password?这是 MySQL 8.0 默认认证方式,PHP 7.4 以下版本不支持:
- 不要降级 MySQL,执行 SQL 改认证:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 改完必须执行:
FLUSH PRIVILEGES; - PHP 扩展也要检查:
php -m | grep -i pdo确认pdo和pdo_mysql都在列表里
真正容易被忽略的是:错误信息里那个 message 字段,它不骗人;而 APP_DEBUG=false 时,.env 就是摆设——这两点卡住的人最多。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











