セッション


$_SESSION 配列の操作はサポートされておらず、Session クラスのみが使用可能です。

6.0 の Session クラスは、Swoole/Workerman などの環境を十分にサポートできます。

Open Session

Session 機能はデフォルトでは有効になっていません。Seesion を使用する必要がある場合は、グローバル ミドルウェア定義ファイルに次のミドルウェア定義を追加する必要があります。

'think\middleware\SessionInit'

マルチアプリケーション モードで、一部のアプリケーションのみに使用する場合は、アプリケーション ミドルウェア定義ファイルで個別に有効にすることもできます。

セッションの初期化

システムは、session.php で設定されたパラメータに従ってセッションを自動的に初期化します。

デフォルトでサポートされるセッション設定パラメータは次のとおりです:

パラメータ 説明
typesession type
storetype がキャッシュ タイプに設定されている場合のストレージ識別子を指定します
expireセッションの有効期限 (秒) は 0 より大きくなければなりません
var_session_idリクエスト session_id 変数名
namesession_name
prefixセッションプレフィックス
serializeシリアル化方法

Session クラスの関連メソッドを操作なしで直接呼び出すことができます。たとえば、次のようになります。

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

Serialization

セッション データは自動的に作成されます。保存時にシリアル化され、読み取り時に自動的にシリアル化解除されます。シリアル化メカニズムはカスタマイズできます。

たとえば、構成ファイルで JSON シリアル化を使用するように設定します。

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

オブジェクトをセッションに保存しないようにしてください

基本的な使用法

代入

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

存在するかどうか判断

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

値を取得

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

削除

Session::delete('name');

値を取得して削除

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

name の値が存在しない場合は、Null が返されます。

Clear

Session::clear();

Flash データは次のリクエストまで有効です

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

現在のリクエストの有効データを事前にクリアします

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

注データ入力操作はリクエスト終了時にローカルに保存されるため、セッションデータの書き込み後に終了やその他の割り込み操作を使用しないでください。これにより、セッションが正常に書き込まれなくなる可能性があります。

マルチレベル配列

セッションのマルチレベル配列操作をサポートします。例:

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

set メソッドと delete メソッドは 2 つのみサポートします。 -level 配列、その他のメソッドは、任意のレベルの配列操作をサポートします。

アシスタント機能

システムは、同じ機能を完了するためのアシスタント機能セッションも提供します。例:

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

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

// 取值
session('name');

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

// 清除session
session(null);

セッションを読むRequest オブジェクト内

Request オブジェクト内でセッション データを読み取ることができます (設定はサポートされていません)

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

ただし、セッション書き込み操作は Request クラスではサポートされていません。

アプリケーションに依存しないセッション

デフォルトのファイル タイプが使用される場合、複数のアプリケーションのセッション保存パスは同じです。つまり、セッションは複数のアプリケーション間で共有されます。データについては、セッション データを共有したくない場合は、アプリケーションごとに異なるパスまたは異なるプレフィックスを設定できます。

ファイル タイプの場合、デフォルトのセッション データは runtime/session ディレクトリに保存されます。パスを設定して保存パスを変更できます。

他のタイプのドライバーの場合は、異なるアプリケーション セッション データを区別するためにプレフィックス構成パラメーターを設定できます。

セッション ドライバー

デフォルトのセッション ドライバーはファイル キャッシュ記録を使用し、次の構成をサポートします

#パラメータ 説明パスセッション保存パスdata_compressデータを圧縮するかどうかgc_divisorGCリサイクル確率##gc_probabilitygc_maxlifetime

ファイル タイプに加えて、他のセッション タイプもサポートできます。例:

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

は、セッション タイプとして redis を使用することを示します。

上記の構成を有効にするには、キャッシュ構成ファイルcache.phpのストアにredisキャッシュ構成が追加されていることを確認してください。例:

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

現在構築されている-サポートされているタイプには、redis、memcache、memcached が含まれます。

カスタマイズされたドライバー

セッション ドライバーをカスタマイズする必要がある場合、ドライバー クラスは 3 つのメソッドを含む think\contract\SessionHandlerInterface インターフェイスを実装する必要があります。

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

read メソッドは、Session::start() が呼び出されたときに実行され、一度だけ実行されます。
write メソッドは、セッション データをローカライズするときに (Session::save() メソッドを呼び出して) 実行され、システムは各リクエストの終了時に自動的に実行します。
delete メソッドは、セッションが破棄されるときに実行されます (Session::destroy() メソッドを呼び出します)。


GCリサイクル確率
GC リサイクルの最大有効期間