修改数据库端口只需在配置中显式指定hostport(动态连接)或port(配置文件),确保配置加载正确且未被覆盖,验证以pdo dsn日志为准。

数据库配置文件里改 port 就行,别去改驱动类或连接字符串
ThinkPHP 默认用的是 MySQL,端口写死在配置里,不是靠环境变量或自动探测。你只要在数据库配置项中显式指定 port,框架就会用这个值,不会 fallback 到 3306 —— 前提是配置加载顺序没被覆盖。
常见错误是只改了 .env 但没启用 .env 加载,或者在多环境配置中写在了错误的分组下(比如写了 database.php 的 default 组,但实际用的是 mysql2 组)。
-
config/database.php中,在对应连接配置数组里加'port' => 3307(注意是整数,不是字符串) - 如果用
.env,写成DB_PORT=3307,并确认think\facade\Config::loadEnv()已执行(通常在base.php或入口已做) - 使用
Db::connect()动态连接时,port必须作为配置数组传入,不能靠全局配置覆盖
Db::connect() 动态连接时必须带 port 参数
动态连接绕过了全局配置合并逻辑,所有键都得手动给全。哪怕其他参数和默认一致,port 缺失就走默认 3306 —— 这是底层 PDO DSN 拼接决定的,不是 ThinkPHP 特意设计。
示例:
Db::connect([
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'test',
'username' => 'root',
'password' => '',
'hostport' => 3307, // 注意:这里是 hostport,不是 port
'charset' => 'utf8mb4'
]);
关键点:hostport 是 ThinkPHP 的配置键名,不是标准 PDO 的 port;它最终会被拼进 DSN:mysql:host=127.0.0.1;port=3307;dbname=test。
验证端口是否生效:看 PDO DSN 日志,别只信配置打印
配置数组里看到 port 或 hostport 出现,不代表连接真用了它。最可靠的方式是开启 PDO 调试日志,或者抓包看 TCP 连接目标端口。
- 在
config/database.php中开启'debug' => true,然后查日志里 DSN 字符串 - 错误提示如
Connection refused (111)且明确指向127.0.0.1:3306,说明端口没生效,大概率是配置位置错了或被覆盖 - MySQL 服务监听多个端口时,用
netstat -tuln | grep :3307确认服务确实在监听
多数据库配置下,port 容易被“继承”错
ThinkPHP 允许定义多个数据库连接(比如 mysql_read 和 mysql_write),它们常共用一个基础配置数组。如果在基础数组里写了 port,但某个子配置没重写,就会沿用;反之,如果基础没写而子配置写了,又容易漏掉某些连接。
建议做法:
- 每个独立连接配置都显式声明
hostport,不依赖继承 - 避免用
array_merge()手动合并配置,ThinkPHP 的配置合并机制对数字键和嵌套处理有坑 - 调试时用
Config::get('database.connections.mysql_write')直接取最终合并后的数组,确认hostport值存在且正确
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











