Symfony フレームワークでロングポーリングの概念を使用する API を実装しようとしています。
成長することしかできないテーブル「フィード」があるとしましょう(ユーザーが他のインターフェースからフィードを挿入できると仮定します)。クライアント側のリアルタイム更新ページを作成したいと考えています。アイデアは次のとおりです。
- クライアントは、最終変更のタイムスタンプを含む ajax リクエストを送信します (初回は 0 を送信します)。
- サーバーは、クライアントのタイムスタンプをタイムスタンプと比較して、ユーザーが送信したものよりも大きなタイムスタンプを持つすべてのメッセージを取得します
- 新しいメッセージがある場合は、最新のメッセージのタイムスタンプとともに、すぐにクライアントに返します。一方、新しいメッセージがない場合は、2 分間のビジー待機ループに入り、1 ~ 3 秒ごとに (ランダムに) チェックします。新しいメッセージがあるかどうか。
- クライアントがサーバーの応答を受信すると、ブラウザはビューを更新し、すぐに新しい ajax リクエストを送信します。
つまり、x 秒ごとに AJAX 呼び出しを送信する代わりに、サーバーは新しい情報が得られるまでリクエストを保持します。
Symfony の経験が豊富なため、この API の簡単なデモを実装しようとしましたが、うまく機能します。セッションブロッキングの問題があったため (ajax 呼び出しが保留されているため、サーバーにアクセスできません)、単純にアクションに以下を追加しました。
public function executeIndex(sfWebRequest $request)
{
session_write_close();
:
:
(このリンクも参照してください)
次に、API への大規模なアクセスをテストします。100 人のユーザーは正常に動作し、1000 人のユーザーはすべてクラッシュします。次の 2 つの問題があることに気付きました。
- アクセスごとに新しいDB接続が開かれます
- アクセスごとに、サーバーは新しいプロセスを実行します
persistent: true
最初の問題については、database.yml Doctrine コネクタに入れようとしました。サーバー接続を監視したところ、API へのアクセスごとに新しい接続が開かれることがわかりました。基本的に、私はまだ同じ2つの問題でブロックされています。
誰かがこの問題について何か考えや経験を持っていますか?? それとも、API を Symfony で実装するという考えをあきらめるべきでしょうか??