2012-03-16 13 views
8

Espero poder explicar esto lo suficientemente bien. Estoy trabajando en crear un PHP library to handle ajax requests through PHP de una manera orientada a objetos. Actualmente estoy considerando una buena forma de implementar una solución de votación larga, pero tengo curiosidad por algo.Long Polling con PHP en Apache

Apache no se encarga de mantener las conexiones múltiples abiertas muy bien. El modelo de hilo por solicitud hace que Apache sea altamente ineficiente para largas encuestas. El uso de servidores como nginx y lighttpd manejan estos hilos mucho mejor, así que en la biblioteca, planeo implementar diferentes funciones optimizadas para los servidores específicos disponibles desde una sola llamada a función. En el caso de Apache, que tiene una enorme cuota de mercado para las aplicaciones PHP, necesito una mejor solución.

¿Hay alguna manera de colocar una solicitud entrante en espera/pausa y continuar procesando otras solicitudes hasta que esté listo para reactivarla?

No estoy seguro si eso tiene sentido o si estoy en el camino correcto. ¿Cuál es una posible solución que SO recomienda para largas encuestas en PHP en un servidor Apache?

+0

¿por qué pausar el procesamiento en el servidor? ¿Eso no haría que tu usuario esperara mucho? – Joseph

+0

Con Apache, utiliza un modelo de subproceso por solicitud para que una solicitud de página inicial en una aplicación utilice un subproceso, y luego la solicitud ajax (llamada una vez que se carga el DOM) use un subproceso diferente. El problema es intentar tráfico de alto volumen generará miles de subprocesos y, finalmente, deshabilitará el servidor. –

+0

Tuvimos un problema similar, después de activar ajax/PHP la carga de la página larga de sondeo comenzó aleatoriamente (cca cada 4-5 carga) tomando demasiado tiempo ... por ahora y solo para avisos lo resolví por NOT sleep() en PHP de cualquier manera, y movió la funcionalidad timewait a javascript, por lo que ahora javascript está solicitando una nueva ejecución PHP, por ejemplo 10s pero la carga de la página parece estar bien ahora. –

Respuesta

1

Esto suena como continuaciones. Definitivamente no puedes hacer esto en PHP, de ninguna manera elegante. Si desea hacer esto, su mejor oportunidad sería guardar el estado actual y escribir el código de tal forma que pueda reanudar desde donde lo dejó cuando carga el estado.

+0

Estoy empezando a llegar a la misma conclusión. Creo que voy a implementar una solución básica de encuesta larga y en la documentación/comentarios anotar que no es óptima en ciertos entornos de servidor. De esa manera, si alguien quiere tratar de usarlo, la funcionalidad base ya está allí. –

0

No creo que haya una solución. No puede distinguir una solicitud de votación de una solicitud normal. Solo evite el uso de Apache que podría ayudar (por ejemplo, ejecutar nginx en 80, reenviar todas las solicitudes a Apache en 81, excepto las solicitudes de sondeo).

Tampoco creo que tenga un problema. Nginx u otro servidor no es mucho más eficiente que Apache. El sondeo es una solicitud de PHP, Apache con mod_php es menos o más una buena opción. Nginx no usará menos recursos que Apache para servir PHP.

+4

'Nginx no usará menos recursos que Apache para servir PHP. ¿Está seguro de eso? http://serverfault.com/questions/157520/apache-vs-nginx –

+0

Claro. No leo nada en esa url que indique lo contrario. "mod_php es marginalmente más rápido que php-fpm", "cgi es mucho más lento que mod_php", etc. Por supuesto, todo depende de cuánto haga un sondeo largo frente a archivos PHP normales/archivos estáticos, si tiene un proxy inverso en caché, entonces que a Apache no le molestan los archivos estáticos, cuántos módulos usa en Apache ... – jcisio