如何在Codeigniter数据库配置中添加双数据库连接(本地/服务器)
在Codeigniter中配置双数据库连接实现故障安全机制
嘿,这事儿其实挺简单的,我给你拆解成两步:先配置好两个数据库连接,再实现故障自动切换的逻辑,两种方式任你选~
第一步:配置两个数据库连接
直接在你的application/config/database.php文件里,在现有$db['default']的基础上,新增一个远程服务器的配置数组,比如叫$db['remote']。同时可以利用CI自带的failover参数实现自动故障转移,或者后续手动切换。
示例配置代码
$active_group = 'default'; $query_builder = TRUE; // 本地数据库连接配置 $db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'projectbox_db', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, // 这里把远程连接作为故障转移选项 'failover' => array( array( 'hostname' => '你的远程服务器IP/域名', 'username' => '远程数据库用户名', 'password' => '远程数据库密码', 'database' => 'projectbox_db', // 假设远程库名和本地一致 'dbdriver' => 'mysqli', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', // 其他必要参数可以照搬default的设置 ) ), 'save_queries' => TRUE ); // 单独的远程数据库连接配置(如果需要手动切换的话) $db['remote'] = array( 'dsn' => '', 'hostname' => '你的远程服务器IP/域名', 'username' => '远程数据库用户名', 'password' => '远程数据库密码', 'database' => 'projectbox_db', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => TRUE, 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8', 'dbcollat' => 'utf8_general_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
第二步:实现故障安全机制
有两种常用的方式,你可以根据需求选:
方式一:利用CI自带的自动故障转移
上面的配置里已经给default的failover数组加了远程连接的信息,当CI尝试连接本地数据库失败时,会自动依次尝试failover里的连接,完全不用你手动写切换逻辑,非常省心。
不过要注意:这种自动转移是连接层面的,只有当本地数据库完全连不上的时候才会触发,如果你需要更细粒度的控制(比如某些查询失败才切换),那可以用第二种方式。
方式二:手动切换连接(更灵活)
如果你想自己控制切换时机,比如本地查询报错后再切到远程,可以在模型或者控制器里这么写:
// 先尝试使用默认的本地连接 $this->load->database(); try { // 执行一个测试查询,检查连接是否正常 $this->db->query('SELECT 1'); } catch (Exception $e) { // 本地连接失败,切换到远程连接 $this->db = $this->load->database('remote', TRUE); // 可以加个日志记录故障情况 log_message('error', '本地数据库连接失败,已切换到远程服务器:' . $e->getMessage()); } // 之后的数据库操作就会使用可用的连接了 $query = $this->db->get('your_table');
一些注意事项
- 确保远程服务器的数据库允许你的服务器IP访问(防火墙、数据库权限都要设置好)
- 两个数据库的数据最好保持同步,不然故障切换后可能会出现数据不一致的情况
- 如果用自动故障转移,记得把
db_debug设置为TRUE方便排查问题,生产环境可以根据情况调整
内容的提问来源于stack exchange,提问作者mountainsage
相关产品推荐
相关产品推荐

