Utilizzi effettivamente sessioni per archiviare dati per utenti non autenticati oppure stai chiamando session_start()
su ogni caricamento di pagina? In tal caso, basta interrompere l'inizializzazione delle sessioni per ogni visitatore e farlo solo quando un utente effettua effettivamente il login.
Avvia una sessione solo se ne esiste già una:
if (session_status() === PHP_SESSION_ACTIVE) {
session_start();
}
Avvia sessione all'accesso:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if ($_POST['username'] == 'foo' && $_POST['password'] == 'bar') {
session_start();
$_SESSION['username'] = $_POST['username'];
}
}
Tuttavia, se in effetti memorizzi i dati di sessione anche per visitatori non autenticati, diventa un po 'più complicato. Non puoi semplicemente impostare un TTL personalizzato per le singole sessioni. È possibile modificare la durata della sessione in modo che vari giorni o settimane, ma ciò potrebbe far sì che PHP conservi i dati della sessione lato server per lo stesso periodo di tempo.
La tua preoccupazione su milioni di sessioni attive è comprensibile, ma l'impatto effettivo sul tuo server dipende interamente da come hai configurato PHP per gestire le sessioni. Per impostazione predefinita, le sessioni vengono archiviate sul file system del server in una directory temporanea. Poiché i file di sessione sono minuscoli (presupponendo che non si stia facendo qualcosa di orribile come memorizzare i dati BLOB in essi contenuti) , non è probabile che tu utilizzi una quantità significativa di spazio su disco per le sessioni utente per lunghi periodi di tempo.
Tuttavia, se il tuo sito ha un traffico costante e intenso, l'I / O del disco bloccherà il tuo server in sottomissione. In questo caso, penserei all'utilizzo di memcache o redis come motore di sessione, al fine di facilitare il carico sul disco rigido del mio server. Ma non vuoi che i dati di sessione restino nella memoria fisica del server per molto tempo, quindi imposta il TTL su qualcosa di relativamente breve come 1800 (secondi).
Ora arriva la parte difficile: le sessioni persistenti a lungo termine ...
Quando un utente effettua l'accesso, è possibile inviare loro un cookie personalizzato contenente il proprio ID di sessione e con un TTL molto più lungo (o del tutto assente). Quindi, crea una voce di database o scrivi un file "temp" contenente la sessione di serialize()
e indicizzato dall'ID di sessione. È necessario mantenere questa voce db o il file temporaneo sincronizzati con la sessione mentre l'utente è attivo, ma una volta lasciati e la sessione in memoria scade, i dati della sessione rimangono sul disco fisso. Quando ritornano, giorni o settimane dopo, puoi leggere il loro valore del cookie, recuperare la sessione serializzata dal database o dal file temporaneo, reinizializzare la sessione dell'utente con l'ID originale e unserialize()
i dati della sessione in $_SESSION
.
NOTE IMPORTANTI: Dovresti implementare alcune misure per impedire il furto di sessioni, come confrontare l'indirizzo IP e / o l'agente utente (browser) del visitatore con i loro valori al login. Dovresti anche avere una sorta di cron job per cancellare i dati di sessione stagnanti dalla tua directory db o temp dopo un certo lasso di tempo, altrimenti diventerebbe sempre più grande.