PHP sessioni · 2 min read · Dec 27, 2025
I dati della sessione PHP non vengono eliminati quando si utilizza la gestione personalizzata delle sessioni su debian (e ubuntu)
Nei sistemi debian (per quanto ne so, questo vale anche per ubuntu) il garbage collector per le sessioni PHP è disabilitato per impostazione predefinita.
L’impostazione corrispondente in php.ini è session.gc_probability = 0 che abilita il garbage collector quando impostato su un valore maggiore di zero. Il valore predefinito in PHP è 1, quindi il garbage collector viene chiamato con una probabilità di 1/100 ad ogni chiamata di script PHP.
Nei sistemi debian questa impostazione è disabilitata a causa del fatto che il percorso predefinito per la memorizzazione delle sessioni non è scrivibile per il processo del server web (e non dovrebbe esserlo). L’eliminazione dei file di sessione scaduti viene eseguita da un cron job di sistema qui.
Di seguito un estratto da php.ini:
; Questo è disabilitato nei pacchetti Debian, a causa delle autorizzazioni rigorose
; su /var/lib/php5. Invece di impostare questo qui, vedere il cronjob a
; /etc/cron.d/php5, che utilizza l'impostazione session.gc_maxlifetime qui sotto.
; Gli script php che utilizzano il proprio session.save_path dovrebbero assicurarsi che il garbage
; collection sia abilitato impostando session.gc_probability
;session.gc_probability = 0Poiché questa impostazione è corretta per gli script che utilizzano la gestione delle sessioni PHP predefinita (file), ciò può portare a problemi quando si utilizza la propria gestione delle sessioni che definisce le proprie routine per la lettura e la scrittura delle sessioni utilizzando session_save_handler(). Queste classi di gestione delle sessioni forniranno anche una propria funzione per il garbage collector, nella maggior parte dei casi.
Il problema è che questa funzione del garbage collector non verrà mai chiamata su un sistema debian con l’impostazione php.ini sopra menzionata. Questo è cruciale, quando i dati della sessione sono memorizzati in un database MySQL di tipo MEMORY. Questa tabella è limitata in dimensione dal valore di configurazione MySQL max_heap_table_size. Se questa dimensione viene raggiunta, tutte le ulteriori scritture di sessione falliranno e con esse probabilmente il sito web smetterà di funzionare correttamente.
Sapendo questo, è davvero importante sovrascrivere l’impostazione php.ini per la raccolta dei rifiuti nella propria classe di gestione delle sessioni. Mostrerò questo con un piccolo esempio di una classe di gestione delle sessioni (senza scrittura/lettura reale):
class session {
function __destruct() {
session_write_close();
}
function __construct() {
@ini_set("session.use_trans_sid","0");
@ini_set('session.gc_probability', 1); // in debian questo è disabilitato per impostazione predefinita...
// abilita funzioni di gestione delle sessioni personalizzate
session_set_save_handler(array(&$this,"_sess_open"),
array(&$this,"_sess_close"),
array(&$this,"_sess_read"),
array(&$this,"_sess_write"),
array(&$this,"_sess_destroy"),
array(&$this,"_sess_gc"));
@session_start();
}
// dichiara funzioni di gestione delle sessioni definite dall'utente
function _sess_open($sSavePath, $sSessionName) {
return true;
}
function _sess_close() {
return true;
}
function _sess_read($sKey) {
// leggi e restituisci valore
}
function _sess_write($sKey, $val) {
// scrivi nuovo valore
}
function _sess_destroy($sKey) {
// distruggi sessione
}
function _sess_gc($iMaxLifeTime) {
// elimina sessioni vecchie (dal db)
}
}
$mySession = new session();La cosa importante è la chiamata di @ini_set(‘session.gc_probability’, 1) all’interno del costruttore. Dopo questo, la raccolta dei rifiuti della sessione dovrebbe funzionare come previsto, anche sui sistemi debian con la propria classe di gestione delle sessioni.
Ricevi i nuovi post nella tua casella di posta.
Nessuno spam. Disiscriviti in qualsiasi momento.