3

私は長い XMLHttpRequest ポーリングを介してCppCMSフレームワークのコメット サポートに取り組んでいます。多くの場合、そのようなリクエストは、サーバーからの応答が返される前にクライアントによって閉じられます。たとえば、ページが閉じられたり、ユーザーが他のページに移動したり、ページが更新されたりします。

サーバー側では、接続が切断されたという通知を受け取ることを期待しています。FastCGI、SCGI、シンプルな HTTP プロキシの 3 つのコネクタを介してアプリケーションをテストしました。

3 つの主要な UNIX Web サーバー、Apache2、lighttpd、および Nginx から、最後の 1 つだけが期待どおりに接続を閉じ、アプリケーションが待機キューから要求を削除できるようになりました。これは、FastCGI コネクタと HTTP プロキシ コネクタの両方で機能しました。(Nginx にはデフォルトで scgi モジュールがありません)。

その他、Apache と Lighttpd は、接続を閉じたり、切断されたクライアントについてバックエンドに通知したりせず、クライアントがまだオンラインであるかのように処理を進めます。これは、サポートされている 3 つの API (FastCGI、SCGI、および HTTP プロキシ) すべてで発生します。

私はLighttpdの問題をオープンしましたが、さらに気になるのは、Apache -- lighttpd として成熟し、十分にサポートされている Web サーバーであり、クライアントが行ったサーバー バックエンドを公開していないという事実です。

質問:

  1. これはバグですか、それとも機能ですか? Web サーバーとアプリケーション バックエンド間の接続を閉じない理由はありますか?
  2. FastCGI/SCGI/HTTP-Proxy バックエンドを介してこれらのサーバーの背後で動作する実際の Comet アプリケーションはありますか?
  3. 上記が当てはまる場合、彼らはこの問題にどのように対処しますか? すべての接続を 10 秒ごとにタイムアウトできることは理解していますが、クライアントがリッスンしている限り、それらをアイドル状態に保ちたいと考えています。

ありがとう!

4

2 に答える 2

4

(1) 特徴。または、より具体的には、実装の詳細からのフォールアウトです。

TCP/IP 接続には、一定のトラフィック フローが前後に流れるわけではありません。したがって、(a) クライアントが接続を閉じていることを通知するか、(b) タイムアウトが発生しない限り、クライアントがなくなったことを知る方法はありません。

(2) 私は、Comet や CppCMS について詳しく知りません。しかし、はい、前述の Web サーバーの背後で実行されているすべての種類の CMS サーバーがあり、それらすべてがこの問題に対処する必要があります (そして、はい、それは苦痛です)。

(3) タイムアウトしか方法はありませんが、いわば痛みを和らげることができます。他にアクティビティがない場合に、N 秒ごとに接続を介してクライアントにサーバーに ping を送信させます。何もする必要はなく、返信に何かを追加できます。同時編集の通知または必要なもの。

mod_fastcgi が、Apache が切断または接続のタ​​イムアウトを検出したことをバックエンドに伝えることをサポートしていないのは驚くべきことです。そして、がっかりしたのはあなたが初めてではありません。

このページの 2 番目のパッチは、その特定の問題を修正する必要があります。

http://osdir.com/ml/web.fastcgi.devel/2006-02/msg00015.html

于 2009-09-06T00:53:45.177 に答える
0

http://ncannasse.fr/blog/tora_comet

具体的な情報はありませんが、この記事では、クライアントが Apache から切断されたことを検出できると述べています。を参照してくださいtora.Queue。また、ソースは neko CVS で入手できるようですので、そこにいくつかの手がかりを見つけることができるかもしれません。幸運を。

于 2009-09-06T00:06:35.887 に答える