¿Hay alguna manera de ejecutar una función cuando las sesiones se destruyen por tiempo de espera o cierre del navegador?
Sí, pero puede que no funcione de la forma en que te imaginas. Puede definir su propio manejador de sesión personalizado usando session_set_save_handler
, y parte de la definición suministra las funciones de devolución de llamada destroy
y gc
. Estos dos se invocan cuando una sesión se destruye explícitamente y cuando se destruye debido a que han caducado, por lo que hacen exactamente lo que usted solicita.
Sin embargo, la caducidad de la sesión debido al tiempo de espera no no ocurre con precisión de reloj; puede pasar mucho tiempo antes de que una sesión expirada sea realmente "recogida de basura". Además, la recolección de basura desencadena probabilistically por lo que en teoría existe la posibilidad de que las sesiones expiradas nunca sean basura recolectada.
¿Eso es sensato? Son un par de cientos de consultas SQL concurrentes que van a ser un problema para un servidor compartido y la idea de utilizar $ _SESSION como un búfer va a aliviar algo de esto.
Realmente no haría esto por varias razones:
- optimización prematura (antes de medir, no simplemente asumir que será "mejor").
- Es posible que la sesión nunca se recolecte basura; incluso si esto no sucede, no controla cuando se recopilan. Esto podría ser un problema.
- Existe la posibilidad de perder todo lo que contiene una sesión (por ejemplo, reinicios del servidor), que incluye el progreso del reproductor. A los jugadores no les gusta perder el progreso.
- Sesiones concurrentes para el mismo usuario serían imposibles (¿quién gana y permanece en la base de datos los "datos guardados"?).
¿Qué pasa con las alternativas?
Bueno, como estamos hablando del alojamiento compartido el cheapo, definitivamente no vas a tener el control del servidor, por lo que todo lo que involucre extensiones PHP (por ejemplo, memcached) es condicional. El almacenamiento en caché del lado de la base de datos tampoco va a volar. Además, la carga en su servidor se verá afectada por variables que están fuera de su control, por lo que no puede hacer ninguna planificación de capacidad.
En cualquier caso, comenzaré asegurándome de que la base de datos está estructurada de manera óptima y que el código está escrito de forma que minimice la carga en la base de datos (rendimiento gratuito simplemente escribiendo cosas en un editor).
Después de eso, puede introducir caché de solo lectura: generalmente hay muchas cosas que debe mostrar pero no tiene la intención de modificar. Para los datos que "casi nunca" se actualizan, un caché de sesión que invalide siempre que lo necesite podría ser una mejora fácil y muy efectiva (incluso puede tener falsos positivos con respecto a la invalidación, siempre que no sean demasiados en el gran plan de cosas).
Finalmente, puede agregar caché por solicitud (en variables) si le preocupa extraer los mismos datos de la base de datos dos veces durante una sola solicitud.
Memcache es definitivamente el camino a seguir, itll aligerar los mocasines más que la sesión de almacenamiento/escritura. – gorelative
No optimice hasta que sepa que tiene un problema. Para el momento en que tenga suficiente carga como para que esto sea un problema, su servidor lo habrá movido a su propio servidor dedicado de todos modos. –
De acuerdo. Voy a desechar esa idea entonces. ¡Gracias amigos! – Ryan