Session


ne prend pas en charge le fonctionnement du tableau $_SESSION, seule la classe Session peut être utilisée

La classe Session de 6.0 peut bien prendre en charge des environnements tels que Swoole/Workerman.

Open Session

La fonction Session n'est pas activée par défaut. Si vous devez utiliser Seesion, vous devez ajouter la définition de middleware suivante au fichier de définition de middleware global :

'think\middleware\SessionInit'

S'il s'agit d'un mode multi-application, et vous utilisez simplement Pour certaines applications, il peut également être activé séparément dans le fichier de définition du middleware d'application.

Initialisation de la session

Le système initialisera automatiquement la session en fonction des paramètres configurés dans session.php.

Les paramètres de configuration de session pris en charge par défaut incluent :

Paramètre Description
typesession type
storeSpécifier le stockage lorsque le type est défini sur le type de cache Logo
expirele délai d'expiration de la session (en secondes) doit être supérieur à 0
var_session_idRequest session_id variable name
namesession_name
prefix session prefix
sérialiser séquence Méthode chimique

Vous pouvez appeler directement les méthodes pertinentes de la classe Session sans aucune opération, telles que :

Session::set('name', 'thinkphp');
Session::get('name');

Sérialisation

Les données de session seront automatiquement sérialisées lorsqu'elles sont enregistrées, et automatiquement désérialisées lorsqu'elles sont lues. Définir le mécanisme de sérialisation.

Par exemple, configurez-le pour utiliser la sérialisation JSON dans le fichier de configuration :

'serialize'    =>    ['json_encode', 'json_decode'],

Essayez d'éviter d'enregistrer des objets dans la session

Utilisation de base

Affectation

Session::set('name', 'thinkphp');
// 支持两级赋值
Session::set('user.name', 'thinkphp');

Déterminez s'il existe

Session::has('name');
Session::has('user.name');

Obtenez la valeur

// 如果值不存在,返回null
Session::get('name');
// 如果值不存在,返回空字符串
Session::get('name', '');
// 支持多级
Session::get('user.name');

Delete

Session::delete('name');

Obtenez la valeur et supprimez

// 取值并删除
Session::pull('name');

Si la valeur de name n'existe pas, renvoyez Null.

Effacer

Session::clear();

Données Flash, valables avant la prochaine requête

// 设置session 并且在下一次请求之前有效
Session::flash('name','value');

Effacer à l'avance les données valides pour la requête en cours

// 清除当前请求有效的session
Session::flush();

A noter que l'opération d'écriture des données en Session sera stockée localement à la fin de la requête, alors ne l'utilisez pas. L'utilisation d'opérations d'interruption telles que la sortie après l'écriture des données de session peut empêcher l'écriture de la session normalement.

Tableaux multi-niveaux

Prend en charge les opérations de tableau à plusieurs niveaux de session, telles que :

// 赋值(当前作用域)
Session::set('name.item','thinkphp');
// 判断(当前作用域)是否赋值
Session::has('name.item');
// 取值(当前作用域)
Session::get('name.item');
// 删除(当前作用域)
Session::delete('name.item');

Les méthodes set et delete ne peuvent prendre en charge que les tableaux à deux niveaux, et d'autres méthodes prennent en charge les opérations de tableau à niveaux arbitraires.

Fonction assistant

Le système fournit également la fonction assistant session pour remplir la même fonction, par exemple :

// 赋值
session('name', 'thinkphp');

// 判断是否赋值
session('?name');

// 取值
session('name');

// 删除
session('name', null);

// 清除session
session(null);

Session de lecture dans l'objet Request

Les données de session peuvent être lues dans l'objet Request (le paramètre n'est pas pris en charge )

public function index(Request $request) {
    // 读取某个session数据
    $request->session('user.name', '');
    // 获取全部session数据
    $request->session();
}

Mais les opérations d'écriture de session ne sont pas prises en charge dans la classe Request.

Session indépendante de l'application

Si vous utilisez le type de fichier par défaut, les chemins d'enregistrement de session de plusieurs applications sont les mêmes, ce qui signifie que les données de session sont partagées entre plusieurs applications. Si vous ne souhaitez pas partager les données de session, vous pouvez le faire. peut donner à chaque application un chemin différent ou un préfixe différent.

S'il s'agit du type de fichier, les données de session par défaut sont enregistrées dans le répertoire runtime/session. Vous pouvez définir le chemin pour modifier le chemin de stockage.

S'il s'agit d'un pilote d'autres types, vous pouvez définir le paramètre de configuration du préfixe pour distinguer les différentes données de session d'application.

Pilote de session

Le pilote de session par défaut utilise l'enregistrement du cache de fichiers et prend en charge la configuration suivante

ParamètreDescription
pathchemin de sauvegarde de session
data_compress Que ce soit pour compresser les données
gc_divisorProbabilité de recyclage GC
gc_probabilityProbabilité de recyclage GC
gc_maxlifetime Durée de vie maximale du recyclage GC

En plus des types de fichiers, d'autres types de session peuvent également être pris en charge, tels que :

return [
    'type'       => 'redis',
    'prefix'     => 'think',
    'auto_start' => true,
     // redis主机
    'host'       => '127.0.0.1',
     // redis端口
    'port'       => 6379,
     // 密码
    'password'   => '',
]

signifie utiliser redis comme type de session.

Pour que la configuration ci-dessus prenne effet, veuillez vous assurer que la configuration du cache Redis a été ajoutée aux magasins dans le fichier de configuration du cache cache.php, par exemple :

return [
    'default'    =>    'file',
    'stores'    =>    [
        // 文件缓存
        'file'   =>  [
            // 驱动方式
            'type'   => 'file',
            // 设置不同的缓存保存目录
            'path'   => '../runtime/file/',
        ],  
        // redis缓存
        'redis'   =>  [
            // 驱动方式
            'type'   => 'redis',
            // 服务器地址
            'host'       => '127.0.0.1',
        ],  
    ],
];

Les types actuellement intégrés pris en charge incluent redis, memcache et memcaché.

Pilote personnalisé

Si vous devez personnaliser le pilote de session, votre classe de pilote doit implémenter l'interface thinkcontractSessionHandlerInterface, qui contient trois méthodes.

interface SessionHandlerInterface
{
    public function read(string $sessionId): string;
    public function delete(string $sessionId): bool;
    public function write(string $sessionId, string $data): bool;
}

La méthode read est exécutée lorsque Session::start() est appelée et ne sera exécutée qu'une seule fois.
La méthode d'écriture est exécutée lors de la localisation des données de session (appel de la méthode Session::save()), et le système l'exécutera automatiquement à la fin de chaque requête.
La méthode delete est exécutée lorsque la session est détruite (appel de la méthode Session::destroy()).