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.