Quản lý phiên

Ví dụ

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

Sử dụng $request->session(); để nhận được một thể hiện của Workerman\Protocols\Http\Session, từ đó có thể sử dụng các phương thức của thể hiện này để thêm, sửa đổi, xóa dữ liệu phiên.

Lưu ý: Khi thể hiện của phiên bị hủy, dữ liệu phiên sẽ tự động lưu, nên không nên lưu thể hiện trả về từ $request->session() vào mảng toàn cục hoặc thành viên lớp để tránh việc dữ liệu phiên không được lưu.

Lấy tất cả dữ liệu phiên

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

Trả về một mảng. Nếu không có dữ liệu phiên nào, sẽ trả về một mảng rỗng.

Lấy giá trị của một phiên

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

Nếu dữ liệu không tồn tại, sẽ trả về null.

Cũng có thể truyền giá trị mặc định làm tham số thứ hai cho phương thức get, nếu không tìm thấy giá trị tương ứng trong mảng phiên, sẽ trả về giá trị mặc định. Ví dụ:

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

Lưu trữ phiên

Sử dụng phương thức set để lưu trữ một dữ liệu.

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

Phương thức set không trả về giá trị, dữ liệu phiên sẽ tự động lưu khi thể hiện phiên bị hủy.

Khi lưu trữ nhiều giá trị, sử dụng phương thức put.

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

Tương tự, phương thức put cũng không trả về giá trị.

Xóa dữ liệu phiên

Để xóa một hoặc một số dữ liệu phiên, sử dụng phương thức forget.

$session = $request->session();
// Xóa một mục
$session->forget('name');
// Xóa nhiều mục
$session->forget(['name', 'age']);

Ngoài ra, hệ thống cung cấp phương thức delete, khác biệt so với phương thức forget ở chỗ là phương thức delete chỉ có thể xóa một mục.

$session = $request->session();
// Tương đương với $session->forget('name');
$session->delete('name');

Lấy và xóa giá trị phiên

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

Hiệu quả tương tự như đoạn mã sau

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

Nếu mục phiên tương ứng không tồn tại, sẽ trả về null.

Xóa tất cả dữ liệu phiên

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

Không trả về giá trị, dữ liệu phiên sẽ tự động xóa khỏi lưu trữ khi thể hiện phiên bị hủy.

Kiểm tra xem dữ liệu phiên tương ứng có tồn tại không

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

Khi dữ liệu phiên tương ứng không tồn tại hoặc giá trị phiên tương ứng là null, sẽ trả về false, ngược lại trả về true.

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

Đoạn mã trên cũng được sử dụng để kiểm tra sự tồn tại của dữ liệu phiên, khác biệt duy nhất là khi giá trị mục phiên tương ứng là null, cũng sẽ trả về true.

Hàm trợ giúp session()

Ngày 09-12-2020 Thêm mới

webman cung cấp hàm trợ giúp session() để thực hiện chức năng tương tự.

// Lấy thể hiện phiên
$session = session();
// Tương đương với
$session = $request->session();

// Lấy một giá trị
$value = session('key', 'default');
// Tương đương với
$value = session()->get('key', 'default');
// Tương đương với
$value = $request->session()->get('key', 'default');

// Gán giá trị cho phiên
session(['key1'=>'value1', 'key2' => 'value2']);
// Tương đương với
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Tương đương với
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

Tập tin cấu hình

Tập tin cấu hình session nằm trong config/session.php, nội dung tương tự như sau:

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

return [
    // FileSessionHandler::class hoặc RedisSessionHandler::class hoặc RedisClusterSessionHandler::class
    'handler' => FileSessionHandler::class,

    // handler là FileSessionHandler::class thì giá trị là file,
    // handler là RedisSessionHandler::class thì giá trị là redis
    // handler là RedisClusterSessionHandler::class thì giá trị là redis_cluster tức là cụm redis
    'type'    => 'file',

    // Sử dụng cấu hình khác nhau cho từng handler
    'config' => [
        // Cấu hình cho type là file
        'file' => [
            'save_path' => runtime_path() . '/sessions',
        ],
        // Cấu hình cho type là 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', // Tên cookie để lưu trữ session_id

    // === Cấu hình dưới đây yêu cầu webman-framework>=1.3.14 workerman>=4.0.37 ===
    'auto_update_timestamp' => false,  // Có tự động làm mới session hay không, mặc định là tắt
    'lifetime' => 7*24*60*60,          // Thời gian hết hạn của session
    'cookie_lifetime' => 365*24*60*60, // Thời gian hết hạn của cookie chứa session_id
    'cookie_path' => '/',              // Đường dẫn của cookie chứa session_id
    'domain' => '',                    // Tên miền của cookie chứa session_id
    'http_only' => true,               // Có bật chế độ httpOnly hay không, mặc định bật
    'secure' => false,                 // Chỉ có thể bật session ở chế độ https, mặc định tắt
    'same_site' => '',                 // Dùng để ngăn chặn tấn công CSRF và theo dõi người dùng, có thể chọn giá trị strict/lax/none
    'gc_probability' => [1, 1000],     // Xác suất thu hồi session
];

Chú ý
Từ phiên bản 1.4.0 trở đi, webman đã thay đổi namespace của SessionHandler từ
use Webman\FileSessionHandler;
use Webman\RedisSessionHandler;
use Webman\RedisClusterSessionHandler;
thành
use Webman\Session\FileSessionHandler;
use Webman\Session\RedisSessionHandler;
use Webman\Session\RedisClusterSessionHandler;

Cấu hình Thời gian hết hạn

Khi webman-framework < 1.3.14, thời gian hết hạn session trong webman cần phải được cấu hình trong php.ini.

session.gc_maxlifetime = x
session.cookie_lifetime = x
session.gc_probability = 1
session.gc_divisor = 1000

Giả sử thiết lập thời gian hết hạn là 1440 giây, thì cấu hình như sau

session.gc_maxlifetime = 1440
session.cookie_lifetime = 1440
session.gc_probability = 1
session.gc_divisor = 1000

Gợi ý
Bạn có thể sử dụng lệnh php --ini để tìm vị trí của php.ini.