6

マスター データベースを使用してリード レプリカ (つまり、スレーブ) データベースをバックアップしたいのですが、失敗したこの単純なブール値:

$config['hostname'] = "myReadReplicaDatabase.com";
//...$config['other_stuff']; other config stuff...
$db_obj=$CI->load->database($config, TRUE);

if(!$db_obj){
     $config['hostname'] = "myMasterDatabase.com";
     $db_obj=$CI->load->database($config, TRUE);
}

リードレプリカデータベースを終了した後、ブール値が評価されFALSE、スクリプトがマスターデータベースを使用することを期待していました。残念ながら、代わりに次の PHP エラーが発生しました。

Unable to connect to your database server using the provided settings.
Filename: core/Loader.php

私が望むのは、接続がtrueまたはfalseを返すことだけです.Codeigniterでこれを行う方法を知っている人はいますか?

4

8 に答える 8

12

私の質問は、Codeigniter フォーラムのこのスレッドで回答されました。

重要なのは、データベースを自動初期化しないことです。

$db['xxx']['autoinit'] = FALSE; 

エラーを抑制するには、これを設定できます

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

次に、db の状態をチェックするコードで、initialize() 関数の TRUE/FALSE をチェックします。

$db_obj = $this->database->load('xxx',TRUE);
  $connected = $db_obj->initialize();
  if (!$connected) {
  $db_obj = $this->database->load('yyy',TRUE);
} 

将来の参考のために、私の構成ファイル全体を次に示します: https://gist.github.com/3749863

于 2012-09-20T17:42:48.563 に答える
3

データベースに接続すると、成功した場合は接続 ID を持つ接続オブジェクトが返され、それ以外の場合は false が返されます。

データベース接続が完了しているかどうかを確認するためにチェックできます。

$db_obj=$CI->load->database($config, TRUE);
if($db_obj->conn_id) {
    //do something
} else {
    echo 'Unable to connect with database with given db details.';
}

これを試して、他に問題がある場合はお知らせください。

于 2013-11-28T13:15:58.473 に答える
3

ここで言われたことに基づいて: プライマリがダウンしている場合、Codeigniter はセカンダリ データベースに切り替えます

で確認できますconn_id$db_obj

if ($db_obj->conn_id === false) {
    $config['db_debug'] = true;
    $config['hostname'] = "myMasterDatabase.com";
    $db_obj=$CI->load->database($config, TRUE);
}

これはうまくいくはずです。

于 2012-09-19T15:44:36.513 に答える
2
try { 

// do database connection

} catch (Exception $e) {
  // DO whatever you want with the $e data, it has a default __toString() so just echo $e if you want errors or default it to connect another db, etc.
  echo $e->getMessage();

// Connect to secondary DB.
}

私に反対票を投じた人のために、あなたはこれを行うことができます。例外はPDOExceptionをキャッチします。

try {

    $pdo = new PDO($dsn, $username, $password);

} catch(PDOException $e) {

    mail('webmaster@example.com', 'Database error message', $e->getMessage());

    // and finally... attempt your second DB connection.

   exit;

}
于 2012-09-18T19:57:11.820 に答える
2

私が見つけたすべてをテストし、ワークロードは何もテストしませんでした。私が見つけた唯一の方法は、データベースが存在するかどうかを dbutil でチェックすることでした。次のようなものです。

$this->load->database();
$this->load->dbutil();

// check connection details
if( !$this->dbutil->database_exists('myDatabase'))
    echo 'Not connected to a database, or database not exists';
于 2017-02-21T20:11:01.470 に答える
1
$readReplica = @$CI->load->database($config, TRUE); // ommit the error
if ($readReplica->call_function('error') !== 0) {
    // Failed to connect
}

エラーコードについてはわかりません(int/stringかどうかはわかりません)、これをテストするためのCIが近くにありませんが、この原則は機能するはずです

于 2012-09-18T19:58:01.187 に答える