Инструкция
Начиная с версии 4.x Workerman улучшил поддержку HTTP-сервисов. Был введен класс запроса, класс ответа, класс сеансов, а также SSE. Если вы хотите использовать HTTP-сервисы Workerman, настоятельно рекомендуется использовать версию 4.x или более поздние.
Обратите внимание, что все примеры даны для версии Workerman 4.x и не совместимы с версией Workerman 3.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
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
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
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
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
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
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
Worker::runAll();
Проверка наличия данных в сеансе
$session = $request->session();
$has = $session->has('name');
Если соответствующий сеанс отсутствует или значение соответствующего сеанса равно null, возвращает false, в противном случае возвращает true.
$session = $request->session();
$has = $session->exists('name');
Этот код также используется для проверки наличия данных в сеансе, однако, в отличие от первого метода, если значение соответствующего сеанса равно null, он также возвращает true.