ThinkPHP6中数据库端口字段名固定为hostport而非port,需在config/database.php对应连接数组内配置'hostport' => 3307(整数),并确保type、hostname、database、username、password等必需项齐全,否则仍走默认3306。

config/database.php 里配 hostport,不是 port
ThinkPHP6 的数据库连接配置中,端口字段名固定为 hostport,不是标准 PDO 的 port 或其他变体。写成 'port' => 3307 会被忽略,连接仍走默认 3306。
在 config/database.php 的对应连接数组里加这一行即可:
'hostport' => 3307,
注意是整数类型,别写成字符串 '3307';常见错误包括:
- 复制粘贴时多出空格或中文标点
- 写在了错误的配置层级(比如写在
connections外层,而非具体某个数据库连接数组内部) - 用的是多环境配置(如
database_dev.php),但当前环境没加载它
.env 文件配 DB_PORT,但必须确认 Config::loadEnv() 已执行
.env 里写 DB_PORT=3307 是有效的,但 ThinkPHP6 不会自动加载 .env —— 必须确保 think\facade\Config::loadEnv() 被调用过。默认情况下,它在 base.php 或入口文件里已执行,但如果自定义了启动流程,可能被跳过。
立即学习“PHP免费学习笔记(深入)”;
验证方式很简单:在控制器里打印 config('database.connections.mysql.hostport'),看是否为 3307。如果还是 null 或 3306,说明 .env 没生效,优先检查加载时机。
Db::connect() 动态连接时,hostport 必须显式传入
动态连接绕过所有全局配置合并逻辑,哪怕只差一个键,就会 fallback 到默认值。下面这段代码看似只改了端口,实际无效:
Db::connect(['hostname' => '127.0.0.1', 'database' => 'test', 'hostport' => 3307]);
因为缺了 type、username、password 等必需项,框架会用默认连接补全,而默认连接里 hostport 是空的,最终仍连 3306。
正确做法是把所有必要参数一次性给全:
'type' => 'mysql''hostname' => '127.0.0.1''database' => 'test''username' => 'root''password' => '''hostport' => 3307
漏掉任意一个,都可能导致端口未生效。
验证端口是否真起作用,别只看配置打印
配置数组里有 hostport,不代表 PDO 连接真的用了它。最可靠的方式是查日志里的 DSN 字符串,或者抓包看 TCP 目标端口。
开启调试日志:在 config/database.php 中设置 'debug' => true,然后执行一次查询,去 runtime/log/ 下找 SQL 日志,搜索 DSN,你会看到类似:
mysql:host=127.0.0.1;port=3307;dbname=test
如果显示的是 port=3306,说明配置没生效;如果报错 Connection refused (111) on 127.0.0.1:3306,那基本可以断定端口根本没换过去。
真正容易被忽略的是:不同数据库默认端口不同(MySQL 是 3306,SQL Server 是 1433,PostgreSQL 是 5432),配错端口类型却用同一套配置模板,是高频翻车点。



















