2009-06-03 17 views
12

Devo restituire qualsiasi intestazione HTTP per dire al browser che il mio server non chiuderà immediatamente la connessione e mostrerà come viene ricevuto l'HTML? C'è qualcosa di necessario per visualizzare HTML in modo incrementale come flush()?Come visualizzare HTML nel browser in modo incrementale per un lungo periodo di tempo?

Questa tecnica veniva utilizzata per cose come la chat, ma sto pensando di usarla per un'applicazione di tipo COMET.

risposta

14

Long polling è una tecnica comune per fare qualcosa di simile; per riassumere brevemente, funziona come segue:

  1. Il client invia un XHR al server.

    • Se i dati sono pronti, il server lo restituisce immediatamente.
    • In caso contrario, il server mantiene aperta la connessione finché i dati non diventano disponibili, quindi restituisce questo.
    • Se la richiesta è scaduta, tornare a 1).
  2. La pagina in esecuzione sul client riceve questi dati e fa ciò che fa con esso.

  3. Torna alla 1)

Questo è il modo in Facebook implements its chat feature.

This article chiarisce anche alcuni dei malintesi del sondaggio a lungo termine e illustra alcuni dei vantaggi di farlo.

+0

Questo è quello che stavo cercando, nonostante il titolo della domanda sia straziato. – cgp

+0

Funziona sicuramente con Facebook: le notifiche, la chat e molte altre funzioni funzionano con questo metodo. –

+2

Tenete presente che Facebook utilizza Erlang sul backend per gestire la chat in modo che possa gestire tutte le connessioni aperte. Apache/PHP non sarebbe mai in grado di scalare così in alto. –

0

A seconda di ciò che si sta facendo, si potrebbe semplicemente echeggiare come procede lo script, questo invierà l'html al browser come viene echeggiato.

1

Penso che una soluzione più robusta sia una pagina con un timer Javascript che esegue il polling del server per i nuovi dati. Mantenere aperta la risposta non è qualcosa per cui è stato progettato il protocollo HTTP.

+0

Dopo aver postato il mio ho visto questo, sicuramente la risposta migliore.Puoi solo avere un DIV che continui a riempire con alcuni elementi AJAX utilizzando il codice JavaScript – bdwakefield

+0

essere una pessima soluzione per qualcosa come una chat, in cui le pause possono variare molto e si desidera che le risposte vengano visualizzate rapidamente y ma allo stesso tempo evitare di sovraccaricare il tuo server con sondaggi frequenti da parte di migliaia di client che non restituiscono nulla la maggior parte del tempo. Utilizzando il protocollo HTTP per qualcosa non è stato progettato per funzionare ed è la soluzione migliore in tal caso. –

1

Vorrei solo echo/stampare l'HTML come sono andato. Esistono diversi modi in cui è possibile sospendere lo script prima di inviare il bit successivo. Non dovresti aver bisogno di fare nulla con intestazioni o codici speciali per dire al browser di aspettare. Finché il tuo script è ancora in esecuzione, renderà il codice HTML che riceve dallo script.

0

Vorrei suggerire di indagare sull'implementazione di tale funzionalità utilizzando Ajax, piuttosto che semplice vecchio HTML. Ciò consente maggiore flessibilità in termini di progettazione architettonica e interfaccia utente

2

Il client chiuderà la connessione quando non riceve dati per un certo periodo di tempo. Questo timeout non può essere influenzato dalle intestazioni HTTP. È specifico per il cliente e in genere è impostato su 120 secondi IIRC.

Quindi tutto ciò che dovete fare è inviare piccole quantità di dati regolarmente per evitare di colpire il timeout.

1

Prova sempre telaio (come in Gmail)

Tutte queste tecniche sono solo hack, http non è progettato per fare questo.

1

alla fine dello script, usare qualcosa di simile (supponendo che si aveva in uscita il buffering sul mettendo ob_start() nella parte superiore della pagina

<?php 

set_time_limit(0); // Stop PHP from closing script after 30 seconds 

ob_start(); 

echo str_pad('', 1024 * 1024, 'x'); // Dummy 1 megabyte string 

$buffer = ob_get_clean(); 

while (isset($buffer[0])) { 

$send = substr($buffer, 0, 1024 * 30); // Get 30kbs bytes from buffer :D 
$buffer = substr($buffer, 1024 * 30); // Shorten buffer 

echo $send; // Send buffer 
echo '<br />'; // forces browser to reload contents some how :P 

ob_flush(); // Flush output to browser 
flush(); 

sleep(1); // Sleep for 1 second 

} 

?> 

Questo script genera fondamentalmente 1 megabyte di testo 30kbs (simulato) non importa quanto veloce sia la connessione utente e server

Problemi correlati