メッセージの送信とデータベースへの保存だけをカバーする PHP-MySQL シャウトボックス チュートリアルに従っていました。作業を終えた後、一時的に、メッセージのリストを 5 秒ごとに更新するか、AJAX を使用して新しいメッセージを送信するたびに更新することにしました。しかし、これは実際のアプリケーションでは非効率的であり、サーバーを消費します (実際には低強度の DDOS)。では、必要なときに新しいメッセージのリストを更新するにはどうすればよいでしょうか? もっと正確に言うと、新しいメッセージが送信されたという正確なタイミングで通知を受けて表示できるようにするにはどうすればよいですか?
4 に答える
問題の解決策はlong pollingと呼ばれます。詳細については、この SO questionを参照してください。
アイデアは、現在行っているように AJAX で情報をロードすることですが、返すものが何もない場合、サーバーはすぐに応答を返しません。代わりに、空の応答を返す前に定義済みの秒数だけ接続を開いたままにするか、メッセージが利用可能になるとすぐに戻ります。最大応答時間は、価値のあるものにするのに十分な長さにする必要がありますが、クライアント側でタイムアウトのリスクを冒すほど長くはなりません - 約 20 秒で問題ありません。
このソリューションを使用すると、サーバーへの HTTP 呼び出しの数を減らすことができますが、問題がシフトするだけです。PHP スクリプトは、メッセージが利用可能になるのを待っている間、データベースをポーリングする必要があります。適度なトラフィックが予想される場合は、問題ありません。しかし、本格的にスケーリングできるようにしたい場合は、別のソリューションを探す必要があります。
最善の解決策は、 Amazon SQSやIronMQなどのデータベースではなく、適切なメッセージ キューを使用することです。
これらは無制限にスケーリングし、ロング ポーリングなどの機能を提供します (IronMQ については不明ですが、SQS では確実に実行されます)。
訪問者のブラウザに基づいてすべてのプロトコルとソリューションを処理する優れたライブ通信ライブラリである、クライアント側のSocket.IO プロジェクトを確認することを強くお勧めします。これにより、サーバー側の問題も解決されます。
Socket.IO は、さまざまなトランスポート メカニズムの違いをあいまいにして、すべてのブラウザーとモバイル デバイスでリアルタイム アプリを実現することを目的としています。JavaScript でのんきなリアルタイム 100% です。
- WebSocket
- Adobe® Flash® ソケット
- AJAX ロング ポーリング
- AJAX マルチパート ストリーミング
- 永遠に
- JSONP ポーリング
Web ブラウザがサーバーから通知を受ける方法はありません。HTTP はプル ベースのシステムです。AJAX の全体的な目的は、プッシュ ベースのシステムであると偽ることです。プッシュが必要な場合は、AJAX が必要です。