codeigniter 4 配置 port=3307 仍连 3306,主因是 host=‘localhost’触发 unix socket 连接(忽略 port),应改 host=‘127.0.0.1’强制 tcp;同时需确认 .env 未覆盖配置、mysql 确实监听 3307 且缓存已清除。

CodeIgniter 4 连接 MySQL 时配置了 port => 3307 却仍连上默认的 3306 端口,通常不是配置没生效,而是配置未被正确读取或被其他机制覆盖。关键原因和排查方向如下:
确认数据库配置是否真正写在生效位置
CI4 的数据库配置位于 app/Config/Database.php 中的 $default 组(或你自定义的组)。需检查:
- 是否修改的是正确的环境配置文件(如
.env或Database.php)——.env 优先级高于 Database.php,若 .env 中有database.default.port=3306,它会覆盖 PHP 文件里的设置; - 是否在
Database.php的$default数组中明确写了'port' => 3307,且没有拼写错误(比如写成PORT或Port); - 是否清除了 Config 缓存:运行
php spark cache:clear或手动删除writable/cache/下的 config 相关缓存文件。
检查 MySQL 客户端连接行为
CI4 底层使用 PDO 或 MySQLi,默认情况下,如果 host 是 localhost,MySQL 客户端会**自动走 Unix socket 而非 TCP/IP**,此时 port 参数会被忽略(socket 连接不经过端口)。解决方法:
- 把
'host' => 'localhost'改为'host' => '127.0.0.1'—— 强制走 TCP 连接,port 才生效; - 或保留
localhost,但显式指定 socket 路径(不推荐,除非你真有自定义 socket); - 验证方式:在终端执行
mysql -h 127.0.0.1 -P 3307 -u youruser -p,看能否连上,确认 MySQL 实例确实在 3307 监听。
确认 MySQL 服务确实在监听 3307
仅改应用配置不够,数据库服务本身必须运行在 3307 端口:
- Linux/macOS:运行
sudo lsof -i :3307或netstat -tuln | grep 3307; - Windows:用
netstat -ano | findstr :3307; - 检查 MySQL 配置文件(如
my.cnf或mysqld.cnf)中是否有port = 3307,且服务已重启; - 注意 Docker 场景(如 Laradock):确认
mysql容器的ports映射是否包含"3307:3306"(即宿主机 3307 → 容器内 3306),此时应用应连host: 127.0.0.1、port: 3307,而容器内 MySQL 本身仍是 3306。
调试连接实际使用的参数
在 CI4 中临时加一行日志,确认运行时真实使用的配置:
var_dump(\Config\Database::connect()->getPlatform()->getConnection()->getAttribute(\PDO::ATTR_CONNECTION_STATUS));
或更直接地,在 Database.php 的 $default 数组里加个 die(print_r($this->default, true));(仅测试),看输出中 port 是否为 3307。











