読み取りレプリカ(つまり、スレーブ)データベースをマスターデータベースでバックアップしたいのですが、この単純なブール値は失敗しました:
$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でこれを行う方法を知っていますか?
私の質問は Codeigniterフォーラムのこのスレッド で回答されました。
重要なのは、データベースをnot自動初期化することです。
$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/374986 。
ここで言われたことに基づいて: プライマリがダウンしている場合、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);
}
これはうまくいくはずです。
データベースに接続すると、成功した状態で接続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.';
}
他に問題がある場合は、これを試して、私に知らせてください。
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('[email protected]', 'Database error message', $e->getMessage());
// and finally... attempt your second DB connection.
exit;
}
見つけたものをすべてテストしましたが、何も機能しません。データベースが存在するかどうかを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';
$readReplica = @$CI->load->database($config, TRUE); // ommit the error
if ($readReplica->call_function('error') !== 0) {
// Failed to connect
}
エラーコードについてはよくわかりません(int/stringかどうかはわかりません)。これをテストするためのCIが近くにありませんが、この原則は機能するはずです。
$this->load->database();
print_r($this->db);