thinkphp 8.0连不上数据库需逐层排查:先查runtime/log中pdoexception的message字段定错误类型;再验pdo_mysql扩展是否启用、.env是否在根目录且app_debug=true、db_host等键名全大写;最后确认mysql 8.0用户host匹配及认证插件是否为mysql_native_password。

ThinkPHP 8.0 连不上数据库,通常不是“配置写错了”这么简单,而是卡在某个具体环节——比如 PDO 根本没加载、MySQL 拒绝了连接请求、或环境变量压根没读进来。关键得一层层往下拆,别一上来就改 config/database.php。
先看错误到底是什么类型
打开 runtime/log/ 下最新日志文件,找带 PDOException 的那条记录,重点盯住 message 字段:
- “Connection refused” → MySQL 服务没启动,或 host/port 不通(比如 Docker 里写了 127.0.0.1 却该写 mysql)
- “Access denied for user” → 账号密码错,或用户 host 不匹配('root'@'localhost' 和 'root'@'127.0.0.1' 是两个用户)
- “No such file or directory” → 配置写了 localhost,但 MySQL 没开 TCP 监听,或 Unix socket 路径不对(常见于 Mac M1)
- “caching_sha2_password cannot be loaded” → MySQL 8.0+ 默认认证插件不兼容 PHP 版本(尤其 PHP ≤7.3 或集成环境)
确认 PDO 和扩展真就绪了
TP8 连不上,可能连 PDO 都没起来。执行这几步验证:
- 运行 php -m | grep pdo,确保输出里有 pdo 和 pdo_mysql
- 如果没看到,检查 php.ini:取消 extension=pdo_mysql 前的分号,重启 Web 服务(Apache/Nginx)或 PHP-FPM
- 临时写个测试脚本 test_db.php 放到 public 目录下:
浏览器直接访问,看是否抛出明确报错
.env 文件是不是白写了
ThinkPHP 8 默认靠 .env 管理数据库配置,但它有三个硬性条件,缺一不可:
- .env 必须放在项目根目录(和 index.php、think 命令同级),不是 config/ 或 app/ 下
- APP_DEBUG = true 必须开启,否则整个 .env 加载逻辑会被跳过
- 键名全大写+下划线,例如 DB_HOST=127.0.0.1 —— 写成 db_host 或 DbHost 都无效
验证是否生效:在控制器里加一行 dump(env('DB_HOST'));,输出 null 就说明上面某条没满足。
MySQL 8.0+ 用户和认证要对上号
MySQL 8.0 默认用 caching_sha2_password 认证,老 PHP 环境不认。别降级 MySQL,按这个顺序操作:
- 登录 MySQL,执行:
SELECT User, Host, plugin FROM mysql.user WHERE User = 'your_user';
看 plugin 列是不是 caching_sha2_password - 如果是,执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';
再执行 FLUSH PRIVILEGES; - ThinkPHP 配置里 hostname 显式写成 '127.0.0.1'(别用 localhost),hostport 写成数字 3306
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











