使用SwooleTable

1.定义Table,支持定义多个Table。

Swoole启动之前会创建定义的所有Table。

  1. // 在"config/laravels.php"配置
  2. [
  3. // ...
  4. 'swoole_tables' => [
  5. // 场景:WebSocket中UserId与FD绑定
  6. 'ws' => [// Key为Table名称,使用时会自动添加Table后缀,避免重名。这里定义名为wsTable的Table
  7. 'size' => 102400,//Table的最大行数
  8. 'column' => [// Table的列定义
  9. ['name' => 'value', 'type' => \Swoole\Table::TYPE_INT, 'size' => 8],
  10. ],
  11. ],
  12. //...继续定义其他Table
  13. ],
  14. // ...
  15. ];

2.访问Table:所有的Table实例均绑定在SwooleServer上,通过app('swoole')->xxxTable访问。

  1. use Swoole\Http\Request;
  2. use Swoole\WebSocket\Frame;
  3. use Swoole\WebSocket\Server;
  4.  
  5. // 场景:WebSocket中UserId与FD绑定
  6. public function onOpen(Server $server, Request $request)
  7. {
  8. // var_dump(app('swoole') === $server);// 同一实例
  9. $userId = mt_rand(1000, 10000);
  10. app('swoole')->wsTable->set('uid:' . $userId, ['value' => $request->fd]);// 绑定uid到fd的映射
  11. app('swoole')->wsTable->set('fd:' . $request->fd, ['value' => $userId]);// 绑定fd到uid的映射
  12. $server->push($request->fd, 'Welcome to LaravelS');
  13. }
  14. public function onMessage(Server $server, Frame $frame)
  15. {
  16. foreach (app('swoole')->wsTable as $key => $row) {
  17. if (strpos($key, 'uid:') === 0 && $server->exist($row['value'])) {
  18. $server->push($row['value'], 'Broadcast: ' . date('Y-m-d H:i:s'));// 广播
  19. }
  20. }
  21. }
  22. public function onClose(Server $server, $fd, $reactorId)
  23. {
  24. $uid = app('swoole')->wsTable->get('fd:' . $fd);
  25. if ($uid !== false) {
  26. app('swoole')->wsTable->del('uid:' . $uid['value']);// 解绑uid映射
  27. }
  28. app('swoole')->wsTable->del('fd:' . $fd);// 解绑fd映射
  29. $server->push($fd, 'Goodbye');
  30. }