Описание

С версии 4.x Workerman улучшил поддержку HTTP-сервиса. Введены классы запросов, ответов, сессий и SSE. Если вы хотите использовать HTTP-сервис Workerman, настоятельно рекомендуется использовать версию 4.x или более позднюю.

Получение объекта сессии

$session = $request->session();

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('name', 'tome');
    $connection->send($session->get('name'));
};

// Запуск рабочего процесса
Worker::runAll();

Примечания

  • Сессия должна быть обработана до вызова $connection->send().
  • Сессия автоматически сохраняет изменения при уничтожении объекта, поэтому не храните объект, возвращаемый $request->session(), в глобальном массиве или как член класса, так как это может привести к невозможности сохранить сессию.
  • По умолчанию сессия сохраняется в файловой системе; для улучшения производительности рекомендуется использовать Redis.

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

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

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

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('name', 'tom');
    $connection->send(var_export($session->all(), true));
};

// Запуск рабочего процесса
Worker::runAll();

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

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

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

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

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

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $connection->send($session->get('name', 'tom'));
};

// Запуск рабочего процесса
Worker::runAll();

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

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

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

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

Когда нужно сохранить несколько значений, используйте метод put.

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

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

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $session = $request->session();
    $session->set('name', 'tom');
    $connection->send($session->get('name'));
};

// Запуск рабочего процесса
Worker::runAll();

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

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

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

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

$session = $request->session();
// То же самое, что и $session->forget('name');
$session->delete('name');

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $request->session()->forget('name');
    $connection->send('ok');
};

// Запуск рабочего процесса
Worker::runAll();

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

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

Эффект будет тем же, что и в следующем коде

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

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

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $connection->send($request->session()->pull('name'));
};

// Запуск рабочего процесса
Worker::runAll();

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

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

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

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('http://0.0.0.0:8080');

$worker->onMessage = function(TcpConnection $connection, Request $request)
{
    $request->session()->flush();
    $connection->send('ok');
};

// Запуск рабочего процесса
Worker::runAll();

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

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

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

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

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

Примечания

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