CodeIgniter无法将会话保存至数据库及相关报错问题排查
解决CodeIgniter Session数据库驱动报错“Configured database connection is persistent. Aborting.”
问题背景
你在配置CodeIgniter使用数据库存储Session时遇到了以下错误:
Exception: Configured database connection is persistent. Aborting. /var/app/current/system/libraries/Session/drivers/Session_database_driver.php 94
切换到files驱动时功能正常,说明问题出在数据库连接的持久化设置上。
解决方案
CodeIgniter的Session数据库驱动不支持持久化数据库连接——因为持久连接会导致会话数据的隔离性失效,所以驱动会主动终止这种配置。你需要修改数据库连接配置:
- 打开数据库配置文件:
application/config/database.php - 找到你用于Session存储的数据库连接配置项,将持久连接开关设置为
FALSE:// CodeIgniter 早期版本用 pconnect 键 $db['default']['pconnect'] = FALSE; // CodeIgniter 3.x+ 版本改用 persistent 键 $db['default']['persistent'] = FALSE; - 保存配置后重启应用,再测试Session是否能正常写入数据库。
额外验证点
- 确保
config.php中配置的sess_save_path对应的ci_sessions表结构正确:CREATE TABLE IF NOT EXISTS `ci_sessions` ( `id` VARCHAR(128) NOT NULL, `ip_address` VARCHAR(45) NOT NULL, `timestamp` INT(10) UNSIGNED DEFAULT 0 NOT NULL, `data` BLOB NOT NULL, KEY `ci_sessions_timestamp` (`timestamp`) ); - 确认数据库用户对
ci_sessions表拥有读写权限,避免因权限不足导致Session写入失败。
原因说明
Session_database_driver在初始化阶段(对应报错的第94行)会检查当前数据库连接是否为持久化连接,一旦检测到就抛出异常。这是因为持久连接会被多个请求复用,无法保证每个请求的Session数据独立,可能引发数据覆盖、会话混乱等问题,所以CodeIgniter强制禁止这种配置。
内容的提问来源于stack exchange,提问作者PHP User
相关产品推荐
相关产品推荐

