2009-06-03 16 views

Respuesta

14

Long polling es una técnica común para hacer algo como esto; para resumir brevemente, funciona de la siguiente manera:

  1. El cliente envía un XHR al servidor.

    • Si hay datos listos, el servidor lo devuelve inmediatamente.
    • De lo contrario, el servidor mantiene la conexión abierta hasta que los datos estén disponibles, luego lo devuelve.
    • Si la solicitud expira, vuelva a 1).
  2. La página que se ejecuta en el cliente recibe esta información y hace lo que hace con ella.

  3. Ir de nuevo a 1)

Esta es la forma en Facebook implements its chat feature.

This article también borra algunos de los conceptos erróneos de la larga encuesta, y detalla algunos de los beneficios de hacerlo.

+0

Esto es lo que estaba buscando, a pesar de que el título de la pregunta está destrozado. – cgp

+0

Sin duda funciona con Facebook; las notificaciones, el chat y muchas otras funciones funcionan con este método. –

+2

Mantenga en mi que Facebook utiliza Erlang en el back-end para manejar el chat para que pueda administrar todas las conexiones abiertas. Apache/PHP nunca sería capaz de escalar ese alto. –

0

Dependiendo de lo que esté haciendo, podría hacer eco a medida que avanza su secuencia de comandos, esto enviará el html al navegador a medida que se reproduce.

1

Creo que una solución más robusta es una página con un temporizador de Javascript que sondea el servidor en busca de nuevos datos. Mantener la respuesta abierta no es algo para lo que se diseñó el protocolo HTTP.

+0

Después de publicar el mío, vi esto. Definitivamente la mejor respuesta. Puedes tener un DIV que sigas llenando con algunas cosas de AJAX usando JavaScript. – bdwakefield

+0

ser una solución muy mala para algo así como un chat, donde las pausas pueden variar mucho, y quieres que las respuestas aparezcan rápidamente y, al mismo tiempo, evite cargar su servidor con encuestas frecuentes de miles de clientes que no devuelven nada la mayor parte del tiempo. Usar el protocolo HTTP para algo no fue diseñado para trabajos y es la mejor solución en tal caso. –

1

Me gustaría hacer eco/imprimir el HTML a medida que avanzaba. Hay algunas maneras diferentes en que puede hacer que el script se detenga antes de enviar el siguiente bit. No debería necesitar hacer nada con los encabezados ni ningún código especial para decirle al navegador que espere. Mientras su script se esté ejecutando, generará el HTML que recibe del script.

echo "<HTML><HEAD.../HEAD><BODY>"; 
while (running) 
{ 
    echo "printing html... </br>"; 
} 
echo "</BODY></HTML>"; //all done 
0

Yo sugeriría a investigar la aplicación de dicha funcionalidad con Ajax, en lugar de viejo y simple de HTML. Esto le permite mucha más flexibilidad en términos de diseño arquitectónico e interfaz de usuario

2

El cliente cerrará la conexión cuando no reciba datos durante un tiempo determinado. Este tiempo de espera no puede verse influenciado por los encabezados HTTP. Es específico del cliente y por lo general se establece en 120 segundos IIRC.

Así que todo lo que tiene que hacer es enviar pequeñas cantidades de datos regularmente para evitar que se agote el tiempo de espera.

1

Trate siempre de marco (al igual que en Gmail)

Todas estas técnicas son sólo hacks, http no está diseñado para hacer esto.

1

al final de la secuencia de comandos, usar algo como esto (suponiendo que hubiera salida de amortiguar el poniendo ob_start() en la parte superior de la página

<?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 

} 

?> 

Ese guión, básicamente, da salida a 1 megabyte de texto en 30kbs (simulado) no importa qué tan rápido sea la conexión del usuario y el servidor.

Cuestiones relacionadas