codeigniter本身无直接超时配置项,需协同php扩展(如pdo::attr_timeout)和mysql服务端(connect_timeout、wait_timeout等)三层设置;hostname建议用127.0.0.1替代localhost以规避socket路径问题,并确保mysqli/pdo_mysql扩展启用且认证协议兼容。

CodeIgniter 本身不直接提供数据库连接“超时时间”的配置项(比如连接建立等待多久失败),它依赖底层 PHP 数据库扩展(如 mysqli 或 PDO)和 MySQL 服务端参数共同控制超时行为。真正起作用的是三层协同:应用层(CI 配置与代码)、PHP 扩展层、MySQL 服务层。设置不当容易导致请求卡死、线程堆积甚至雪崩。
CodeIgniter 应用层可干预的超时点
虽然 database.php 没有 connect_timeout 字段,但你可以通过以下方式施加影响:
-
启用并配置
db_debug:设为TRUE可快速暴露连接失败原因(如超时提示),便于定位是网络、认证还是等待问题; -
显式控制连接生命周期:避免长事务或未关闭的查询,尤其在循环或异步任务中调用
$this->db->close(); -
使用 PDO 时传入超时选项:若你手动初始化 PDO(绕过 CI 默认加载),可在 DSN 后添加
;timeout=5,或在选项数组中加PDO::ATTR_TIMEOUT => 5(单位秒); -
避免
pconnect = TRUE在高并发场景:持久连接不释放,可能加剧连接池耗尽风险,建议设为FALSE。
MySQL 服务端关键超时参数
这些必须在 MySQL 配置文件(my.cnf 或 my.ini)的 [mysqld] 区块中设置,并重启服务(或用 SET GLOBAL 动态生效):
-
connect_timeout = 10:服务器接受连接握手的最长时间,防恶意慢连接,默认 10 秒,一般无需调大; -
wait_timeout = 600和interactive_timeout = 600:空闲连接自动断开时间,建议统一设为 600(10 分钟),防止大量僵尸连接占满max_connections; -
net_read_timeout = 30、net_write_timeout = 60:已建立连接后读/写数据的超时,适用于大结果集或慢网络,Web 应用常见值为 30/60 秒。
验证是否生效:登录 MySQL 执行 SHOW VARIABLES LIKE '%timeout%';。
PHP 层与环境适配要点
很多“连不上”其实卡在 PHP 到 MySQL 的链路,而非 CI 配置本身:
-
hostname 别用
localhost:Linux 下会走 Unix socket,易因路径错误失败;改用127.0.0.1强制 TCP,兼容性更好; -
确认 PHP 扩展已启用:检查
phpinfo()中是否有mysqli或pdo_mysql,且版本支持你的 MySQL(例如 MySQL 8.0+ 的caching_sha2_password认证需 PHP 7.4+ 或降级认证方式); - 注意宝塔等面板的 php.ini 路径:修改后需重启 PHP 服务,且确保 CI 加载的是你编辑的那个配置文件。
连接池与雪崩防护(进阶)
CodeIgniter 自带连接管理较轻量,不内置连接池。如果你用 Nginx + PHP-FPM 架构,实际“连接池”由 PHP-FPM 进程数 + MySQL max_connections 共同构成。防雪崩关键在于:
- 限制 PHP-FPM 最大子进程数,避免瞬间打爆 MySQL 连接上限;
- 在反向代理(如 Nginx)设置
proxy_read_timeout和proxy_connect_timeout,早于后端超时中断请求; - 业务层加入熔断逻辑(如用第三方库
thephpleague/circuit-breaker),下游数据库响应变慢时主动降级。











