Manejo de sesiones en PHP 7

Las sesiones son un mecanismo interesante en PHP, que nos permite mantener el estado en lo que en general es una comunicación sin estado. Podríamos visualizarlos como una matriz serializada de información por usuario guardada en un archivo. Los usamos para almacenar información específica del usuario en varias páginas. Por defecto, las sesiones se basan en cookies, aunque pueden configurarse para usar el parámetro SID en un navegador.

La versión de cookie de la sesión PHP funciona más o menos de la siguiente manera:

  1. Lea el token de sesión de la cookie.
  2. Cree o abra un archivo existente en el disco.
  3. Bloquee el archivo para escribir.
  4. Lea el contenido del archivo.
  5. Coloque los datos del archivo en la variable global $_SESSION.
  6. Establecer encabezados de almacenamiento en caché.
  7. Devuelva la cookie al cliente.
  8. En cada solicitud de página, repita los pasos 1-7.

La versión SID de la sesión PHP funciona casi de la misma manera, aparte de la parte de cookies. La cookie aquí se reemplaza por el valor SID que empujamos a través de la URL.
El mecanismo de sesión se puede usar para varias cosas, algunas de las cuales incluyen mecanismos de inicio de sesión de usuario, almacenamiento de cachés de datos menores, partes de plantillas, etc. Dependiendo del uso, esto podría plantear la cuestión del tamaño máximo de la sesión.
Por defecto, cuando se ejecuta un script, las sesiones se leen de los archivos en la memoria. Por lo tanto, el tamaño máximo de un archivo de sesión no puede exceder la directiva memory_limit, que por defecto es de 128 megabytes. Podríamos evitar este comportamiento de sesión predeterminado definiendo los manejadores de sesión personalizados. La función session_set_save_handler() nos permite registrar un controlador de sesión personalizado, que debe cumplir con la interfaz SessionHandlerInterface. Con los manejadores de sesión personalizados, podemos alejarnos del mecanismo de archivo para almacenar datos de sesión en la base de datos. El beneficio adicional de esto es una mayor eficiencia de rendimiento, ya que ahora podemos crear entornos PHP escalables detrás de un equilibrador de carga donde todos los nodos de la aplicación se conectan a un servidor de sesión central.

Redis y memcached son dos almacenes de datos que son bastante populares entre Desarrolladores PHP. La plataforma de comercio electrónico Magento 2 admite tanto Redis como memcached para el almacenamiento de sesiones externas.

Si bien el almacenamiento de la sesión desempeña un papel clave en términos de rendimiento, hay algunas directivas de configuración que vale la pena vigilar:

  • session.gc_probability: el valor predeterminado es 1
  • session.gc_divisor: el valor predeterminado es 100
  • gc_maxlifetime: el valor predeterminado es 1.440 segundos (24 minutos)

Las directivas gc_probability y gc_divisor funcionan en conjunto. Su relación (gc_probability/gc_divisor => 1/100 => 1%) define una probabilidad de que el recolector de basura se ejecute en cada llamada session_start(). Una vez que se ejecuta el recolector de basura, el valor de la directiva gc_maxlifetime le dice si algo debe verse como basura y debe limpiarse potencialmente.
Cuando se trata de sitios de alto rendimiento, las sesiones pueden convertirse fácilmente en un cuello de botella.
El ajuste cuidadoso y la selección del almacenamiento de la sesión pueden marcar la diferencia de rendimiento adecuada.

Comparte