0

長いポーリングとオペラに問題があります。私自身はcプログラマーであり、ニーズに合わせてカスタマイズされたhttpデーモンを開発しました。この場合、大量の接続を処理できる長いポーリングサーバーが必要でした。

問題は、オペラがサイト上のリンクをクリックした後でも、どういうわけかこれらの長い投票を開いたままにし、もちろん新しい投票を開くことです。iframe内にjavascriptを含めようとする基本的なロングポーリング手法を使用します。これは他のブラウザでも問題なく機能しますが、サーバー側で以前のポーリングを強制的に閉じても、オペラはそれらを再び開きます。トラフィックの多いサイトでは、サイトを閲覧するだけでデーモンの空きファイル記述子がすぐに不足する可能性があるため、これはあまり良くありません(サイトをクリックするたびに新しい長いポーリングが開き、古いものは閉じないため) )。ページの更新は同じことを引き起こしません、それは正しいことをします:長いポーリングを閉じて、新しいものを開きます。オペラを閉じた後、すべてのファイル記述子が閉じられ、すべてが再び正常になります。

それで、http-daemonにオペラ用の特定のヘッダーを追加する必要がありますか、それともJavaScriptに何か問題がありますか?

編集:バージョンを使用してテスト:Opera / 9.80(X11; Linux x86_64; U; en)Presto/2.6.30バージョン/10.63

4

2 に答える 2

0

まあ、私たちはそれを「機能」させたと思います..javascriptを変更せずに。私は http-daemon でオペラのための特定のルールを作りました.それは古い長い投票に "403 Forbidden" で応答します. これらの古いソケットの単純な close() により、opera が接続を再開しました。

ブラウザのタブを閉じても Opera がこれらの長いポーリングを閉じないのはばかげています。Opera プロセス全体を閉じる必要があります。

于 2011-02-02T09:14:49.890 に答える
0

iframe 内に JavaScript を含めようとする基本的なロング ポーリング手法を使用します。

したがって、問題のソケットはiframe?にコンテンツを提供しています。

ページから離れた場所をクリックすると、Opera がこれらの接続を閉じているように見えます。iframesただし、次のように、ページを離れるときに を明示的に破棄してみてください。

window.onbeforeunload = function() {
    theIframe.parentNode.removeChild(theIframe);
    theIframe = undefined;
};

(どこかに横たわっているiframeへの参照があると思います。)

編集:または、最初にiframeを別の場所に移動することもできます:

window.onbeforeunload = function() {
    theIframe.src = "about:blank";             // <== New bit
    theIframe.parentNode.removeChild(theIframe);
    theIframe = undefined;
};
于 2011-02-01T15:54:02.090 に答える