HOWTO · PHP

Imposta il timeout della sessione in PHP

Questo tutorial spiega come implementare un timeout di inattività di 30 minuti per una sessione PHP monitorando il tempo trascorso dall’ultima richiesta.

In questa pagina

PHP non fa scadere automaticamente una sessione dell’applicazione dopo un periodo di inattività scelto. Per applicare un timeout di 30 minuti, salva in $_SESSION l’ora dell’ultima richiesta, confrontala con l’ora corrente a ogni richiesta e intervieni quando la differenza raggiunge o supera 1.800 secondi. Il timeout viene rilevato alla richiesta successiva al periodo di inattività: il server non può agire nel momento esatto in cui il browser smette di inviare richieste.

Come monitorare il timeout di una sessione PHP

Chiama session_start() prima di leggere o modificare $_SESSION. Alla prima richiesta non è ancora stato salvato l’orario dell’attività, quindi inizializzalo. Nelle richieste successive, confronta l’orario salvato con time(). Se il limite di 1.800 secondi è stato raggiunto, cancella i dati della sessione e termina la richiesta; altrimenti aggiorna l’orario dell’attività, facendo ripartire il periodo di 30 minuti.

Esegui questo esempio:

Il codice e le etichette o gli output visibili in questa sezione restano in inglese.

<?php
session_start();

$timeoutSeconds = 30 * 60;
$now = time();

if (isset($_SESSION['last_activity']) &&
    $now - $_SESSION['last_activity'] >= $timeoutSeconds) {
    session_unset();
    session_destroy();
    echo "Session expired" . PHP_EOL;
    exit;
}

$_SESSION['last_activity'] = $now;
echo "Session active" . PHP_EOL;
Session active

La prima richiesta inizializza last_activity e segue il percorso attivo. Ogni richiesta successiva controlla il timestamp precedente prima di aggiornarlo. L’evidenza di esecuzione fornita riporta il testo inglese Session active con codice di uscita 0 per il percorso attivo. Non documenta l’esecuzione del percorso di scadenza. Nell’applicazione, esegui questo controllo dopo session_start() e prima delle operazioni protette, così una richiesta scaduta non viene elaborata come autenticata.

Distruggere una sessione dopo 30 minuti di inattività

Quando il timeout è scaduto, l’esempio usa sia session_unset() sia session_destroy(). session_unset() rimuove le variabili della sessione corrente, mentre session_destroy() elimina i dati della sessione memorizzati dal gestore attivo. La distruzione dei dati sul server non rimuove da sola il cookie di sessione dal browser. Se l’applicazione deve far scadere anche quel cookie, deve inviarne uno scaduto usando le stesse impostazioni di nome, percorso e dominio; la gestione dei cookie dipende dalla configurazione della sessione dell’applicazione.

Questo è un timeout a livello applicativo: viene applicato solo quando una richiesta raggiunge il codice che esegue il controllo. Le impostazioni di durata della memorizzazione delle sessioni di PHP regolano la pulizia dei dati memorizzati e sono separate da questa regola di inattività verificata a ogni richiesta. Consulta il Manuale PHP per session_unset() e le opzioni di configurazione delle sessioni.

Rimuovere una variabile di sessione con unset()

Usa unset($_SESSION['cart']) per rimuovere una voce mantenendo disponibili le altre voci della sessione. È adatto quando un utente rimuove uno specifico dato, per esempio un carrello, senza terminare l’intera sessione. Da solo non implementa un timeout per inattività. Per un gruppo di valori correlati, memorizzali sotto una chiave dell’array e rimuovi solo quella chiave con unset($_SESSION['account_state']); non sostituire l’array con un timestamp se il controllo del timeout successivo si aspetta un elemento registered.

Il superglobale $_SESSION è disponibile dopo session_start(). Consulta il Manuale PHP per $_SESSION.

Rigenerare l’ID di sessione separatamente dalla gestione del timeout

session_regenerate_id() sostituisce l’identificatore della sessione corrente; non misura l’inattività, non distrugge i dati della sessione e non obbliga automaticamente l’utente ad accedere di nuovo. Usalo per applicare una regola di rotazione dell’identificatore in un momento appropriato del flusso di autenticazione dell’applicazione, separatamente dal controllo del timeout. La conservazione dei vecchi dati della sessione dipende dalle opzioni della funzione e dalla gestione della sessione: la sola rigenerazione non equivale a un logout e non dimostra che un identificatore precedente sia inutilizzabile.

La funzione session_id() legge l’identificatore corrente, mentre session_start() riprende la sessione associata alla richiesta. Per i dettagli, consulta il Manuale PHP per session_regenerate_id() e la funzione session_id().