gestione delle sessioni di webman
Esempi
<?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'));
}
}
Attraverso $request->session();
ottieni un'istanza di Workerman\Protocols\Http\Session
, utilizzando i metodi dell'istanza per aggiungere, modificare o eliminare i dati di sessione.
Attenzione: Quando l'oggetto sessione viene distrutto, i dati di sessione vengono salvati automaticamente, quindi non conservare l'oggetto restituito da
$request->session()
in un array globale o in un membro della classe, altrimenti la sessione non potrà essere salvata.
Ottenere tutti i dati di sessione
$session = $request->session();
$all = $session->all();
Restituisce un array. Se non ci sono dati di sessione, restituisce un array vuoto.
Ottenere un valore specifico dalla sessione
$session = $request->session();
$name = $session->get('name');
Se i dati non esistono, restituisce null.
Puoi anche passare un valore predefinito come secondo parametro al metodo get; se non viene trovato il valore corrispondente nell'array di sessione, verrà restituito il valore predefinito. Ad esempio:
$session = $request->session();
$name = $session->get('name', 'tom');
Memorizzare la sessione
Per memorizzare un dato, usare il metodo set.
$session = $request->session();
$session->set('name', 'tom');
Il metodo set non restituisce un valore; quando l'oggetto sessione viene distrutto, la sessione verrà salvata automaticamente.
Quando si memorizzano più valori, utilizzare il metodo put.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
Anche put non restituisce un valore.
Eliminare i dati di sessione
Per eliminare uno o più dati di sessione, utilizzare il metodo forget
.
$session = $request->session();
// Elimina un elemento
$session->forget('name');
// Elimina più elementi
$session->forget(['name', 'age']);
Inoltre, il sistema fornisce il metodo delete, che si differenzia da forget poiché delete può eliminare solo un elemento.
$session = $request->session();
// Equivalente a $session->forget('name');
$session->delete('name');
Ottenere ed eliminare un valore di sessione
$session = $request->session();
$name = $session->pull('name');
L'effetto è lo stesso del seguente codice:
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Se la sessione corrispondente non esiste, restituisce null.
Eliminare tutti i dati di sessione
$request->session()->flush();
Non restituisce un valore; quando l'oggetto sessione viene distrutto, la sessione verrà automaticamente eliminata dalla memorizzazione.
Controllare se i dati di sessione corrispondenti esistono
$session = $request->session();
$has = $session->has('name');
Restituisce false se la sessione corrispondente non esiste o se il valore della sessione è null, altrimenti restituisce true.
$session = $request->session();
$has = $session->exists('name');
Il codice sopra è anche usato per controllare se i dati di sessione esistono; la differenza è che quando il valore della sessione è null, restituisce comunque true.
Funzione helper session()
Webman fornisce la funzione helper session()
per completare la stessa funzionalità.
// Ottieni l'istanza di sessione
$session = session();
// Equivalente a
$session = $request->session();
// Ottieni un valore specifico
$value = session('key', 'default');
// Equivalente a
$value = session()->get('key', 'default');
// Equivalente a
$value = $request->session()->get('key', 'default');
// Assegna un valore 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
, e il contenuto è simile a questo:
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, ovvero un cluster redis
'type' => 'file',
// I diversi handler utilizzano configurazioni diverse
'config' => [
// Configurazione quando il tipo è file
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// Configurazione quando il tipo è 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 che memorizza session_id
'auto_update_timestamp' => false, // Se 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 che memorizza session_id
'cookie_path' => '/', // Percorso del cookie che memorizza session_id
'domain' => '', // Dominio del cookie che memorizza session_id
'http_only' => true, // Se abilitare httpOnly, predefinito è attivato
'secure' => false, // Attiva la sessione solo su https, predefinito è disattivato
'same_site' => '', // Utilizzato per prevenire attacchi CSRF e tracciamento degli utenti, valori opzionali strict/lax/none
'gc_probability' => [1, 1000], // Probabilità di recuperare la sessione
];
Sicurezza
Quando si utilizza la sessione, non è consigliabile memorizzare direttamente le istanze di classe, specialmente quelle di cui non si ha il controllo, poiché la deserializzazione potrebbe comportare rischi potenziali.