2012-06-15 20 views
5

Primero, me gustaría agradecer a todos ustedes grandes personas por ser tan útiles para los nuevos programadores.¿Es este el método adecuado para Long Polling (programación Comet)

Tengo una pregunta sobre el sondeo largo. He estudiado algunos artículos sobre técnica de sondeo largo de Comet Programming. El método me parece muy difícil porque a veces también requiere instalar algunos scripts en el servidor.

Ahora he encontrado un ejemplo en largas encuestas. Funciona muy bien, pero no estoy seguro de si es el método adecuado. El script de ejemplo trata de una aplicación similar a un chat. Este script php funciona de la siguiente manera:

  1. El script php comprueba continuamente el archivo data.txt hasta que se modifique.
  2. Tan pronto como se modifique el archivo data.txt, el nuevo texto se enviará a la página web.

Aquí está el script php:

<?php 
$filename = dirname(__FILE__).'/data.txt'; 

// store new message in the file 
$msg = isset($_GET['msg']) ? $_GET['msg'] : ''; 
if ($msg != '') 
{ 
    file_put_contents($filename,$msg); 
    die(); 
} 

// infinite loop until the data file is not modified 
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0; 
$currentmodif = filemtime($filename); 
while ($currentmodif <= $lastmodif) // check if the data file has been modified 
{ 
    usleep(500000); // sleep 500ms to unload the CPU 
    clearstatcache(); 
    $currentmodif = filemtime($filename); 
} 

// return a json array 
$response = array(); 
$response['msg']  = file_get_contents($filename); 
$response['timestamp'] = $currentmodif; 
echo json_encode($response); 
flush(); 
?> 

no estoy incluyendo el código de página web para mantener el simple pregunta. La página web tiene solo un div que muestra el texto de data.txt cada vez que se cambia.

puntos principales de mi pregunta son:

  • ¿Es este método looping el método adecuado a largo sondear el servidor?
  • También cuando el servidor está ejecutando sleep(); ¿qué pasará con otras solicitudes simultáneas?
  • ¿Hay alguna técnica para reducir la carga en el servidor debido a la secuencia de comandos continua larga de sondeo ?
  • Si un cliente que comienza esta solicitud larga de sondeo se desconecta, ¿cómo podemos saber y detener la secuencia de comandos para ese cliente desconectado en consecuencia?

me guían amablemente con este problema ... Gracias

Respuesta

5

Sí, eso es una idea. Sin embargo, debe tener en cuenta que este script no finalizará y se generará una instancia de PHP para cada usuario. Estoy usando la lógica longpoll con el lado del servidor v8cgi. Después de que el cliente inició una Solicitud XMLHttp (XHR), el servidor comienza a verificar con intervalos para nuevas entradas. He agregado un lado del servidor del temporizador, para enviar una respuesta cada 5 minutos, después de lo cual el cliente, si no está desconectado, reenvía el XHR y el procedimiento se repite.

Así que cada instancia del mecanismo del lado del servidor no dura más de 5 minutos como máximo, porque si el cliente está desconectado, la respuesta que el servidor envía después de 5 minutos no es seguida por un nuevo XHR.

El proceso es así:

  • cliente envía XHR
  • desova servidor procesa un comprueba periódicamente si hay actualizaciones
  • si alguna actualización tiene que enviar: servidor envía la respuesta
    • procesos cliente la respuesta y reinicia XHR
    • el servidor genera el proceso y verifica periódicamente las actualizaciones
  • si 5 minutos pasaron sin cambios:
    • servidor envía la respuesta y finaliza el proceso generado
    • procesos de cliente (vacío) la respuesta se reinicia un XHR
    • servidor genera nuevo proceso y comienza a comprobar
  • si se debe enviar alguna actualización: el servidor envía la respuesta
  • [...]
  • si pasaron 5 minutos con actualizaciones:
  • [...]
  • hasta que se desconecte cliente (= ninguna nueva XHR después de la respuesta del servidor)
+0

Gracias por la respuesta. La demora es en realidad 500 ms, es decir, 0,5 segundos. Tenga en cuenta que tan pronto como el navegador del cliente abra la página, esta secuencia de comandos comenzará a realizar la rutina de verificación y actualización. Si hay para, por ejemplo, 1000 exploradores de clientes se abren al mismo tiempo, el servidor tiene que enviar respuestas a todos ellos continuamente. ¿Cómo podemos verificar el script php si alguno de los clientes está desconectado y detener el script para mantener el script abierto para todos los demás clientes en línea? Explique amablemente –

+0

Todavía estoy esperando su respuesta (ya que parece que solo unas pocas personas saben acerca de las largas encuestas por las que no recibo ninguna otra respuesta). Amablemente comparta su técnica de Longpoll conmigo. Estaría muy agradecido. ¿Cómo podemos verificar el script php si alguno de los clientes está desconectado y detener el script para mantener el script abierto para todos los demás clientes en línea? ¡Por favor ayuda! –

+0

He agregado algunas explicaciones a mi pregunta, amablemente revise que –

1

sí, esto es una manera fácil y práctico para hacer eso y no es el correcto método, pero no la mejor idea. porque sufre y causará muchos problemas a medida que los usuarios aumenten.

y para alojamiento compartido esto no es una buena idea para hacer eso, este método funcionará bien solo cuando los usuarios no son una gran cantidad, y si usted tiene su propio servidor. si usa este método en el servidor de alojamiento compartido, puede enfrentar recurso de servidor máximo usado, o problemas de bloqueo de sesión y el servicio http podría no estar disponible durante un tiempo.

o puede utilizar la API existente, para aplicaciones de chat, o tener un servidor dedicado que puede ejecutar los scripts como node.js y similares módulos de servidor

+0

Gracias por la respuesta y consejos. –

Cuestiones relacionadas