thinkphp 6 连接 mysql 必须配置 .env 文件,因默认优先读取其配置并覆盖 database.php;需显式设置 database_type=mysql,host 避免用 localhost 而用 127.0.0.1,修改后须执行 php think clear 清缓存。

ThinkPHP 6 连接 MySQL 必须配 .env 而不是 database.php
默认情况下,ThinkPHP 6 优先读取 .env 文件配置数据库,config/database.php 里的设置会被覆盖。很多人改了 PHP 配置文件却连不上,就是因为没碰 .env。
-
DATABASE_TYPE=mysql(必须显式写,不能省略) -
DATABASE_HOST=127.0.0.1(别用localhost,某些系统下会走 socket 导致超时) -
DATABASE_PORT=3306(如果改过端口,这里必须同步) -
DATABASE_NAME、DATABASE_USERNAME、DATABASE_PASSWORD一个都不能空 - 修改后要清缓存:
php think clear,否则配置不生效
连接失败报 SQLSTATE[HY000] [1045] Access denied 怎么查
这个错误表面是账号密码错,但 ThinkPHP 下更可能是权限或 host 匹配问题。
- 先用命令行验证:
mysql -h 127.0.0.1 -u your_user -p,确认能否登录 - 检查 MySQL 用户的
host字段:如果是'user'@'localhost',那DATABASE_HOST=127.0.0.1就连不上,得改成localhost或新建'user'@'%' - ThinkPHP 默认用
PDO::ATTR_EMULATE_PREPARES => false,某些老 MySQL 版本(如 5.5)不兼容,可在database.php中临时设为true测试
多数据库怎么切——用 Db::connect() 而不是改全局配置
想临时连另一个库,别动 .env,直接代码里连。
- 传数组:
Db::connect(['hostname'=>'192.168.1.100', 'database'=>'other_db']) - 传配置名:
Db::connect('mysql2'),前提是已在database.php里定义了connections.mysql2 - 注意:
Db::connect()返回的是新实例,不会影响后续默认连接;如果想全局切换,得用Db::setConfig(),但容易引发并发问题,不推荐
连接池和长连接?ThinkPHP 本身不支持,靠 PDO 和 MySQL 服务端控制
TP 没内置连接池,所谓“长连接”实际取决于 PDO 的 PDO::ATTR_PERSISTENT 设置和 MySQL 的 wait_timeout。
- 开启持久连接需手动加参数:
'params' => [PDO::ATTR_PERSISTENT => true],但要注意:TP 的连接复用逻辑和持久连接有冲突,高并发下可能卡死 - 更稳妥的做法是调低 MySQL 的
wait_timeout(比如设为 60),让闲置连接更快释放,避免堆积 - 本地开发建议关掉持久连接,不然改了表结构有时会缓存旧字段信息,查不到新加的列
.env 权限没生效、MySQL 用户 host 不匹配、以及缓存没清这三处,其他都是次要路径。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











