Gestione della sessione
Esempio
<?php
namespace app\controller;
use support\Request;
class UserController
{
public function hello(Request $request)
{
$name = $request->get('nome');
$session = $request->session();
$session->set('nome', $name);
return response('ciao ' . $session->get('nome'));
}
}
Ottieni un'istanza di Workerman\Protocols\Http\Session
tramite $request->session();
e usa i suoi metodi per aggiungere, modificare, eliminare i dati della sessione.
Nota: quando l'oggetto sessione viene distrutto, i dati della sessione vengono automaticamente salvati, quindi non salvare l'oggetto restituito da
$request->session()
in un'array globale o in un membro di classe, in quanto ciò potrebbe impedire il salvataggio della sessione.
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();
$nome = $session->get('nome');
Se i dati non esistono, restituisce null.
È anche possibile passare un valore predefinito come secondo argomento al metodo get. Se l'elemento di sessione corrispondente non viene trovato, verrà restituito il valore predefinito. Ad esempio:
$session = $request->session();
$nome = $session->get('nome', 'tom');
Salvare una sessione
Utilizza il metodo set
per salvare un dato.
$session = $request->session();
$session->set('nome', 'tom');
Il metodo set non restituisce nulla, la sessione viene automaticamente salvata quando l'oggetto sessione viene distrutto.
Quando si salvano più valori, utilizza il metodo put
.
$session = $request->session();
$session->put(['nome' => 'tom', 'età' => 12]);
Anche in questo caso, il metodo put non restituisce nulla.
Eliminare i dati della sessione
Utilizza il metodo forget
per eliminare uno o più dati della sessione.
$session = $request->session();
// Elimina un elemento
$session->forget('nome');
// Elimina più elementi
$session->forget(['nome', 'età']);
Inoltre, è disponibile il metodo delete
, che differisce dal metodo forget
in quanto può eliminare solo un elemento.
$session = $request->session();
// Equivalente a $session->forget('nome');
$session->delete('nome');
Ottenere e cancellare un valore dalla sessione
$session = $request->session();
$nome = $session->pull('nome');
È equivalente al seguente codice:
$session = $request->session();
$valore = $session->get($nome);
$session->delete($nome);
Se la sessione corrispondente non esiste, restituisce null.
Eliminare tutti i dati della sessione
$request->session()->flush();
Il metodo non restituisce nulla, i dati della sessione vengono automaticamente eliminati dallo storage quando l'oggetto sessione viene distrutto.
Verificare se esistono dei dati nella sessione
$session = $request->session();
$esiste = $session->has('nome');
Il metodo restituirà false se la sessione corrispondente non esiste o se il valore associato alla sessione è null, altrimenti restituirà true.
$session = $request->session();
$esiste = $session->exists('nome');
Anche questo metodo serve per verificare l'esistenza dei dati nella sessione, ma se il valore associato all'elemento della sessione è null, restituirà true.
Funzione helper session()
Aggiunto il 09-12-2020
Webman fornisce la funzione helper session()
che offre la stessa funzionalità.
// Ottenere un'istanza della sessione
$session = session();
// Equivalente a
$session = $request->session();
// Ottenere un valore specifico
$valore = session('chiave', 'predefinito');
// Equivalente a
$valore = session()->get('chiave', 'predefinito');
// Equivalente a
$valore = $request->session()->get('chiave', 'predefinito');
// Assegnare un valore alla sessione
session(['chiave1'=>'valore1', 'chiave2' => 'valore2']);
// Equivalente a
session()->put(['chiave1'=>'valore1', 'chiave2' => 'valore2']);
// Equivalente a
$request->session()->put(['chiave1'=>'valore1', 'chiave2' => 'valore2']);
File di configurazione
Il file di configurazione della sessione si trova in config/session.php
e ha un contenuto simile al seguente:
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 una cluster di Redis
'type' => 'file',
// Configurazioni diverse per handler diversi
'config' => [
// Configurazioni per il tipo file
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// Configurazioni per 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 per memorizzare l'ID della sessione
// === Le seguenti configurazioni richiedono webman-framework>=1.3.14 workerman>=4.0.37 ===
'auto_update_timestamp' => false, // Se aggiornare automaticamente la sessione, predefinito a falso
'lifetime' => 7*24*60*60, // Tempo di scadenza della sessione
'cookie_lifetime' => 365*24*60*60, // Tempo di scadenza del cookie per memorizzare l'ID della sessione
'cookie_path' => '/', // Percorso del cookie per l'ID della sessione
'domain' => '', // Dominio del cookie per l'ID della sessione
'http_only' => true, // Abilitare solo HTTP, predefinito abilitato
'secure' => false, // Abilitare la sessione solo in HTTPS, predefinito disabilitato
'same_site' => '', // Prevenire attacchi CSRF e tracciamento dell'utente, valori opzionali: strict/lax/none
'gc_probability' => [1, 1000], // Probabilità di pulizia della sessione
];
Nota
A partire da webman 1.4.0, il namespace di SessionHandler è cambiato da
use Webman\FileSessionHandler;
use Webman\RedisSessionHandler;
use Webman\RedisClusterSessionHandler;
a
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
Configurazione della durata di validità
Quando webman-framework è inferiore alla versione 1.3.14, il tempo di validità della sessione in webman deve essere configurato in php.ini
.
session.gc_maxlifetime = x
session.cookie_lifetime = x
session.gc_probability = 1
session.gc_divisor = 1000
Supponendo che il tempo di validità sia di 1440 secondi, la configurazione sarebbe la seguente
session.gc_maxlifetime = 1440
session.cookie_lifetime = 1440
session.gc_probability = 1
session.gc_divisor = 1000
Nota
Si può utilizzare il comandophp --ini
per trovare la posizione diphp.ini