13

Silverlight アプリケーションから PHP ページへの HTTP 永続接続を確立しようとしています (つまり、HTTP 要求ごとに新しい TCP 接続を作成せずに) Apache サーバーによってホストされています。

この目的のために、Web サーバーが「接続」ヘッダーを「キープアライブ」に設定して HTTP 応答を送信する必要があります。クライアント側では、Silverlight が提供するネットワーク API は基本的にブラウザ ネットワーク機能のラッパーであるため、問題はないようです。リクエストのデフォルトでは問題ありません。Content-Length も明確に定義されているため、サーバーはいつ応答を送信する必要があるかを認識できます。ただし、PHP 要求に対するサーバーの応答は、体系的に "Connection:" を "close" に設定するため、接続が終了し、永続的な接続が妨げられます。

この問題を回避するためにいくつかのことを試しました: 異なるメソッド (GET および POST)、スクリプトの先頭に次の PHP コードを使用して、応答に「接続: キープアライブ」を明示的に与えます。

header("Connection: Keep-alive");

後者は、期待されるヘッダーを応答に追加します。これは良いことですが、追加の「接続: 閉じる」が応答ヘッダーの後半に追加されます。

「クローズ」を強制するのはPHPまたはApacheの機能ですか(セキュリティまたはパフォーマンスの目的で、私は推測しています)、またはここに何かが欠けていますか?

前もって感謝します。

PS : パケットをスニッフィングしたところ、「キープアライブ」を使用している Web サイトは多くなく、TCP 接続が再確立されていることがわかりました。キープアライブは、HTTP 1.1 での既定の優先動作ではありませんか?

4

2 に答える 2

26

Keep-Alive 機能は、永続的な接続用ではありません。

Keep-Alive は、Web サイトの接続数を減らすことを目的としています。Web ページの各イメージ/css/javascript に対して新しい接続を作成する代わりに、同じ接続を再利用して多くのリクエストが行われます。

接続での最大リクエスト数やリクエスト間のタイムアウトなど、Apache でもこれを防ぐ設定がいくつかあります。また、すべての接続には独自のスレッドが必要なため、リソースを非常に高速に消費します。

その種の作業用に作成された別のソリューションに切り替える必要があります。

接続を開いたままにするサービスについては、http://orbited.orghttp://twistedmatrix.com/trac/をご覧ください。

于 2010-06-07T16:53:04.307 に答える
6

PHP は HTTP 接続を管理しないため、この設定を変更する方法はありません。サーバーでそれを設定する必要があります。たとえば、mod_php を使用している場合、Apache でこのようにキープアライブを有効にできます。

KeepAlive On
于 2010-06-07T19:25:05.487 に答える