3

Symfony フレームワークでロングポーリングの概念を使用する API を実装しようとしています。

成長することしかできないテーブル「フィード」があるとしましょう(ユーザーが他のインターフェースからフィードを挿入できると仮定します)。クライアント側のリアルタイム更新ページを作成したいと考えています。アイデアは次のとおりです。

  1. クライアントは、最終変更のタイムスタンプを含む ajax リクエストを送信します (初回は 0 を送信します)。
  2. サーバーは、クライアントのタイムスタンプをタイムスタンプと比較して、ユーザーが送信したものよりも大きなタイムスタンプを持つすべてのメッセージを取得します
  3. 新しいメッセージがある場合は、最新のメッセージのタイムスタンプとともに、すぐにクライアントに返します。一方、新しいメッセージがない場合は、2 分間のビジー待機ループに入り、1 ~ 3 秒ごとに (ランダムに) チェックします。新しいメッセージがあるかどうか。
  4. クライアントがサーバーの応答を受信すると、ブラウザはビューを更新し、すぐに新しい ajax リクエストを送信します。

つまり、x 秒ごとに AJAX 呼び出しを送信する代わりに、サーバーは新しい情報が得られるまでリクエストを保持します。

Symfony の経験が豊富なため、この API の簡単なデモを実装しようとしましたが、うまく機能します。セッションブロッキングの問題があったため (ajax 呼び出しが保留されているため、サーバーにアクセスできません)、単純にアクションに以下を追加しました。

public function executeIndex(sfWebRequest $request)
{
  session_write_close();
       :
       :

このリンクも参照してください)

次に、API への大規模なアクセスをテストします。100 人のユーザーは正常に動作し、1000 人のユーザーはすべてクラッシュします。次の 2 つの問題があることに気付きました。

  1. アクセスごとに新しいDB接続が開かれます
  2. アクセスごとに、サーバーは新しいプロセスを実行します

persistent: true最初の問題については、database.yml Doctrine コネクタに入れようとしました。サーバー接続を監視したところ、API へのアクセスごとに新しい接続が開かれることがわかりました。基本的に、私はまだ同じ2つの問題でブロックされています。

誰かがこの問題について何か考えや経験を持っていますか?? それとも、API を Symfony で実装するという考えをあきらめるべきでしょうか??

4

2 に答える 2

0

これにsymfonyを使用するのは間違ったアプローチだと思います。ソケットを使用すると、はるかに簡単になります。

たとえば、nodejsまたはape-project (comet)を見てください。

どちらも、apache、lighttpd、nginx よりもはるかに多くの現在のユーザーを処理できます...

于 2011-06-16T11:04:55.807 に答える
0

ユーザーごとに異なるスレッドを作成するApacheと、各スレッドには個別のデータベース接続があります。それがデータベース接続が高い理由です

于 2015-03-23T08:07:27.093 に答える