先看pdoexception的message字段:connection refused→mysql未启动或端口被拦;access denied→账号密码错或host不匹配;no such file→socket路径问题;caching_sha2_password→mysql 8.0认证插件不兼容。

ThinkPHP数据库连接失败,别急着改配置,先看错误信息本身——PDOException的message字段才是关键线索。它会直接告诉你问题出在“连不上”“登不进”还是“找不到”,比盲目调参高效得多。
看懂错误提示,锁定真实原因
打开 runtime/log 下最新日志,找到带 PDOException 的那行,重点读 message:
- "Connection refused" → MySQL服务没开,或端口(默认3306)被防火墙拦了、安全组没放行
- "Access denied for user 'xxx'@'yyy'" → 用户名密码错,或该用户在MySQL里授权的 host 不匹配(比如配了 localhost,但PHP走的是127.0.0.1)
- "No such file or directory" → Unix socket 路径不对,常见于 Mac M1 或 Docker 环境,默认走 socket 却强制配了 TCP
- "caching_sha2_password cannot be loaded" → MySQL 8.0+ 默认认证插件与旧版 PHP 扩展不兼容
验证底层是否通畅,绕过框架直查
别只信 config/database.php,用命令行验证真实连通性:
- 执行 mysql -h 127.0.0.1 -P 3306 -u root -p —— 成功说明服务、端口、凭证都对;失败就不用继续看 TP 配置了
- 注意:用 127.0.0.1 而非 localhost,避免系统自动切到 Unix socket 导致判断偏差
- Docker 环境中,host 必须写容器名(如 mysql)或 host.docker.internal,不能写 127.0.0.1
检查配置加载是否真正生效
很多人改了 .env 却没效果,是因为三个硬条件没满足:
- .env 文件必须放在项目根目录(和 think 命令同级),不是 app/ 或 config/ 下
- APP_DEBUG = true,否则环境变量加载逻辑会被跳过
- 键名必须全大写加下划线,例如 DB_HOST=127.0.0.1,不能写成 db_host 或 DB-host
- 临时加一行 dump(env('DB_HOST'));,输出 null 就说明没加载成功
适配不同运行环境的关键细节
同一套配置,在本地、Docker、云服务器上可能表现不同:
- Mac M1 + Homebrew MySQL:默认监听 /opt/homebrew/var/mysql/mysql.sock,需确认 mysqld 启用了 bind-address = 127.0.0.1 和 skip-networking = OFF
- 阿里云/腾讯云:安全组必须放行 3306,且 MySQL user 表中对应账号的 host 字段不能是 localhost,得设为 % 或具体公网 IP
- MySQL 8.0+:执行 ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; 切换认证方式
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











