¿Existe una alternativa de ajax que no requiera sondeo sin modificaciones del lado del servidor?

StackOverflow https://stackoverflow.com/questions/427861

  •  06-07-2019
  •  | 
  •  

Pregunta

Estoy tratando de crear un pequeño y básico " ajax " juego multijugador basado. Las coordenadas de los objetos están siendo dadas por un PHP & Quot; handler & Quot ;. Este archivo handler.php se está encuestando cada 200MS, utilizando ajax.

Dado que no hay necesidad de sondear cuando no pasa nada, me pregunto, ¿hay algo que pueda hacer lo mismo sin sondeos frecuentes? P.ej. Comet, aunque escuché que necesitas configurar las aplicaciones del lado del servidor para Comet. Es un servidor web compartido, así que no puedo hacer eso.

Tal vez evite que el archivo handler.php incluso devuelva una respuesta si no tiene que cambiar nada en el cliente, ¿es eso posible? Por otra parte, aún tendría al cliente pidiendo inútilmente una respuesta a pesar de que algo aún no ha cambiado. Básicamente, solo debe usar ancho de banda y recursos de corte si es necesario informarle algo al cliente, por ejemplo. el cambio de las coordenadas de un objeto.

¿Fue útil?

Solución

Aquí hay una solución: use un proveedor de cometas SaaS, como WebSync On-Demand . No hay que preocuparse por los recursos del servidor, hosting compartido o no, ya que todo está descargado y puede extraer la información según sea necesario.

Dado que es SaaS, funcionará con cualquier idioma del servidor. Para PHP, ya hay un editor escrito y listo para funcionar.

Otros consejos

Comet se usa generalmente para este tipo de cosas, y puede ser una configuración frágil ya que no es una tecnología particularmente común, por lo que puede ser fácil no & "; hacerlo bien. &"; Dicho esto, ahora hay más recursos disponibles que la última vez que lo probé hace ~ 2 años.

No creo que pueda hacer lo que está pensando y tener handler.php simplemente no devuelve nada y detiene la ejecución: el servidor web mantendrá la conexión abierta y evitará más sondeos hasta que handler.php haga algo (termina o proporciona salida). Cuando lo hace, todavía está manejando una respuesta.

Puede probar una técnica de sondeo larga, donde su AJAX permite un tiempo de espera muy grande (por ejemplo, 30 segundos) y handler.php gira sin responder hasta que tenga algo que informar, luego regresa. (Querrá asegurarse de que el giro no requiera muchos recursos). Si handler.php & Quot; caduca & Quot; y no pasa nada, haz que salga y deja que AJAX vuelva a sondear. Como solo ocurre cada 30 segundos, será una gran mejora más de ~ 5 veces por segundo. Eso mantendría su votación al mínimo.

Pero para eso está diseñado Comet.

Como Ajax solo le ofrece un modelo de solicitud de servidor cliente (normalmente denominado extracción, en lugar de inserción), la única forma de obtener datos del servidor es a través de solicitudes. Sin embargo, una técnica común para solucionar esto es que el servidor solo responda cuando tenga datos nuevos. Por lo tanto, el cliente realiza una solicitud, el servidor retiene esa solicitud hasta que algo sucede y luego responde. Esto evita la necesidad de encuestas frecuentes, incluso cuando los datos no han cambiado, ya que solo necesita que el cliente envíe una nueva solicitud después de recibir una respuesta.

Dado que está utilizando PHP, un método simple podría ser hacer que el código PHP llame al comando de suspensión durante 200 ms a la vez entre las comprobaciones de los cambios de datos y luego devolver los datos al cliente cuando cambien.

EDITAR: También recomendaría tener un tiempo de espera en la solicitud. Entonces, si no sucede nada durante unos 2 segundos, un & "; Sin cambios &"; El mensaje se devuelve. De esa forma, el cliente sabe que el servidor sigue vivo y procesa su solicitud.

Dado que esto está etiquetado & # 8220; html5 & # 8221 ;: HTML5 tiene <eventsource> y WebSocket , pero el lado de la implementación todavía está en el futuro en la práctica.

Opera implementó una versión anterior de <event-source> llamada <=>.

El servidor debe participar en esto. Consulte con el proveedor de alojamiento qué módulos están disponibles. O trate de convencerlos de que apoyen al cometa.

Tal vez debería considerar un pequeño servidor privado virtual (VPS) para esto.

Una cosa para agregar a las sugerencias de sondeo largo: si está en un servidor compartido, esta solución tendrá una escalabilidad limitada, ya que cada sondeo largo activo mantendrá una conexión (y un proceso del lado del servidor para atender esa conexión) activo. Lo más probable es que su proveedor tenga límites (ya sea definidos por la política o de facto) en la cantidad de conexiones que puede tener abiertas a la vez, por lo que llegará a un muro si tiene más sesiones / ventanas que las que se están reproduciendo simultáneamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top