codeigniter数据库连接超时主因是底层配置、网络或服务状态不匹配,包括服务未运行、连接参数错误、php超时设置过短、mysql连接数满、ssl/字符集协商延迟等。

CodeIgniter 提示数据库连接超时,通常不是框架本身的问题,而是底层数据库连接配置、网络环境或服务状态不匹配导致的。核心原因集中在连接建立阶段(比如 mysqli_connect() 或 PDO 初始化)耗时过长,超过了 PHP 或 CodeIgniter 设定的等待阈值。
数据库服务未运行或不可达
这是最常见的情况。CodeIgniter 尝试连接时,目标 MySQL/MariaDB 服务没启动、监听地址不对、端口被防火墙拦截,或 DNS 解析失败,都会让 PHP 卡在连接环节,直到超时(默认通常是 30 秒)。
- 用命令行快速验证:
mysql -h your_host -u your_user -p -P your_port,看能否连上 - 检查
application/config/database.php中的hostname、port、username、password是否与实际一致(注意localhost和127.0.0.1在 Unix 套接字行为上可能不同) - 若用 Docker 或远程服务器,确认容器/实例已暴露端口、安全组放行、且服务确实在监听(如
netstat -tuln | grep :3306)
PHP 连接超时参数设置过短
CodeIgniter 本身不直接控制底层 socket 超时,它依赖 PHP 的 MySQLi 或 PDO 驱动行为。如果服务器响应慢(例如高负载、DNS 慢、跨公网连接),默认超时容易触发。
- 在
database.php的数据库配置中,可尝试添加'connect_timeout' => 10(仅对 MySQLi 有效) - 更彻底的方式:在
php.ini中调大default_socket_timeout = 30(单位秒) - 若用 PDO,可在 DSN 后追加
;connect_timeout=10,例如:mysql:host=localhost;port=3306;dbname=test;connect_timeout=10
连接池或最大连接数已满
MySQL 有 max_connections 限制。当大量请求堆积、连接未正确关闭(如忘记 $this->db->close() 或脚本异常终止),可能导致新连接排队甚至超时。
- 登录 MySQL 执行:
SHOW STATUS LIKE 'Threads_connected';和SHOW VARIABLES LIKE 'max_connections'; - 检查应用是否存在长连接泄漏:是否在循环中反复
$this->load->database()却未复用或释放 - CodeIgniter 默认使用持久连接(
'pconnect' => TRUE)时更需谨慎——它会复用连接,但若后端连接异常中断,框架未必自动重连
SSL 或字符集协商引发延迟
某些 MySQL 配置(如强制 SSL、复杂认证插件如 caching_sha2_password)或客户端字符集不匹配,会在握手阶段增加耗时,尤其在低性能环境或旧版 PHP/MySQL 组合下容易超时。
- 临时排除 SSL 干扰:在数据库配置中加
'encrypt' => FALSE(适用于 MySQLi) - 指定兼容认证方式:在 MySQL 中为用户执行
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pass'; - 统一字符集:确保
charset和dbcollat与数据库实际一致(如utf8mb4),避免连接后自动转换开销











