Codeigniter 3.1.13中如何解决Too Many Connections错误?
解决CodeIgniter 3.1.13中"Too Many Connections"错误的方案
问题背景
已在数据库配置中设置pconnect = FALSE,也手动调用$this->db->close()关闭连接,但仍出现"Too Many Connections"错误。通过SHOW PROCESSLIST发现,仅加载网站页眉和页脚就会创建大量Sleep状态的MySQL线程。
当前数据库配置:
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'port' => 3306, 'username' => 'root', 'password' => '', 'database' => 'db_name', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8mb4', 'dbcollat' => 'utf8mb4_unicode_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
排查与解决步骤
排查重复初始化连接问题
检查控制器、模型、页眉/页脚视图中是否重复调用$this->load->database()。若已在application/config/autoload.php中自动加载了database库,任何手动调用都会新建连接。公共组件(如页眉、页脚)需复用已有的连接实例,避免重复初始化。优化MySQL闲置连接清理
调整MySQL的wait_timeout和interactive_timeout参数,缩短闲置连接的存活时间,让MySQL自动清理Sleep状态的连接:- 临时生效:执行
SET GLOBAL wait_timeout = 300; SET GLOBAL interactive_timeout = 300;(单位:秒,示例为5分钟) - 永久生效:修改MySQL配置文件(my.cnf/my.ini),添加或修改:
wait_timeout = 300 interactive_timeout = 300
- 临时生效:执行
确认CodeIgniter连接复用逻辑
确保所有数据库配置的pconnect均为FALSE,避免持久连接堆积。若存在多数据库配置,需逐一检查。可在控制器的析构方法中统一关闭连接:public function __destruct() { $this->db->close(); }定位连接泄漏点
- 检查循环逻辑中是否存在重复创建连接的情况(如foreach内加载模型或初始化连接)。
- 开启CodeIgniter日志排查:在
application/config/config.php中设置$config['log_threshold'] = 2;,查看日志中连接创建/关闭的记录,定位重复创建连接的代码位置。
调整MySQL最大连接数(治标方案)
若以上优化后仍无法满足需求,可适当提高MySQL的max_connections参数(默认151),修改配置文件:max_connections = 500注意:此为临时缓解方案,优先解决连接泄漏问题才是根本。
内容的提问来源于stack exchange,提问作者Ainz
相关产品推荐
相关产品推荐

