pasar - ¿Las sesiones PHP son difíciles de escalar en un sistema distribuido?
session php (5)
En el trabajo hacemos casi todo en Java y Perl, pero quería construir una característica usando PHP y sesiones. Algunas personas pensaban que era una mala idea tratar de hacer sesiones PHP en nuestro sistema, porque se distribuía a muchos servidores. ¿Cuál sería el problema específico?
lo más fácil es memcached o redis.
aquí está cómo hacerlo en redis, lo estamos usando en este momento: http://redis4you.com/articles.php?id=001&name=Redis+as+session+handler+in+PHP
La respuesta a su pregunta específica, cuál sería el problema, radica en el hecho de que, por defecto, PHP almacena sus sesiones en archivos en el sistema de archivos. Para un servidor web único que sirve solicitudes, esto no es un problema porque los datos de su sesión siempre estarán disponibles. Pero, ¿y si tuviera dos servidores web de carga equilibrada que atendieran las solicitudes?
Imagínese ir al primer servidor web con una solicitud, que crea su archivo de sesión en su sistema de archivos. Luego, su próxima solicitud llega al segundo servidor web. El segundo servidor web, por supuesto, no verá el archivo de sesión. Para el usuario, puede iniciar sesión en un sitio web y luego cerrar la sesión de repente.
Este no es un problema específico de PHP, y es muy común. La solución es almacenar datos de sesión en algún área común. El método más común para esto es almacenar datos de sesión en una base de datos accesible para todos los servidores web, o en algún servidor de memoria caché compartida como memcached.
Las sesiones persistentes en varios servidores (también conocidas como clustering de sesiones) son un problema común para escalar aplicaciones web, y no son específicas de PHP. PHP ofrece varias soluciones para manejarlo, como Zend Platform (servidor de aplicaciones comerciales) y Msession (extensión).
También podría usar un manejador de guardar sesión personalizado:
http://www.php.net/manual/en/function.session-set-save-handler.php
Nunca lo intenté, pero con él defines tus propias funciones de guardar / leer, por lo que puedes implementar una base de datos o un servidor nfs compartido sin la necesidad de instalar extensiones.
También Msession, que fue sugerido por @Eran Galperin, se ve muy interesante como una alternativa a la que mencioné antes.
Una pregunta bastante vaga, pero diría que el problema es más grande que el mencionado en las respuestas. Claro que puede anular cómo cargar y guardar las cookies, pero también tiene un costo. Por ejemplo, tendrá que considerar los siguientes escenarios / preguntas:
- Si está colocando cookies en otro host, ¿cómo afectará esto la velocidad de sus cookies? Eso obviamente depende de cuántas escrituras / lecturas hagas.
- ¿Estás haciendo esto para aumentar la velocidad o tener conmutación por error? La respuesta definitivamente conducirá a diferentes soluciones:
- En caso de que esté haciendo esto para la conmutación por error, ¿cómo se manejará si su servidor web no puede acceder a su tienda de sesión porque el enlace de red se cae? ¿Qué pasa si tu tienda de sesión cae? Deberá resolver esto utilizando algún tipo de replicación maestro-maestra, posiblemente ejecutando ese almacén de sesión distribuido en la misma máquina que el servidor web para una alta disponibilidad adicional (si todas las sesiones pueden caber en la memoria). Eche un vistazo a Riak o similar para la replicación maestro-maestro.
- En caso de que simplemente esté haciendo esto para la velocidad, usaría apache, nginx o (más rápido) haproxy para simplemente equilibrar la carga según la dirección IP del cliente. De esta forma, no tiene que preocuparse por configurar una tienda de sesión distribuida. Claro, si una de sus instancias de PHP falla, sus usuarios perderán sus cookies, pero tal vez eso no sea un problema. Tu decides.