2010-06-07 28 views
11

Sto provando a stabilire una connessione HTTP persistente da un'applicazione Silverlight a una pagina PHP (ovvero senza creare una nuova connessione TCP per ogni richiesta HTTP) ospitata da un server Apache."Connessione: keep-alive" nella risposta del server

A tal fine, ho bisogno che il server web invii le sue risposte HTTP con l'intestazione "Connessione" impostata su "Mantieni-vivi". Sul lato client, non sembra esserci alcun problema in quanto l'API di rete fornita da Silverlight è fondamentalmente un wrapper delle capacità di rete del browser, da quello che ho letto: quindi se il browser supporta HTTP 1.1 e Connection: Keep-Alive di default per le sue richieste, va bene. Content-Length è anche ben definito, in modo che il server sappia quando deve inviare la risposta. Tuttavia, la risposta del server alla richiesta PHP imposta sistematicamente "Connection:" su "close", terminando così la connessione e impedendo una connessione persistente.

Ho provato alcune cose per ovviare a questo problema: diversi metodi (GET e POST), dando esplicitamente una "Connessione: keep-alive" alla risposta con il seguente codice PHP all'inizio del mio script:

header("Connection: Keep-alive"); 

Quest'ultimo aggiunge l'intestazione prevista alla risposta, che è buona, ma un'aggiunta "Connessione: chiusa" viene aggiunta successivamente nelle intestazioni di risposta.

È una funzionalità di PHP o Apache che applica "chiudi" (per alcuni scopi di sicurezza o prestazioni, sto supponendo) o mi manca qualcosa qui?

Grazie in anticipo.

P.S. : Annusando i pacchetti, ho notato che non molti siti web usano "Keep-alive" e la connessione TCP è ristabilita. Keepalive non è il comportamento predefinito e preferito sotto HTTP 1.1?

+0

Questo è probabilmente Apache, PHP non è - al meglio delle mie conoscenze, PHP ha alcun controllo su questo. È possibile verificare tentando di richiedere un file statico tramite la stessa connessione. Direttiva Apache: http://httpd.apache.org/docs/2.2/mod/core.html#keepalive –

risposta

24

La funzionalità Keep-Alive non è pensata per connessioni persistenti.

Keep-Alive è pensato per ridurre il numero di connessioni per un sito Web. Invece di creare una nuova connessione per ogni immagine/css/javascript in una pagina web verranno fatte molte richieste riutilizzando la stessa connessione.

Ci sono alcune impostazioni che impediscono questo anche in Apache, come il numero massimo di richieste su una connessione o timeout tra le richieste. Questo mangerà anche le tue risorse molto velocemente perché ogni connessione ha bisogno del suo thread.

Si dovrebbe passare a un'altra soluzione, che è fatta per quel tipo di lavoro.

Per i servizi che mantenere la connessione aperta si può dare un'occhiata a http://orbited.org e http://twistedmatrix.com/trac/

+1

+1 per non abusare del protocollo HTTP per le connessioni persistenti. È abbastanza facile lasciare che un demone PHP ascolti una porta/socket se necessario. – Wrikken

+0

sì, anche questa è una possibilità.nel mio opionion orbited posso farlo molto più facile ed è più stabile pur fornendo un server http di base :) – favo

+0

Sto programmando un'app di messaggistica istantanea in tempo reale (un po 'come Google Wave per l'aspetto in tempo reale) in un contesto limitato (Funzionalità PHP only e minimal webserver). Non mi è nemmeno permesso usare i datebase. In questo tipo di richiesta di pressioni (ogni sequenza di tasti genera in pratica una richiesta), sarebbe utile mantenere la connessione con il server. Grazie per il tuo consiglio. – ZenithM

5

Dal PHP non gestisce la connessione HTTP, non ha modo di cambiare questa impostazione. È necessario impostarlo nei server. Ad esempio, è possibile attivare keep-alive come questo in Apache se si utilizza mod_php,

KeepAlive On 
+0

Grazie, sembra che questo parametro sia impostato su Off sul mio server. – ZenithM

Problemi correlati