web-dev-qa-db-ja.com

サーバーの応答の「接続:キープアライブ」

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

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

私はこの問題を回避するためにいくつかのことを試みました:異なるメソッド(GETとPOST)、最初に次のPHPコードで応答に「接続:キープアライブ」を明示的に与えます私のスクリプトの:

header("Connection: Keep-alive");

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

PHPまたは "close"を強制するApache(何らかのセキュリティまたはパフォーマンスの目的で、私は推測している)の機能ですか、それともここで何か不足していますか?

前もって感謝します。

追伸:パケットをスニッフィングすることで、多くのWebサイトが「キープアライブ」を使用しておらず、TCP接続が再確立されています。キープアライブがHTTP 1.1でのデフォルトの優先動作ではありませんか?

13
ZenithM

キープアライブ機能は、永続的な接続用ではありません。

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

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

そのような作業のために作られた別のソリューションに切り替える必要があります。

接続を開いたままにするサービスについては、 http://orbited.org および http://twistedmatrix.com/trac/ を参照してください。

26
favo

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

KeepAlive On
6
ZZ Coder