Gestion de session Webman
Exemple
<?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'));
}
}
Obtenez une instance de Workerman\Protocols\Http\Session
via $request->session();
, et utilisez les méthodes de l'instance pour ajouter, modifier ou supprimer des données de session.
Attention : Lorsque l'objet de session est détruit, les données de session sont automatiquement sauvegardées. Ne conservez donc pas l'objet retourné par
$request->session()
dans un tableau global ou un membre de classe, cela pourrait empêcher la sauvegarde de la session.
Obtenir toutes les données de session
$session = $request->session();
$all = $session->all();
Le résultat est un tableau. Si aucune donnée de session n'existe, un tableau vide sera retourné.
Obtenir une valeur de la session
$session = $request->session();
$name = $session->get('name');
Si les données n'existent pas, null
sera renvoyé.
Vous pouvez également passer une valeur par défaut comme deuxième paramètre à la méthode get
. Si aucune valeur correspondante n'est trouvée dans le tableau de session, la valeur par défaut sera renvoyée. Par exemple :
$session = $request->session();
$name = $session->get('name', 'tom');
Stocker une session
Pour stocker une donnée, utilisez la méthode set
.
$session = $request->session();
$session->set('name', 'tom');
La méthode set
ne renvoie aucune valeur, les données de session seront automatiquement sauvegardées lorsque l'objet de session sera détruit.
Lors du stockage de plusieurs valeurs, utilisez la méthode put
.
$session = $request->session();
$session->put(['name' => 'tom', 'age' => 12]);
De même, put
ne renvoie pas de valeur.
Supprimer des données de session
Pour supprimer une ou plusieurs données de session, utilisez la méthode forget
.
$session = $request->session();
// Supprimer une valeur
$session->forget('name');
// Supprimer plusieurs valeurs
$session->forget(['name', 'age']);
De plus, le système propose la méthode delete
, qui diffère de forget
en ce sens que delete
ne peut supprimer qu'une seule valeur.
$session = $request->session();
// Équivalent à $session->forget('name');
$session->delete('name');
Obtenir et supprimer une valeur de la session
$session = $request->session();
$name = $session->pull('name');
L'effet est identique au code suivant :
$session = $request->session();
$value = $session->get($name);
$session->delete($name);
Si la session correspondante n'existe pas, null
sera renvoyé.
Supprimer toutes les données de session
$request->session()->flush();
Aucune valeur n'est renvoyée, et les données de session seront automatiquement supprimées du stockage lorsque l'objet de session sera détruit.
Vérifier si des données de session existent
$session = $request->session();
$has = $session->has('name');
Le code ci-dessus retournera false
si la session correspondante n'existe pas ou si la valeur de la session est null
, sinon true
.
$session = $request->session();
$has = $session->exists('name');
Le code ci-dessus sert également à vérifier si des données de session existent, la différence étant que si la valeur de la session correspondante est null
, cela renverra également true
.
Fonction d'assistance session()
Webman propose la fonction d'assistance session()
pour effectuer les mêmes opérations.
// Obtenir une instance de session
$session = session();
// Équivalent à
$session = $request->session();
// Obtenir une valeur
$value = session('key', 'default');
// Équivalent à
$value = session()->get('key', 'default');
// Équivalent à
$value = $request->session()->get('key', 'default');
// Affecter des valeurs à la session
session(['key1'=>'value1', 'key2' => 'value2']);
// Équivalent à
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Équivalent à
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);
Fichier de configuration
Le fichier de configuration de la session se trouve dans config/session.php
, son contenu ressemble à ceci :
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;
return [
// FileSessionHandler::class ou RedisSessionHandler::class ou RedisClusterSessionHandler::class
'handler' => FileSessionHandler::class,
// Si le handler est FileSessionHandler::class, la valeur est 'file',
// Si le handler est RedisSessionHandler::class, la valeur est 'redis'
// Si le handler est RedisClusterSessionHandler::class, la valeur est 'redis_cluster' pour une collecte redis
'type' => 'file',
// Différents handlers utilisent différentes configurations
'config' => [
// Configuration lorsque le type est 'file'
'file' => [
'save_path' => runtime_path() . '/sessions',
],
// Configuration lorsque le type est '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', // Nom du cookie stockant l'identifiant de session
'auto_update_timestamp' => false, // Mise à jour automatique de la session, désactivée par défaut
'lifetime' => 7*24*60*60, // Durée d'expiration de la session
'cookie_lifetime' => 365*24*60*60, // Durée de vie du cookie stockant l'identifiant de session
'cookie_path' => '/', // Chemin du cookie stockant l'identifiant de session
'domain' => '', // Domaine du cookie stockant l'identifiant de session
'http_only' => true, // Activation de httpOnly, activée par défaut
'secure' => false, // Activation de session uniquement en https, désactivée par défaut
'same_site' => '', // Utilisé pour prévenir les attaques CSRF et le suivi des utilisateurs, valeurs optionnelles : strict/lax/none
'gc_probability' => [1, 1000], // Probabilité de récupération de session
];
Sécurité
Lorsque vous utilisez des sessions, il est déconseillé de stocker directement des instances d'objets de classe, en particulier des instances d'objets de classe dont l'origine est incontrôlable, car la désérialisation peut entraîner des risques potentiels.