hostport参数必须显式填写整数端口号(如3306、5432),不可为空、不可为字符串,多库及云环境需逐项核对匹配。

hostport 参数必须显式填数字,不能留空或写字符串
ThinkPHP 6+ 的 database.php 配置中,端口字段叫 hostport,不是 port 或 DB_PORT。它必须是整数(如 3306),不能是字符串 '3306',也不能留空 —— 留空会导致 PDO 默认用 3306,但某些云数据库(如阿里云 RDS、腾讯云 CDB)可能使用非标端口(如 3307、5432),此时不填就直接连不上。
常见错误现象:PDOException: SQLSTATE[HY000] [2002] Connection refused,排查时发现 MySQL 服务明明在跑,但 PHP 就是连不上 —— 很大概率是 hostport 没填对,或填成了字符串导致类型转换失败。
-
hostport值必须为整数,例如:3306、5432、1433 - MySQL 默认端口是
3306,但不要依赖“默认”,显式写出更可靠 - PostgreSQL、SQL Server 等其他数据库务必按实际服务端口填写,不能照搬
3306 - 如果用
Db::connect()动态传数组,同样要带'hostport' => 5432,键名不能错
env() 注入时注意类型转换问题
用 .env 文件分离配置时,hostport 从环境变量读取会变成字符串,而 ThinkPHP 内部校验要求它是整数 —— 这会导致连接初始化失败,且错误信息不明确(可能只报 invalid port 或静默 fallback 到 3306)。
正确做法是在 database.php 中用 (int)env('DB_HOSTPORT', 3306) 强制转整型,而不是直接 env('DB_HOSTPORT')。
-
.env里写:DB_HOSTPORT=3307(纯数字,不加引号) -
database.php中写:'hostport' => (int)env('DB_HOSTPORT', 3306) - 如果写成
'hostport' => env('DB_HOSTPORT', '3306'),值就是字符串'3307',PDO 构造时可能被忽略或引发隐式转换异常
多库配置下每个 connections 子项都要单独配 hostport
主从、读写分离或多业务库场景下,connections 数组里每个连接(如 mysql_master、pgsql_backup)都必须独立声明 hostport。不能指望“继承”默认值,框架不会做任何合并或 fallback。
典型翻车点:复制粘贴配置时漏改端口,比如从库地址换了但 hostport 还是 3306,结果查从库时连到了主库端口上(如果主从共用一个 IP 但不同端口),数据一致性直接崩。
- 检查每个连接的
hostname和hostport是否匹配真实部署 - PostgreSQL 连接必须配
5432(或实际端口),不能沿用 MySQL 的3306 - SQL Server 使用
sqlsrv类型时,hostport通常是1433,且type必须写'sqlsrv',写成'mssql'会找不到驱动
SSL 连接时 hostport 不影响证书验证,但必须先连通
启用了 MySQL SSL 后,很多人盯着 params 里的证书路径,却忘了基础连通性 —— 如果 hostport 填错,根本到不了 SSL 握手阶段,日志里只会看到底层连接拒绝,而不是 SSL 相关错误。
调试顺序一定是:先确认 hostport 正确 → 能 ping 通 IP → telnet ip port 能通 → 再查 SSL 参数。否则容易在证书路径、权限、模式上白调半天。
- SSL 场景下,
hostport错误的报错通常是:Connection refused或Operation timed out - 真正的 SSL 错误如
SSL connection error或PDO::__construct(): SSL operation failed,说明已建立 TCP 连接,才进入 SSL 协商环节 - 云厂商控制台显示的“SSL 连接地址”往往包含端口,务必和
hostport对齐
端口看着小,但填错一个数字,整个数据库层就卡死。尤其跨数据库类型或混合部署时,hostport 是最先被忽略、最后才被想起的配置项。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











