私はこれを見つけました:
http://www.evolt.org/failover-database-connection-with-php-mysql
および同様の例。しかし、もっと良い方法はありますか?
私はMSSQLNativeClientの自動フェイルオーバークライアントの方針に沿って考えています。
私はこれを見つけました:
http://www.evolt.org/failover-database-connection-with-php-mysql
および同様の例。しかし、もっと良い方法はありますか?
私はMSSQLNativeClientの自動フェイルオーバークライアントの方針に沿って考えています。
システム レベルでフェールオーバー戦略を処理するのが伝統的です。そうすれば、すべてのアプリケーションが堅牢な環境を享受できます。
MySQL フェイルオーバー戦略とMySQL プロキシを参考にしたいと思います。後者は、ロード バランシングとフェイルオーバーを実行できる MySQL ユーティリティについて説明しており、セットアップが非常に簡単に思えます。
質問に対する答えではありませんが、フェイルオーバーを処理するためのより一般的なソリューションです。
PHP でそれを処理するための組み込み機能はありません。コードは自分で書く必要があります。
最善の方法は、データベース アクセスを抽象化し、フェイルオーバー ロジックをカプセル化できるクラスを作成することです。
ここにいくつかのコードがあります。
interface MySQL_Interface {
public function query($sql);
}
class MySQL_Concrete implements MySQL_Interface {
public function __construct($host, $user, $pass, $dbname) {
$this->_mysql = mysql_connect($host, $user, $pass) or throw Exception("Could not connect to server");
mysql_select_db($db, $this->_mysql) or throw Exception("Could not connect to database");
}
public function query($sql) {
return mysql_query($sql) or throw new Exception("Query failed");
}
}
class MySQL_Failover implements MySQL_Interface {
public function __construct(MySQL_Interface $one, MySQL_Interface $two) {
$this->_one = $one;
$this->_two = $two;
}
public function query($sql) {
try {
return $this->_one->query($sql);
} catch (Exception $e) {
return $this->_two->query($sql);
}
}
}
$db = new MySQL_Failover(
new MySQL_Concrete('host1', 'user', 'pass', 'db'),
new MySQL_Concrete('host2', 'user', 'pass', 'db')
);
$db->query('SELECT * FROM Users');
PS: 私はここからかなり離れました。そのままでは使用できません。
PPS: 独自のアドホック ソリューションを作成する代わりに、既存のデータベース抽象化ライブラリ (Zend_Db、MDB2 など) を使用してそれらのインターフェイスを実装する方がよいでしょう。
いいえ、それは組み込まれていません。簡単な方法はMySQL Proxyを使用することだと思います。それ以外の場合は、アプリケーションのロジック( if (fails) { connect to another }
) ですが、パフォーマンスの点ではあまりきれいではありません。
php にはフェイルオーバー メカニズムが組み込まれていません。これには十分な理由があると思われます。このようなフェイルオーバー システムは、オペレーティング システムまたはハードウェア レベルで実装する必要があります。
とにかく、サンプルは安価でシンプルなフェイルオーバーメカニズムを提供します。