5

私はこれを見つけました:

http://www.evolt.org/failover-database-connection-with-php-mysql

および同様の例。しかし、もっと良い方法はありますか?

私はMSSQLNativeClientの自動フェイルオーバークライアントの方針に沿って考えています。

4

4 に答える 4

8

システム レベルでフェールオーバー戦略を処理するのが伝統的です。そうすれば、すべてのアプリケーションが堅牢な環境を享受できます。

MySQL フェイルオーバー戦略MySQL プロキシを参考にしたいと思います。後者は、ロード バランシングとフェイルオーバーを実行できる MySQL ユーティリティについて説明しており、セットアップが非常に簡単に思えます。

質問に対する答えではありませんが、フェイルオーバーを処理するためのより一般的なソリューションです。

于 2008-10-10T14:29:39.647 に答える
3

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 など) を使用してそれらのインターフェイスを実装する方がよいでしょう。

于 2008-10-10T15:21:13.537 に答える
2

いいえ、それは組み込まれていません。簡単な方法はMySQL Proxyを使用することだと思います。それ以外の場合は、アプリケーションのロジック( if (fails) { connect to another }) ですが、パフォーマンスの点ではあまりきれいではありません。

于 2008-10-10T14:28:37.013 に答える
2

php にはフェイルオーバー メカニズムが組み込まれていません。これには十分な理由があると思われます。このようなフェイルオーバー システムは、オペレーティング システムまたはハードウェア レベルで実装する必要があります。

とにかく、サンプルは安価でシンプルなフェイルオーバーメカニズムを提供します。

于 2008-10-10T14:31:53.747 に答える