Gestione delle sessioni webman
Esempio
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$name = $request->get('name');
$session = $request->session();
$session->set('name', $name);
return response('hello ' . $session->get('name'));
}
}
Ottieni un'istanza di Workerman\Protocols\Http\Session tramite $request->session(); e usa i suoi metodi per aggiungere, modificare o eliminare i dati della sessione.
Nota
I dati della sessione vengono salvati automaticamente quando l'oggetto sessione viene distrutto.
Se si memorizza l'oggetto sessione in una variabile globale, esso non verrà distrutto e non verrà salvato automaticamente. In tal caso è necessario chiamare manualmente$session->save()per salvare i dati.
Ottenere tutti i dati della sessione
$session = $request->session();
$all = $session->all();
Restituisce un array. Se non ci sono dati di sessione, restituisce un array vuoto.
Ottenere un valore dalla sessione
$session = $request->session();
$name = $session->get('name');
Se i dati non esistono, restituisce null.
È possibile passare un valore predefinito come secondo argomento al metodo get. Se il valore corrispondente non viene trovato nell'array di sessione, viene restituito il valore predefinito. Ad esempio:
$session = $request->session();
$name = $session->get('name', 'tom');
Salvare dati nella sessione
Usa il metodo set per salvare un singolo dato.
$session = $request->session();
$session->set('name', 'tom');
Il metodo set non restituisce nulla. La sessione viene salvata automaticamente quando l'oggetto sessione viene distrutto.
Usa il metodo put per salvare più valori.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Anche il metodo put non restituisce nulla.
Eliminare dati dalla sessione
Usa il metodo forget per eliminare uno o più dati dalla sessione.
$session = $request->session();
// Eliminare un elemento
$session->forget('name');
// Eliminare più elementi
$session->forget(['name', 'age']);
È disponibile anche il metodo delete. A differenza di forget, può eliminare solo un elemento.
$session = $request->session();
// Equivalente a $session->forget('name');
$session->delete('name');
Ottenere e eliminare un valore dalla sessione
$session = $request->session();
$name = $session->pull('name');
È equivalente al seguente codice:
$session = $request->session();
$value = $session->get('name');
$session->delete('name');
Se la sessione corrispondente non esiste, restituisce null.
Eliminare tutti i dati della sessione
$request->session()->flush();
Non restituisce nulla. I dati della sessione vengono eliminati automaticamente dallo storage quando l'oggetto sessione viene distrutto.
Verificare se esiste un valore nella sessione
$session = $request->session();
$has = $session->has('name');
Restituisce false se il valore della sessione non esiste o è null; altrimenti restituisce true.
$session = $request->session();
$has = $session->exists('name');
Il codice sopra verifica anche l'esistenza di un valore nella sessione. La differenza è che exists restituisce true anche quando il valore è null.
Funzione helper session()
webman fornisce la funzione helper session() per le stesse operazioni.
// Ottenere l'istanza della sessione
$session = session();
// Equivalente a
$session = $request->session();
// Ottenere un valore
$value = session('key', 'default');
// Equivalente a
$value = session()->get('key', 'default');
// Equivalente a
$value = $request->session()->get('key', 'default');
// Assegnare valori alla sessione
session(['key1'=>'value1', 'key2' => 'value2']);
// Equivalente a
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Equivalente a
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);
File di configurazione
Il file di configurazione della sessione si trova in config/session.php. Il contenuto è simile a:
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
return [
// FileSessionHandler::class o RedisSessionHandler::class o RedisClusterSessionHandler::class
'handler' => FileSessionHandler::class,
// Se handler è FileSessionHandler::class, il valore è 'file',
// se handler è RedisSessionHandler::class, il valore è 'redis',
// se handler è RedisClusterSessionHandler::class, il valore è 'redis_cluster' (cluster Redis)
'type' => 'file',
// Configurazioni diverse per handler diversi
'config' => [
// Configurazione per type 'file'
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// Configurazione per type 'redis'
'redis' => [
'host' => '127.0.0.1',
'port' => 6379,
'auth' => '',
'timeout' => 2,
'database' => '',
'prefix' => 'redis_session_',
],
'redis_cluster' => [
'host' => ['127.0.0.1:7000', '127.0.0.1:7001', '127.0.0.1:7001'],
'timeout' => 2,
'auth' => '',
'prefix' => 'redis_session_',
]
],
'session_name' => 'PHPSID', // Nome del cookie per memorizzare il session_id
'auto_update_timestamp' => false, // Aggiornare automaticamente la sessione, predefinito: disattivato
'lifetime' => 7*24*60*60, // Tempo di scadenza della sessione
'cookie_lifetime' => 365*24*60*60, // Tempo di scadenza del cookie per il session_id
'cookie_path' => '/', // Percorso del cookie per il session_id
'domain' => '', // Dominio del cookie per il session_id
'http_only' => true, // Abilitare httpOnly, predefinito: abilitato
'secure' => false, // Abilitare la sessione solo su HTTPS, predefinito: disattivato
'same_site' => '', // Prevenire attacchi CSRF e tracciamento utenti, valori: strict/lax/none
'gc_probability' => [1, 1000], // Probabilità di garbage collection della sessione
];
Sicurezza
Non è consigliabile memorizzare direttamente istanze di classi nella sessione, in particolare di classi provenienti da fonti non attendibili. La deserializzazione può introdurre rischi per la sicurezza.