1

Mysql-nd マニュアルのこの部分では、スレーブ MySQL サーバーへの接続が失われたときに推奨されるフェイルオーバー方法を実装する方法について説明します

私はそれを PhalconPHP に実装したいと思っています。Phalcon と Mysql-nd を使用するいくつかの重要なプロジェクトがあるので、適切な場所でそれを行うことが非常に重要です。

いくつかのドキュメントを見つけようとしていますが、開始する例さえ見つかりません。Phalcon Documentation hereおよびhereを調べて EventManager アプローチを見つけようとしていましたが、透過的に行う方法が見つかりません。

最も魅力的な方法は、イベント マネージャーを使用してエラー イベントをキャプチャし、接続エラーが発生した場合に再度クエリを実行することです。

1 アップデート

私が見つけたいくつかの Phalcon ソースを読んだ後、標準的な方法で同じクエリを 2 回実行する方法がない可能性があることがわかりましEventManagerdb。私が見つけた 1 つの可能な試みは、実際にdb:afterConnectionイベントの後に任意のクエリを実行することですが、それは解決策ではありません。

2 更新

db:afterConnectionはほとんど到達できませんが、代わりにすべてを収集することができますdb:beforeQuery。問題は、PDO が で Phalcon によって実行されているため、スレーブへの接続が切断されたときにイベントPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONに到達できないことです。db:afterConnectionを介して PDO インスタンスを取得し、db:beforeQueryこの属性を変更することは可能EventManagerですが、同じクエリを 2 回目に送信できたとしても、適切な場所に返す方法が見つからないため、何も返されません (クエリ結果をオーバーライドできません)。取得されdb:afterQueryステートメントはイベント送信の一部ではなく、Eventmanager の結果はまったく使用されていないためです

    if typeof statement == "object" {
        if typeof eventsManager == "object" {
            eventsManager->fire("db:afterQuery", this, bindParams);
        }
        return new ResultPdo(this, statement, sqlStatement, bindParams, bindTypes);
    }
4

1 に答える 1