BaseWebSocket.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. <?php
  2. namespace common\components;
  3. use addons\TinyService\common\enums\TypeEnum;
  4. use Yii;
  5. use yii\helpers\Json;
  6. use common\enums\StatusEnum;
  7. use common\models\websocket\FdMemberMap;
  8. use common\helpers\ArrayHelper;
  9. use Swoole\WebSocket\Frame;
  10. use Swoole\WebSocket\Server;
  11. /**
  12. * websocket 基类
  13. *
  14. * Class BaseWebSocket
  15. * @package common\components
  16. * @author qimall
  17. */
  18. class BaseWebSocket
  19. {
  20. /**
  21. * code 状态码说明
  22. *
  23. * @var array
  24. */
  25. private $codeExplain = [
  26. 1006 => '意外断开',
  27. 2000 => '返回成功',
  28. 2001 => '连接成功',
  29. 2002 => '心跳成功',
  30. 2003 => '排队中',
  31. 2004 => '排队成功',
  32. 2005 => 'xxx客服为您服务',
  33. 2006 => 'xxx用户来了',
  34. // 4000 以上为正常报错
  35. 4000 => '客户端未响应连接关闭',
  36. 4001 => '用户验证失败', // 直接踢下线
  37. 4002 => '正常报错提示',
  38. 4004 => '所请求的资源不存在',
  39. 4101 => '已在别处登录', // 直接踢下线
  40. 4102 => '用户已离线',
  41. 4103 => '当前接待人数过多',
  42. 4104 => '客服不在线',
  43. // 5000 以上为服务器错误
  44. 5000 => '服务器错误',
  45. ];
  46. /**
  47. * @var Server
  48. */
  49. public $server;
  50. /**
  51. * @var Frame
  52. */
  53. public $frame;
  54. /**
  55. * @var string
  56. */
  57. public $token;
  58. /**
  59. * @var string
  60. */
  61. public $route;
  62. /**
  63. * 参数
  64. *
  65. * @var array
  66. */
  67. public $params = [];
  68. /**
  69. * @var FdMemberMap|array
  70. */
  71. public $member;
  72. /**
  73. * 返回json数据格式
  74. *
  75. * @param int $code 状态码
  76. * @param string $message 返回的报错信息
  77. * @param array|object $data 返回的数据结构
  78. */
  79. public function json($code = 4003, $message = '未知错误', $data = [])
  80. {
  81. if (empty($data)) {
  82. $data = [];
  83. } elseif (is_array($data) || is_object($data)) {
  84. $data = ArrayHelper::toArray($data);
  85. }
  86. $result = [
  87. 'code' => strval($code),
  88. 'message' => trim($message),
  89. 'data' => $data,
  90. 'member' => [],
  91. 'route' => $this->route,
  92. 'timestamp' => time(),
  93. ];
  94. !empty($this->member) && $result['member'] = ArrayHelper::toArray($this->member);
  95. return Json::encode($result);
  96. }
  97. /**
  98. * 发送正常消息
  99. *
  100. * @param $content
  101. * @param $fd
  102. * @return bool|mixed
  103. */
  104. public function push($content, $fd = '', $code = 2000, $message = 'ok')
  105. {
  106. !$fd && $fd = $this->frame->fd;
  107. if ($this->server->isEstablished($fd)) {
  108. $this->server->push($fd, $this->json($code, $message, $content));
  109. }
  110. unset($content, $message, $code, $fd, $sendFds);
  111. return true;
  112. }
  113. /**
  114. * 发送正常消息
  115. *
  116. * @param $content
  117. * @param $fd
  118. * @return bool|mixed
  119. */
  120. public function pushError($message = 'ok', $code = 4002, $fd = '')
  121. {
  122. !$fd && $fd = $this->frame->fd;
  123. if ($this->server->isEstablished($fd)) {
  124. $this->server->push($fd, $this->json($code, $message));
  125. }
  126. unset($message, $code, $fd);
  127. return true;
  128. }
  129. /**
  130. * 关闭连接
  131. *
  132. * @param $fd
  133. * @param null $code
  134. * @param null $reason
  135. * @return bool
  136. */
  137. public function disconnect($fd, $code = null, $reason = null)
  138. {
  139. // 踢下线
  140. try {
  141. if ($this->server->isEstablished($fd)) {
  142. $this->server->disconnect($fd, $code, $reason);
  143. }
  144. } catch (\Exception $e) {
  145. }
  146. return true;
  147. }
  148. /**
  149. * @param $page
  150. * @return array
  151. */
  152. public function getPage($page)
  153. {
  154. $limit = 10;
  155. $offset = ($page - 1) * $limit;
  156. return [$limit, $offset];
  157. }
  158. /**
  159. * 获取用户信息
  160. *
  161. * @param $member_id
  162. * @param $type
  163. * @param int $status
  164. * @return array|\yii\redis\ActiveRecord|null
  165. */
  166. public function getFdMemberMap($member_id, $type)
  167. {
  168. return FdMemberMap::find()->where([
  169. 'member_id' => $member_id,
  170. 'type' => $type,
  171. ])->one();
  172. }
  173. }