¿Cómo puedo hacer que una sesión PHP caduque al cerrar la pestaña del navegador?

Esto se ha pedido un millón de veces en el desbordamiento de pila. FWIW, se me ocurrió la idea de un sitio web bancario que lo desconectaría agregando un detector de eventos para que se descargue la ventana y luego haciendo una solicitud xmlhttp para cerrar la sesión del usuario. He hecho lo mismo aquí, aunque en jQuery en lugar de js sin formato. puede ver aquí que escuchamos los eventos y, si la descarga sigue siendo falsa, llamamos al servidor para cerrar la sesión del usuario.
Aquí está el código:

  var descargado = falso;
 $ (ventana) .on ('beforeunload', descarga);
 $ (ventana) .on ('descargar', descargar);	 
 función de descarga () {		
	 si (! descargado) {
		 $ ('cuerpo'). css ('cursor', 'esperar');
		 $ .ajax ({
			 tipo: 'obtener',
			 asíncrono: falso
			 url: window.location.origin + '/ logout',
			 éxito: función () { 
				 descargado = verdadero; 
				 $ ('cuerpo'). css ('cursor', 'predeterminado');
			 },
			 tiempo de espera: 5000
		 });
	 }
 }

Para comprender este código, debe leer mi respuesta completa en stackoverflow:
Página en stackoverflow.com

Una sesión PHP es una referencia basada en cookies para un usuario determinado. Usted almacena una cookie en la computadora del usuario que la identifica como X, luego guarda la información como esa X. Esto es valioso si, por ejemplo, un usuario cierra su navegador o va a una dirección IP diferente. Si desea que pierdan sesión sin un navegador, puede enviar información junto con la página; una vez que cierren la pestaña o la página, simplemente morirá con ellos.

De lo contrario, si desea mantener las sesiones en la mezcla, solo cronometralas y actualícelas; si un usuario no navega en ningún lugar dentro de, digamos, 10 minutos, puede ir desde allí. La caducidad de la sesión es fácil, algo así como

  if (isset ($ _ SESSION ["LAST_ACTIVITY"]) && (time () - $ _SESSION ["LAST_ACTIVITY"]> [tiempo en segundos que desea caducar])) {
     session_destroy ();  
     session_unset ();  
 }
 $ _SESSION ['LAST_ACTIVITY'] = tiempo ();  // actualizar la marca de tiempo de la última actividad 

en la parte superior de tu archivo compartido.

También podría usar JavaScript para detectar que cierran la pestaña. Esto es un poco complicado, ya que algunos navegadores usan “window.onbeforeunload”, mientras que otros tienen indicadores diferentes. Desearía probar esto en sus navegadores de destino antes de ponerlo en funcionamiento. .

La sesión caduca cuando desaparece la cookie de sesión y eso no sucede hasta que el navegador se cierra por completo.

De lo contrario, el usuario podría tener problemas para moverse de una página a otra en otra pestaña y luego a una nueva ventana del navegador. Al igual que algunos sistemas de pago, cambie a una nueva ventana para aceptar pagos … o ‘descargar’ páginas … editar páginas de perfil … etc.

Por lo tanto, no desea que las pestañas o las ventanas individuales abandonen la sesión, por lo que la cookie debe persistir hasta que el navegador se cierre por completo.

Dicho todo esto, probablemente hay una manera de hacer esto en la página misma usando JavaScript o algo para solicitar una cookie para reemplazar la cookie de la sesión actual.

Si realmente necesitaras hacer esto, ahí es donde comenzaría a buscar.

Puede usar JQUERY y AJAX para lograr esto. Pero esto también cerrará sesión si hace clic en un enlace o presiona el botón hacia adelante y hacia atrás. No estoy seguro, pero también puede hacer esto en la página de actualización.

  window.addEventListener ("beforeunload", función (e) {        
       $ .ajax ({
           tipo: "POST",
           url: logout_url_here,        
       });
       regreso;
     });

Aunque todavía no lo he probado, siento que no será una tarea importante.
Tenemos una gran cosa de JQuery que podemos usar para rastrear si la pestaña se está cerrando o no y enviar una solicitud ajax que contiene el estado de la sesión si la sesión persiste y luego destruirla.