Mysql-nd マニュアルのこの部分では、スレーブ MySQL サーバーへの接続が失われたときに推奨されるフェイルオーバー方法を実装する方法について説明します。
私はそれを PhalconPHP に実装したいと思っています。Phalcon と Mysql-nd を使用するいくつかの重要なプロジェクトがあるので、適切な場所でそれを行うことが非常に重要です。
いくつかのドキュメントを見つけようとしていますが、開始する例さえ見つかりません。Phalcon Documentation hereおよびhereを調べて EventManager アプローチを見つけようとしていましたが、透過的に行う方法が見つかりません。
最も魅力的な方法は、イベント マネージャーを使用してエラー イベントをキャプチャし、接続エラーが発生した場合に再度クエリを実行することです。
1 アップデート
私が見つけたいくつかの Phalcon ソースを読んだ後、標準的な方法で同じクエリを 2 回実行する方法がない可能性があることがわかりましEventManager
たdb
。私が見つけた 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);
}