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?¿Las sesiones de PHP son difíciles de escalar en un sistema distribuido?
Respuesta
La respuesta a su pregunta específica, cuál sería el problema, radica en el hecho de que PHP almacena por defecto 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 presionar el 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.
Esto 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 el Zend Platform (servidor de aplicaciones comerciales) y el Msession (extensión).
También es posible usar una sesión de Reserva de encargo manejador:
http://www.php.net/manual/en/function.session-set-save-handler.php
yo no he probado, pero con ella se defina su propio guardar/leer funciones, por lo que se puede implementar una base de datos o un backend nfs compartido sin la necesidad de instalar ninguna extensión.
También Msession, que fue sugerido por @Eran Galperin, se ve muy interesante como una alternativa a la que mencioné antes.
Esta es una gran respuesta, y me va a utilizar este enfoque. ¡Gracias! – woody121
Bastante una pregunta 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 las cookies en otro host, ¿cómo afectará esto la velocidad de sus cookies? Eso obviamente depende de cuántas escrituras/lecturas hagas.
- ¿Está haciendo esto para aumentar la velocidad o tener una conmutación por error? La respuesta definitivamente dará lugar a soluciones diferentes:
- En caso de que esté haciendo esto para la conmutación por error, ¿cómo 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.
más fácil es memcached o Redis.
aquí es cómo hacerlo en Redis - lo estamos usando en la actualidad http://redis4you.com/articles.php?id=001&name=Redis+as+session+handler+in+PHP
- 1. ¿Cuáles son los riesgos de las sesiones de PHP?
- 2. ¿Qué tan seguras son las sesiones de PHP?
- 3. Sistema distribuido Java
- 4. Sistema de inicio de sesión (PHP) Cookies y sesiones
- 5. Marcos de prueba de integración para probar un sistema distribuido?
- 6. Marco de Java para el sistema distribuido
- 7. Compilar programas en sistema multinúcleo o distribuido
- 8. Necesito un sistema de búsqueda de valor-clave distribuido
- 9. Sistema de archivos distribuido para .NET
- 10. ¿Cuáles son los mejores documentos para aprender sobre algoritmos para comunicar actualizaciones en un sistema distribuido?
- 11. Las sesiones de PHP caducan demasiado pronto
- 12. ¿Los raíles son difíciles de entender para un desarrollador de PHP?
- 13. ¿Las sesiones de PHP establecen cookies?
- 14. ¿Qué son las sesiones sin cookies?
- 15. Crear errores de red para probar un sistema distribuido
- 16. php: sesiones basadas en cookies
- 17. ¿Qué algoritmos son difíciles de implementar en los lenguajes funcionales?
- 18. ¿Sistema de control de versión distribuido e integrable en Java?
- 19. ¿Es correcto mi entendimiento de las sesiones de PHP?
- 20. sesiones CodeIgniter vs sesiones de PHP
- 21. No se establecen las sesiones PHP
- 22. Sesiones PHP con HTML
- 23. ¿Manera correcta de administrar sesiones en PHP?
- 24. algunas preguntas acerca de las sesiones de PHP
- 25. Sesiones compartidas de PHP en el dominio
- 26. ¿Puedes cambiar las sesiones de PHP en una sesión?
- 27. tratando de forma segura las "sesiones" del cliente en PHP
- 28. Los lenguajes de programación para el sistema distribuido
- 29. Sesiones PHP de dominio cruzado
- 30. ¿Las sesiones son modificables por el cliente/usuario?
Como @azkotoki menciona a continuación, una partición compartida como una montura NFS respaldada por NAS también funciona bien. Lo bueno de esto es que no implica cambios de código. Simplemente enlace simbólico el directorio de la sesión local a NFS. – gerard
, pero ¿y si los dominios están en centros de datos separados? – Dannyboy