Skip to content

说明

workerman 从 4.x 版本开始加强了 HTTP 服务的支持。引入了请求类、响应类、session 类以及 SSE。如果你想使用 workerman 的 HTTP 服务,强烈推荐使用 workerman4.x 或者以后的更高版本。

注意以下都是 workerman4.x 版本的用法,不兼容 workerman3.x。

获取 session 对象

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

例子

php
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();

注意事项

  • session 必须在 $connection->send() 调用之前操作。
  • session 在对象销毁时会自动保存修改,所以不要把 $request->session() 返回的对象保存在全局数组或者类成员中导致 session 无法保存。
  • session 默认存储在磁盘文件中,如果想要更好的性能建议使用 redis。

获取所有 session 数据

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

返回的是一个数组。如果没有任何 session 数据,则返回一个空数组。

例子

php
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 中某个值

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

如果数据不存在则返回 null。

你也可以给 get 方法第二个参数传递一个默认值,如果 session 数组中没找到对应值则返回默认值。例如:

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

例子

php
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();

存储 session

存储某一项数据时用 set 方法。

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

set 没有返回值,session 对象销毁时 session 会自动保存。

当存储多个值时使用 put 方法。

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

同样的,put 也没有返回值。

例子

php
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();

删除 session 数据

删除某个或者某些 session 数据时用 forget 方法。

php
$session = $request->session();
// 删除一项
$session->forget('name');
// 删除多项
$session->forget(['name', 'age']);

另外系统提供了 delete 方法,与 forget 方法区别是,delete 只能删除一项。

php
$session = $request->session();
// 等同于 $session->forget('name');
$session->delete('name');

例子

php
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 某个值

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

效果与如下代码相同

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

如果对应 session 不存在,则返回 null。

例子

php
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();

删除所有 session 数据

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

没有返回值,session 对象销毁时 session 会自动从存储中删除。

例子

php
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 数据是否存在

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

以上当对应的 session 不存在或者对应的 session 值为 null 时返回 false,否则返回 true。

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

以上代码也是用来判断 session 数据是否存在,区别时当对应的 session 项值为 null 时,也返回 true。

基于 MIT 许可发布