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でのデフォルトの優先動作ではありませんか?
キープアライブ機能は、永続的な接続用ではありません。
キープアライブは、Webサイトの接続数を減らすことを目的としています。 Webページの各画像/ css/javascriptに新しい接続を作成する代わりに、同じ接続を再利用して多くのリクエストが行われます。
接続でのリクエストの最大数やリクエスト間のタイムアウトなど、Apacheでもこれを防ぐいくつかの設定があります。また、接続ごとに独自のスレッドが必要になるため、リソースが非常に速く消費されます。
そのような作業のために作られた別のソリューションに切り替える必要があります。
接続を開いたままにするサービスについては、 http://orbited.org および http://twistedmatrix.com/trac/ を参照してください。
PHPはHTTP接続を管理しないため、この設定を変更する方法はありません。サーバーで設定する必要があります。たとえば、次の場合、Apacheでこのようにキープアライブを有効にできますあなたはmod_phpを使用しています、
KeepAlive On