4

私は現在、潜在的に低帯域幅の環境で一定の AJAX リクエストの必要性を減らす/削除するために、WebSocket を試しています。すべてのデバイスは WebSocket に準拠しているため、問題はありません。node.js やその他のフレームワーク / ライブラリを使用せずに、ネイティブ PHP WebSocket に維持しようとしています (これまでのところ問題ありません)。

私がやろうとしているのは、別のクライアントによるデータベースへの更新について、接続されたクライアントに通知する方法を決定することです。問題のユースケースは、デバイスのボタンを押す人であり、そのボタンが押されたことをその人のマネージャーに警告します。したがって、私が持っている2つのオプションは次のとおりです。

1. データベース クエリのループ (PHP)

私が最初に考えたのは、「アラート フィールドが変更されましたか? その場合はマネージャーに通知する」という効果的なクエリを WebSocket サーバーに挿入することでした。これは(私が考えることができる)最も簡単で賢明なアプローチですが、毎秒クエリを実行しているサーバーの負荷を軽減するように設計された PHP スクリプトを使用するのは無駄に思えますが、少なくともこれにより、データベースの更新が検出されると、更新が送信されます。

2. クライアントからの通知の送信

私が考えていたもう 1 つの考えは、クライアントがデータベースを更新するときに、実際には WebSocket 通知を自分で送信できるということでした。これには、集中的でループするクエリを減らすという利点がありますが、次のようなデータを変更するたびに、WebSocket メッセージを送信する必要があることも意味します。

$.post("AttemptDatabaseUpdate.php", {Data}).function(Result) // Don't worry about the semantics of this, it's not actual code
{
    if(Result == "Successful")
    {
        SendWebSocketNotification(OtherData);
    }
}

おそらくこれが最も効率的であるため、これが最良のオプションですが、データベースの更新と WebSocket 通知の送信の間に接続が切断される可能性があり、PHP ファイルでフォールバック チェックが必要になる可能性があるのではないかと心配しています。 、より長い間隔ではありますが(30秒ごとに言ってください)、最初のソリューションのものとよく似ています。

3.MySQL トリガー?

これは単なる推測ですが、おそらく別のオプションは、server.php ファイルに直接通知できる MySQL トリガーを作成することですか? これがどのように機能するかはわかりませんが、これが解決策 1 と同じまたは類似のクエリ要件になる可能性があると推測する危険がありますが、それはただのことです...

よろしくお願いします:)

編集: 解決策の可能性 4

実際、別の考えが頭に浮かびました。データベースの更新に使用される PHP ファイルには、実際には WebSocket メッセージが組み込まれている可能性があります。PHPファイルがデータベースを更新すると、WebSocketサーバーはPHP経由で通知されますが、これは可能ですか?

4

2 に答える 2

1

WebSocket を使用する場合は、クライアントからの通知を使用する必要があります。これは、彼らの主な使用例の 1 つです。

接続の切断や途中での変更による不一致が心配な場合は、HTTP ETagsに似たシステムを実装できます。このシステムでは、更新中に競合が発生した場合にサーバー側で応答できるハッシュ コードをクライアントが送信します。


更新: 最初の問題が少し間違っていたと思います。あなたのユースケースを正しく理解していれば、クライアントからデータベースの更新を送信しており、その後、接続されているすべてのクライアントを更新する必要があります。その場合、サーバーは DB の更新が完了した後に更新メッセージを送信する必要があると思うので、解決策 4 に同意します。ここでは、Websocket サーバーが PHP を実行し、DB の更新を行うサーバーと同じであると想定しています。

ただし、ユースケースによっては、クライアントは次のリクエストで「世界観」を識別するハッシュ値を送信する必要があるため、接続が切断された場合に同じ更新を複数回行うことはありません。


更新 2: したがって、別のスタンドアロン Websocket サーバーを実際に使用していることが理解されました。基本的に、サーバー側に 2 つの異なる Web サーバーがあり、2 つの間の通信方法に問題があります。これは実際の問題であり、一度に 1 つのサーバーのみを使用することをお勧めします。Apache Websocket サポートの使用(実験的であり、あまりお勧めしません) を検討するか、PHP スクリプトを Websocket インスタンスに移行してください。

PHP も Apache も、Websocket を念頭に置いて構築されたものではありません。PHP のみを使用してスタンドアロンの Websocket サーバーをセットアップするのは非常に簡単ですが、コードが Apache/Web サーバーに依存している場合、残りの PHP スタックをそれに移行するのはそれほど簡単ではないかもしれません。Apache Websocket のサポートも最適とは言えません。残念ながら、実際の Websocket ソリューションのベスト プラクティスは、ゼロから構築されたテクノロジを使用することです。

于 2013-11-01T11:18:31.700 に答える