【问题标题】:Codeigniter switch to secondary database if primary is down如果主数据库关闭,Codeigniter 切换到辅助数据库
【发布时间】:2011-10-17 03:18:00
【问题描述】:

我想知道是否有办法处理 mysql 错误并配置 ci 以在主服务器关闭(无法连接)的情况下切换到辅助数据库服务器?

【问题讨论】:

标签: php mysql codeigniter


【解决方案1】:

好吧,我不知道这是否会起作用,但你实际上可以试试这个:

1) 创建 2 组数据库设置(在 application/config/database.php 中):

// regular one..
$db['default']['hostname'] = 'localhost';
$db['default']['username'] = 'root';
//...

// second connection
$db['second']['hostname'] = 'localhost';
$db['second']['username'] = 'root';
//...

2) 关闭 deubg 以避免显示 db 错误并实际杀死你的脚本(对两者都这样做):

$db['default']['db_debug'] = FALSE;

3) 你可以在加载库的时候给第二个参数传一个TRUE,这样它实际上有一个返回值;它返回数据库对象本身:

$dbobject1 = $this->load->database('default',TRUE);
$dbobject2 = $this->load->database('second',TRUE);

现在,您只需检查“连接 ID”资源即可查看是否已建立连接:

if(FALSE === $dbobject1->conn_id)
{
  echo 'No connection established!';
}

现在您可以决定加载另一个数据库,以防第一个数据库无法加载。不利的一面是,您实际上不知道为什么 db 连接不起作用...

至于如何实现这一点,您可能想尝试扩展数据库类,或者更好的是,创建您自己的库,该库实际上只是检查连接是否存在,然后加载它而不是数据库库。因为它返回一个数据库对象(除了所有 2 个连接都失败时),然后您可以像在普通数据库类上一样处理它:

class Check_db {

     private $CI = '';
     public $DB1 = '';
     public $DB2 = '';

     function __construct()
     {
        $this->CI =&get_instance();
        $this->DB1 = $this->CI->load->database('default',TRUE);
        if(FALSE !== $this->DB1->conn_id)
        {
          return $this->DB1;
        }
        else
        {
          $this->DB2 = $this->CI->load->database('second',TRUE);
          if(FALSE !== $this->DB2->conn_id)
          {
            return $this->DB2;
          }
          else
          {
            return FALSE;
          }
        }
      }

【讨论】:

  • 这太棒了,我正在寻找什么......我要试试......干杯伙伴!
猜你喜欢
  • 2013-09-02
  • 2018-05-04
  • 2015-07-19
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多