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], // вероятность сбора сессий
];
Безопасность
При использовании сессий не рекомендуется напрямую сохранять экземпляры классов, особенно экземпляры классов из неконтролируемых источников, так как десериализация может создать потенциальные риски.