ci4中database.default.port在.env中无效,因dotenv加载器未将其纳入白名单;须在database.php中显式配置port并设hostname为"127.0.0.1"以启用tcp连接,同时确认mysql实际监听该端口且驱动为mysqli或pdo(后者需将端口写入hostname)。

CodeIgniter 4 中数据库配置的 port 设置无效,通常不是因为写错了字段名,而是底层连接逻辑被绕过或未生效——根本原因在于 CI4 默认不读取 database.default.port 这个配置项。
CI4 的 database 配置不支持 .env 中直接写 port
CI4 的数据库配置机制只识别以下标准字段:hostname、username、password、database、DBDriver、DBPrefix、charset、DBCollat、swapPre、encrypt、compress、strictOn、failover、port —— 等等,看起来有 port?错。这个 port 是 仅在 app/Config/Database.php 中硬编码时才有效,.env 文件里写 database.default.port = 3307 是完全被忽略的。
原因:CI4 的 DotEnv 加载器对数据库配置做了白名单处理,port 不在自动映射字段列表中。你改了 .env,框架压根不读它。
- 验证方法:在
app/Config/Database.php中打印$db['default']['port'],你会发现值仍是默认3306,哪怕 .env 写了 3307 - 正确做法:要么删掉 .env 里的 port 行,要么直接在
Database.php的$db['default']数组里显式加'port' => 3307
hostname = localhost 会强制忽略 port
即使你在 Database.php 里写了 'port' => 3307,只要 hostname 是 "localhost",MySQLi 驱动仍会走 Unix socket(而非 TCP),此时 port 参数直接失效,连接尝试会跳过端口、直连 socket 文件。
- Linux 共享主机常见表现:报错
mysqli::real_connect(): (HY000/2002): No such file or directory - 解决办法:把
hostname改成"127.0.0.1",强制走 TCP 协议,port 才真正起作用 - Windows 或 Docker 环境也建议统一用
127.0.0.1,避免解析歧义
驱动不匹配导致 port 被静默丢弃
如果你用了 DBDriver = "MySQLi"(推荐),port 是支持的;但若误设为 "MySQL"(已废弃)或 "Postgre",部分驱动版本会忽略 port 或抛出不明确错误。
- 检查
database.default.DBDriver值是否为MySQLi或PDO - 用 PDO 时,port 必须写在 hostname 后面,例如:
"127.0.0.1:3307",不能单独配 port 字段 - PHP 的 mysqli 扩展必须启用,且版本兼容:PHP 7.4+ 更稳妥,旧版可能无法识别非标端口
MySQL 服务本身没监听非标端口
配置端口生效的前提是 MySQL 实际在监听那个端口。共享主机(如 Namecheap)通常禁止用户修改 MySQL 端口,所有数据库连接都强制走 3306(或服务商指定端口,如 3307),且不允许外部绑定其他端口。
- 执行
mysql -h 127.0.0.1 -P 3307 -u user -p测试能否手动连上 - cPanel 的「Remote MySQL」或「MySQL Databases」页面一般不提供端口修改入口
- 如果测试失败,说明服务器根本不开放该端口,再怎么配 CI4 都没用











