2010-06-07 5 views
11

Ich versuche, eine persistente HTTP-Verbindung von einer Silverlight-Anwendung zu einer PHP-Seite (dh ohne eine neue TCP-Verbindung für jede HTTP-Anfrage erstellen) von einem Apache-Server gehostet."Verbindung: Keep-Alive" in Server Antwort

Zu diesem Zweck muss der Webserver seine HTTP-Antworten mit dem Header "Connection" senden, der auf "Keep-Alive" gesetzt ist. Client-seitig scheint es kein Problem zu geben, da die von Silverlight bereitgestellte Netzwerk-API im Grunde ein Wrapper der Browser-Netzwerkfähigkeiten ist, von dem, was ich gelesen habe: wenn der Browser also HTTP 1.1 und Connection: Keep-Alive unterstützt standardmäßig für seine Anfragen, ist es in Ordnung. Content-Length ist auch gut definiert, so dass der Server weiß, wenn es die Antwort senden muss. Die Antwort des Servers auf die PHP-Anfrage setzt jedoch systematisch "Verbindung:" auf "Schließen", wodurch die Verbindung beendet und eine dauerhafte Verbindung verhindert wird.

Ich habe einige Dinge versucht, um dieses Problem zu umgehen: verschiedene Methoden (GET und POST), explizit eine "Verbindung: keep-alive" zu der Antwort mit dem folgenden PHP-Code am Anfang meines Skripts:

Letzterer fügt der Antwort den erwarteten Header hinzu, was gut ist, aber ein zusätzliches "Connection: close" wird später noch in den Antwortheadern angehängt.

Ist es eine Funktion von PHP oder Apache, die "nahe" erzwingt (aus Sicherheits- oder Leistungsgründen, vermute ich) oder fehlt mir hier etwas?

Vielen Dank im Voraus.

P.S. : Ich habe bemerkt, dass durch das Sniffing von Paketen nicht viele Webseiten "Keep-Alive" verwenden und die TCP-Verbindung wiederhergestellt wird. Ist Keepalive nicht das Standard- und bevorzugte Verhalten unter HTTP 1.1?

+0

, die wahrscheinlich von Apache, PHP nicht - zum besten meines Wissens, haben PHP keine Kontrolle über diese. Sie können dies überprüfen, indem Sie versuchen, über dieselbe Verbindung eine statische Datei anzufordern. Apache-Direktive: http://httpd.apache.org/docs/2.2/mod/core.html#keepalive –

Antwort

24

Die Keep-Alive-Funktionalität ist nicht für dauerhafte Verbindungen gedacht.

Keep-Alive soll die Anzahl der Verbindungen für eine Website reduzieren. Anstatt für jedes Bild/css/javascript in einer Webseite eine neue Verbindung zu erstellen, werden viele Anfragen mit der gleichen Verbindung wiederholt.

Es gibt einige Einstellungen, die dies auch in Apache verhindern, wie die maximale Anzahl von Anfragen bei einer Verbindung oder Timeouts zwischen Anfragen. Dies wird auch Ihre Ressourcen sehr schnell essen, da jede Verbindung einen eigenen Thread benötigt.

Sie sollten zu einer anderen Lösung wechseln, die für diese Art von Arbeit gemacht wird.

Für Dienste, die die Verbindung offen halten Sie

+1

+1 für nicht missbraucht HTTP für dauerhafte Verbindungen. Es ist einfach genug, einen PHP-Daemon bei Bedarf auf einen Port/Socket warten zu lassen. – Wrikken

+0

Ja, das ist auch eine Möglichkeit.in meiner Opionion Orbited kann das viel einfacher und ist stabiler, während immer noch eine grundlegende http-Server :) – favo

+0

Ich programmiere eine Echtzeit-Instant-Messaging-App (Art von Google Wave für den Echtzeit-Aspekt) in einem eingeschränkten Kontext (Nur PHP und minimale Webserver-Funktionen). Ich darf nicht einmal Datenbanken verwenden. Bei dieser Art von Druckaufforderung (jeder Tastendruck ergibt grundsätzlich eine Anfrage) wäre es sinnvoll, die Verbindung zum Server aufrecht zu erhalten. Danke für deinen Rat. – ZenithM

5

Seit PHP nicht gelingt, die HTTP-Verbindung einen Blick auf http://orbited.org und http://twistedmatrix.com/trac/ nehmen kann, hat es keine Möglichkeit, diese Einstellung zu ändern. Sie müssen das in Servern einstellen. Zum Beispiel können Sie Keep-Alive wie dies in Apache aktivieren, wenn Sie mod_php verwenden,

KeepAlive On 
+0

Danke, dieser Parameter scheint tatsächlich auf meinem Server auf Aus gestellt zu sein. – ZenithM