ThinkPHP连接非默认MySQL端口需在database.php中设'port'=>3307,或.env配DB_PORT=3307并引用,或Db::connect()动态传port,主从架构用host:port格式,最后通过debug日志验证DSN含port=3307。

如果您在ThinkPHP项目中需要连接非默认端口的MySQL数据库,但应用始终尝试连接3306端口,则很可能是数据库端口配置未被正确识别或加载。以下是设置数据库端口并确保其安全生效的具体步骤:
一、在database.php配置文件中显式指定port
该方法适用于大多数标准部署场景,通过直接修改应用级数据库配置文件来覆盖默认端口值。ThinkPHP在解析配置时会优先采用此字段,且要求为整数类型而非字符串。
1、打开项目配置文件 config/database.php(ThinkPHP 6/8)或 application/database.php(ThinkPHP 5.x)。
2、定位到数据库连接配置数组,例如 'mysql' 或 'default' 分组。
立即学习“PHP免费学习笔记(深入)”;
3、在该数组中添加键值对:'port' => 3307(请将3307替换为您实际使用的端口号)。
4、确认该配置项未被其他配置文件(如多环境配置中的mysql2组)覆盖,且未与DB_DSN同时存在(若使用DB_DSN则port将被忽略)。
二、通过.env环境变量注入DB_PORT
该方式可实现配置与代码分离,避免敏感端口信息硬编码,同时支持不同环境差异化部署。需确保框架已启用.env加载机制且未被后续配置覆盖。
1、在项目根目录下的 .env 文件中添加一行:DB_PORT=3307。
2、确认项目入口文件(如public/index.php)或基础引导文件(如base.php)中已执行 think\facade\Config::loadEnv() 或等效加载逻辑。
3、在config/database.php对应连接配置中,必须显式引用该变量,例如:'port' => (int) getenv('DB_PORT') ?: 3306。
4、检查Web服务器是否禁止直接访问.env文件(如Nginx中配置 location ~ /\.env { deny all; })。
三、使用Db::connect()动态连接时传入port参数
该方法适用于运行时按需切换数据库实例的场景,绕过全局配置合并流程,所有连接参数必须完整提供,缺失port将回退至PDO默认3306。
1、在控制器或服务类中调用 Db::connect() 方法。
2、传入完整配置数组,其中必须包含 'port' => 3307 字段。
3、其他必要字段如 'hostname'、'database'、'username'、'password'、'type' 均不可省略,即使与默认配置一致。
4、验证连接时可通过 Db::getPdo()->getAttribute(PDO::ATTR_CONNECTION_STATUS) 检查实际连接端口是否生效。
四、主从架构下为各节点单独指定端口
当启用数据库读写分离时,host列表中每个服务器可对应独立端口,需通过host:port格式声明,并配合DB_DEPLOY_TYPE和DB_RW_SEPARATE启用分布式模式。
1、在配置中设置 'DB_HOST' => '192.168.1.10:3307,192.168.1.11:3308'(多个地址以英文逗号分隔)。
2、启用分布式部署:'DB_DEPLOY_TYPE' => 1。
3、启用读写分离:'DB_RW_SEPARATE' => true。
4、确保底层PDO DSN拼接逻辑能正确解析host:port格式,避免因解析失败导致端口被丢弃。
五、验证端口配置是否真实生效
仅修改配置不等于连接成功,必须通过底层PDO连接日志或DSN字符串确认端口已被写入实际连接参数,防止因配置加载顺序错误或类型转换失败导致静默回退。
1、临时开启数据库调试模式:'debug' => true(config/database.php中)。
2、执行任意查询后,在日志中搜索 PDO DSN 字样,确认输出中包含类似 port=3307 的片段。
3、若未出现目标端口,检查是否存在重复定义(如同时存在port和hostport)、类型错误(字符串3307未转为整数)、或配置被更高优先级来源(如DB_DSN)覆盖。
4、在生产环境关闭debug后,可通过捕获 PDOException 的getMessage()内容判断连接目标端口是否响应拒绝(Connection refused on port XXXX)。



















