webman Session-Verwaltung

Beispiel

<?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'));
    }
}

Über $request->session(); erhalten Sie eine Instanz von Workerman\Protocols\Http\Session und können mit deren Methoden Sitzungsdaten hinzufügen, ändern oder löschen.

Hinweis
Sitzungsdaten werden automatisch gespeichert, wenn das Session-Objekt zerstört wird.
Wird das Session-Objekt in einer globalen Variable gespeichert, verhindert dies die Zerstörung des Objekts und somit die automatische Speicherung. In diesem Fall müssen Sie manuell $session->save() aufrufen.

Alle Sitzungsdaten abrufen

$session = $request->session();
$all = $session->all();

Gibt ein Array zurück. Bei fehlenden Sitzungsdaten wird ein leeres Array zurückgegeben.

Einen Wert aus der Sitzung abrufen

$session = $request->session();
$name = $session->get('name');

Gibt null zurück, wenn die Daten nicht vorhanden sind.

Sie können der get-Methode auch einen Standardwert als zweiten Parameter übergeben. Wird der entsprechende Wert im Sitzungsarray nicht gefunden, wird dieser Standardwert zurückgegeben. Beispiel:

$session = $request->session();
$name = $session->get('name', 'tom');

Sitzungsdaten speichern

Verwenden Sie die set-Methode, um einen einzelnen Datensatz zu speichern.

$session = $request->session();
$session->set('name', 'tom');

Die set-Methode gibt keinen Wert zurück. Die Sitzung wird automatisch gespeichert, wenn das Sitzungsobjekt zerstört wird.

Zum Speichern mehrerer Werte verwenden Sie die put-Methode.

$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);

Auch die put-Methode gibt keinen Wert zurück.

Sitzungsdaten löschen

Verwenden Sie die forget-Methode, um einen oder mehrere Sitzungswerte zu löschen.

$session = $request->session();
// Ein Eintrag löschen
$session->forget('name');
// Mehrere Einträge löschen
$session->forget(['name', 'age']);

Darüber hinaus steht die Methode delete zur Verfügung, die im Gegensatz zu forget nur einen Eintrag löschen kann.

$session = $request->session();
// Entspricht $session->forget('name');
$session->delete('name');

Einen Sitzungswert abrufen und löschen

$session = $request->session();
$name = $session->pull('name');

Entspricht folgendem Code:

$session = $request->session();
$value = $session->get('name');
$session->delete('name');

Gibt null zurück, wenn der Sitzungswert nicht existiert.

Alle Sitzungsdaten löschen

$request->session()->flush();

Gibt keinen Wert zurück. Die Sitzungsdaten werden automatisch aus dem Speicher gelöscht, wenn das Sitzungsobjekt zerstört wird.

Prüfen, ob ein Sitzungswert existiert

$session = $request->session();
$has = $session->has('name');

Gibt false zurück, wenn der Sitzungswert nicht existiert oder null ist; andernfalls true.

$session = $request->session();
$has = $session->exists('name');

Der obige Code prüft ebenfalls, ob ein Sitzungswert existiert. Der Unterschied: exists gibt auch dann true zurück, wenn der Sitzungswert null ist.

Hilfsfunktion session()

webman stellt die Hilfsfunktion session() zur Verfügung, die dieselbe Funktionalität bietet.

// Sitzungsinstanz abrufen
$session = session();
// Entspricht
$session = $request->session();

// Einen Wert abrufen
$value = session('key', 'default');
// Entspricht
$value = session()->get('key', 'default');
// Entspricht
$value = $request->session()->get('key', 'default');

// Werte der Sitzung zuweisen
session(['key1'=>'value1', 'key2' => 'value2']);
// Entspricht
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Entspricht
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

Konfigurationsdatei

Die Sitzungskonfiguration befindet sich in config/session.php. Der Inhalt sieht in etwa so aus:

use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;

return [
    // FileSessionHandler::class oder RedisSessionHandler::class oder RedisClusterSessionHandler::class 
    'handler' => FileSessionHandler::class,

    // Bei FileSessionHandler::class ist der Wert 'file',
    // bei RedisSessionHandler::class ist er 'redis',
    // bei RedisClusterSessionHandler::class ist er 'redis_cluster' (Redis-Cluster)
    'type'    => 'file',

    // Verschiedene Handler verwenden verschiedene Konfigurationen
    'config' => [
        // Konfiguration bei type 'file'
        'file' => [
            'save_path' => runtime_path() . '/sessions',
        ],
        // Konfiguration bei 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', // Cookie-Name zum Speichern der session_id
    'auto_update_timestamp' => false,  // Sitzung automatisch aktualisieren, Standard: aus
    'lifetime' => 7*24*60*60,          // Sitzungsablaufzeit
    'cookie_lifetime' => 365*24*60*60, // Ablaufzeit des Cookies für session_id
    'cookie_path' => '/',              // Cookie-Pfad für session_id
    'domain' => '',                    // Cookie-Domain für session_id
    'http_only' => true,               // httpOnly aktivieren, Standard: an
    'secure' => false,                 // Sitzung nur über HTTPS, Standard: aus
    'same_site' => '',                 // Schutz vor CSRF-Angriffen und Nutzerverfolgung, Optionen: strict/lax/none
    'gc_probability' => [1, 1000],     // Wahrscheinlichkeit der Sitzungsbereinigung
];

Sicherheit

Es wird nicht empfohlen, Klasseninstanzen direkt in der Sitzung zu speichern, insbesondere von Klassen aus nicht vertrauenswürdigen Quellen. Bei der Deserialisierung können Sicherheitsrisiken entstehen.