webman управление сессиями

Пример

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

С помощью $request->session(); можно получить экземпляр Workerman\Protocols\Http\Session, используя методы экземпляра для добавления, изменения и удаления данных сессии.

Внимание: объект сессии автоматически сохраняет данные сессии при его уничтожении, поэтому не сохраняйте объект, возвращаемый $request->session(), в глобальном массиве или члене класса, чтобы избежать потери данных сессии.

Получение всех данных сессии

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

Возвращает массив. Если нет данных сессии, возвращается пустой массив.

Получение значения из сессии

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

Если данных нет, возвращает null.

Вы также можете передать второй параметр в метод get, задав значение по умолчанию, которое будет возвращено, если соответствующее значение не найдено в массиве сессии. Например:

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

Сохранение сессии

Для сохранения одного значения используется метод set.

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

Метод set не возвращает значение, данные сессии автоматически сохраняются при уничтожении объекта сессии.

Для сохранения нескольких значений используется метод put.

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

Аналогично, метод put также не возвращает значение.

Удаление данных сессии

Для удаления одного или нескольких значений сессии используется метод forget.

$session = $request->session();
// Удалить одно
$session->forget('name');
// Удалить несколько
$session->forget(['name', 'age']);

Кроме того, система предоставляет метод delete, который отличается от метода forget тем, что delete может удалить только одно значение.

$session = $request->session();
// Эквивалентно $session->forget('name');
$session->delete('name');

Получение и удаление значения из сессии

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

Это эквивалентно следующему коду:

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

Если соответствующая сессия не существует, возвращает null.

Удаление всех данных сессии

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

Не возвращает значения, данные сессии будут автоматически удалены из хранилища при уничтожении объекта сессии.

Проверка существования данных сессии

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

Если соответствующая сессия не существует или значение сессии равно null, возвращает false, в противном случае возвращает true.

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

Этот код также используется для проверки наличия данных сессии, отличие в том, что если значение соответствующей сессии равно null, также возвращает true.

Вспомогательная функция session()

Webman предоставляет вспомогательную функцию session(), выполняющую те же функции.

// Получение экземпляра сессии
$session = session();
// Эквивалентно
$session = $request->session();

// Получение значения
$value = session('key', 'default');
// Эквивалентно
$value = session()->get('key', 'default');
// Эквивалентно
$value = $request->session()->get('key', 'default');

// Установка значений в сессии
session(['key1'=>'value1', 'key2' => 'value2']);
// Эквивалентно
session()->put(['key1'=>'value1', 'key2' => 'value2']);
// Эквивалентно
$request->session()->put(['key1'=>'value1', 'key2' => 'value2']);

Конфигурационный файл

Конфигурационный файл сессии находится в config/session.php, его содержание похоже на следующее:

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

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

    // Если handler равен FileSessionHandler::class, значение будет file,
    // если handler равен RedisSessionHandler::class, значение будет redis
    // если handler равен RedisClusterSessionHandler::class, значение будет redis_cluster
    'type'    => 'file',

    // Разные обработчики используют разные конфигурации
    'config' => [
        // конфигурация для типа file
        'file' => [
            'save_path' => runtime_path() . '/sessions',
        ],
        // конфигурация для типа 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 для хранения session_id
    'auto_update_timestamp' => false,  // автоматически обновлять сессию, по умолчанию отключено
    'lifetime' => 7*24*60*60,          // время жизни сессии
    'cookie_lifetime' => 365*24*60*60, // время истечения cookie для хранения session_id
    'cookie_path' => '/',              // путь для cookie хранения session_id
    'domain' => '',                    // домен для cookie хранения session_id
    'http_only' => true,               // включить httpOnly, по умолчанию включено
    'secure' => false,                 // включить сессии только по https, по умолчанию отключено
    'same_site' => '',                 // для предотвращения атак CSRF и отслеживания пользователей, допустимые значения: strict/lax/none
    'gc_probability' => [1, 1000],     // вероятность сбора сессий
];

Безопасность

При использовании сессий не рекомендуется напрямую сохранять экземпляры классов, особенно экземпляры классов из неконтролируемых источников, так как десериализация может создать потенциальные риски.