ThinkPHP5.1中数据库端口须通过独立的hostport配置项设置,不可写在hostname中或用冒号拼接;其值为字符串类型,如'3307',动态连接时同样适用,Unix socket连接下该参数被忽略。

ThinkPHP5.1 中数据库端口参数通过 hostport 配置项设置,不是写在 hostname 里,也不能用冒号拼接地址。
H3 数据库配置文件中设置 hostport
在应用配置目录 config/database.php 中,直接添加或修改 'hostport' 键即可:
- 默认值为空字符串(即使用数据库驱动默认端口,如 MySQL 是 3306)
- 若 MySQL 服务运行在非标准端口(比如 3307),需显式指定:
return [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'hostport' => '3307', // ✅ 正确方式:独立配置项
'database' => 'thinkphp',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'prefix' => '',
];
H3 不要写成 hostname 拼接形式
以下写法是无效的,TP5.1 不会解析:
- ❌
'hostname' => '127.0.0.1:3307' - ❌
'hostname' => 'localhost:3307'
框架底层使用 PDO 连接时,hostname 和 hostport 是分开传入 DSN 的,硬拼会导致连接失败或端口被忽略。
H3 动态连接时同样支持 hostport
如果用数组方式动态连接(例如多库切换或测试环境),hostport 仍作为独立键传入:
Db::connect([
'type' => 'mysql',
'hostname' => '192.168.1.100',
'hostport' => '3308',
'database' => 'test_db',
'username' => 'dev',
'password' => 'xxx',
]);
H3 注意事项
-
hostport值应为字符串类型(如'3306'),不是整数,避免某些环境下类型转换异常 - 若配置了
hostport但连接失败,先确认目标端口是否真实开放、防火墙是否放行、MySQL 是否监听该端口(netstat -an | grep 3307) - 使用 Unix socket 连接时(如
'hostname' => '/var/run/mysqld/mysqld.sock'),hostport会被忽略,无需设置
不复杂但容易忽略
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











