说明

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

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

获取session对象

  1. $session = $request->session();

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $session = $request->session();
  9. $session->set('name', 'tome');
  10. $connection->send($session->get('name'));
  11. };
  12. // 运行worker
  13. Worker::runAll();

注意事项

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

获取所有session数据

  1. $session = $request->session();
  2. $all = $session->all();

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

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $session = $request->session();
  9. $session->set('name', 'tom');
  10. $connection->send(var_export($session->all(), true));
  11. };
  12. // 运行worker
  13. Worker::runAll();

获取session中某个值

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

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

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

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

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $session = $request->session();
  9. $connection->send($session->get('name', 'tom'));
  10. };
  11. // 运行worker
  12. Worker::runAll();

存储session

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

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

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

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

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

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

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $session = $request->session();
  9. $session->set('name', 'tom');
  10. $connection->send($session->get('name'));
  11. };
  12. // 运行worker
  13. Worker::runAll();

删除session数据

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

  1. $session = $request->session();
  2. // 删除一项
  3. $session->forget('name');
  4. // 删除多项
  5. $session->forget(['name', 'age']);

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

  1. $session = $request->session();
  2. // 等同于 $session->forget('name');
  3. $session->delete('name');

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $request->session()->forget('name');
  9. $connection->send('ok');
  10. };
  11. // 运行worker
  12. Worker::runAll();

获取并删除session某个值

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

效果与如下代码相同

  1. $session = $request->session();
  2. $value = $session->get($name);
  3. $session->delete($name);

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

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $connection->send($request->session()->pull('name'));
  9. };
  10. // 运行worker
  11. Worker::runAll();

删除所有session数据

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

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

例子

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. use Workerman\Protocols\Http\Request;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $worker = new Worker('http://0.0.0.0:8080');
  6. $worker->onMessage = function(TcpConnection $connection, Request $request)
  7. {
  8. $request->session()->flush();
  9. $connection->send('ok');
  10. };
  11. // 运行worker
  12. Worker::runAll();

判断对应session数据是否存在

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

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

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

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