研究swoole一段时间了,但是swoole对于新手来说还是有一定的难度的,所以今天研究了下,写了一个通用的类库,这样可以直接在框架中引入调用就可以了,不多说,看代码吧.

先看一个代码的结构图:

也许熟悉TP5.1的小伙伴们看出来了,没错,这里面演示的就是在Tp5.0中的调用

先是关键核心的Http.php文件:

<?php
namespace sockets\socket6;
use sockets\socket6\Predis;
require_once 'Predis.php';
/***    socket面向对象的编译*/
class Http
{CONST HOST = '0.0.0.0';CONST PORT = '12316';public $ws = null;public $client = null;private $key = 'paiv3@$))(';private $prefix = 'paiv3_';public $pwd = "/www/wwwroot/wanguopai/swoole/";public function __construct(){// $this->ws=new \swoole_websocket_server(self::HOST,self::PORT,SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);$this->ws = new \swoole_websocket_server(self::HOST, self::PORT);$this->ws->set([//心跳检测'heartbeat_check_interval' => 60,'heartbeat_idle_time' => 600,//设置证书,实现wss连接// 'ssl_cert_file' => $this->pwd.'pai.wanguo.net.crt',// 'ssl_key_file' => $this->pwd.'pai.wanguo.net.key',]);//监听新端口$this->client = $this->ws->listen("127.0.0.1", 12317, SWOOLE_SOCK_TCP);//关闭websocket模式$this->client->set(['open_websocket_protocol' => false,]);$this->ws->on("start", [$this, 'onStart']);$this->client->on("receive", [$this, 'onReceive']);$this->ws->on('message', [$this, 'onmessage']);$this->ws->on('close', [$this, 'onclose']);$this->client->on('close', [$this, 'oncloses']);$this->ws->start();}//监听数据接收事件public function onReceive($serv, $fd, $from_id, $data){$data = json_decode($data, true);//成交if ($data['type'] == 'done') {self::push_room($data['room_id'],$data);$data['tips']=$room_id."已成交,最终成交价格:¥".$price."元";//推送全部self::push_all($data);}elseif ($data['type'] == 'msg') {//个人if ($data['totype']=='single') {unset($data['totype']);$id=$data["toid"];unset($data['toid']);self::push_single($id,$data);//房间}elseif ($data['totype']=='room') {unset($data['totype']);$id=$data["toid"];unset($data['toid']);self::push_room($id,$data);//全部}elseif ($data['totype']=='all'){unset($data['totype']);unset($data['toid']);self::push_all($data);}}else{//出价 开始 结束self::push_room($data['room_id'],$data);//结束的时候清除对应redisif ($data['type'] == 'end') {$push_arr=Predis::getInstance()->smembers('room_id'.$data['room_id']);//获取该房间下用户的fd$fds=[];foreach ($push_arr as $v) {$fds=Predis::getInstance()->smembers(substr($v,6));     //smembers自动写入,所以要截取掉foreach ($fds as $vv) {Predis::getInstance()->del(substr($vv,6));                       //删除在线的fd字符}Predis::getInstance()->del(substr($v,6));                       //删除在线的用户}Predis::getInstance()->del('room_id'.$data['room_id']);              //对应的价格Predis::getInstance()->hdel('new_price',$data['room_id']);              //对应的价格}}}/***   推送房间所有人*   $room_id    当前房间id*   $arr    组装数据*/public function push_room($room_id, $arr){//获取该房间下的用户$push_arr = Predis::getInstance()->smembers('room_id' . $room_id);//获取该房间下用户的fd$fds = [];foreach ($push_arr as $k => $v) {$fds = Predis::getInstance()->smembers(substr($v, 6));     //smembers自动写入,所以要截取掉foreach ($fds as $vv) {//推送$this->ws->push(substr($vv, 8), json_encode($arr));}}}/***   推送消息给所有人*   $arr 通知的消息*/public function push_all($arr){//获取所有人的fd$fd=Predis::getInstance()->keys("fd*");foreach ($fd as $k => $v) {$v=str_replace("paiv3_fd","",$v);$this->ws->push($v, json_encode($arr));}}/***   推送给个人*   $arr 通知的消息   **/public function push_single($id,$arr){$fds=Predis::getInstance()->keys("fd*");foreach ($fds as $k => $v) {//解析fd下的uid信息$user=json_decode(Predis::getInstance()->gets($v), true);//判断所有uid的fd连接if ($user['uid'] == $id) {$fd[]=str_replace("paiv3_fd","",$v);}}foreach ($fd as $v) {$this->ws->push($v, json_encode($arr));}}/*** 设置进程名,为后续平滑重启进程* @param $server*/public function onStart($server){swoole_set_process_name("live_master");}/*** 监听接收事件的回调*/public function onmessage($server, $frame){//在接收数据的时候进行推送$data = json_decode($frame->data, true);if (empty($data["room_id"]) || empty($data["uid"])) {return flase;}//加入组集合(集合)Predis::getInstance()->sadd('group', $data['room_id']);//加入分组(集合)Predis::getInstance()->sadd('room_id' . $data['room_id'], 'room_id' . $data['room_id'] . '_' . $data['uid']);//加入会员fd的集合(集合)Predis::getInstance()->sadd('room_id' . $data['room_id'] . '_' . $data['uid'], 'fd' . $frame->fd);//创建fd的json数据(字符)$json['room_id'] = $data['room_id'];$json['uid'] = $data['uid'];Predis::getInstance()->set('fd' . $frame->fd, json_encode($json));//组装发送的数据$arr['name'] = $data['name'];$arr['uid'] = $data['uid'];$arr['type'] = "join";$arr['num'] = Predis::getInstance()->scard('room_id' . $data['room_id']);//推送self::push_room($data['room_id'], $arr);}/*** 监听关闭事件的回调*/public function onclose($ser, $fd){//先获取字符fd,并得到room_id和uid$data = json_decode(Predis::getInstance()->get('fd' . $fd), true);//删除用户该次的fdPredis::getInstance()->srem('room_id' . $data['room_id'] . '_' . $data['uid'], 'fd' . $fd);//删除字段Predis::getInstance()->del('fd' . $fd);//判断是否为空if (empty(Predis::getInstance()->smembers('room_id' . $data['room_id'] . '_' . $data['uid']))) {//删除该用户的uidPredis::getInstance()->del('room_id' . $data['room_id'] . '_' . $data['uid']);//删除分组里面该用户信息Predis::getInstance()->srem('room_id' . $data['room_id'], 'room_id' . $data['room_id'] . '_' . $data['uid']);//本地房间推送$arr['type']='offline';$arr['num']=Predis::getInstance()->scard('room_id' . $data['room_id']);self::push_room($data['room_id'],$arr);}}public function oncloses($ser, $fd){}
}new Http();

然后是Predis.php

<?php
namespace sockets\socket6;
/*** Created by PhpStorm.* User: baidu* Date: 18/3/26* Time: 上午3:52*/
class Predis {//redis的前缀private $redis_fix='paiv3_';public $redis = "";/*** 定义单例模式的变量* @var null*/private static $_instance = null;public static function getInstance() {if(empty(self::$_instance)) {self::$_instance = new self();}return self::$_instance;}private function __construct() {$this->redis = new \Redis();$result = $this->redis->connect('127.0.0.1',6379);if($result === false) {throw new \Exception('redis connect error');}}/*** set* @param $key* @param $value* @param int $time* @return bool|string*/public function set($key, $value, $time = 0 ) {if(!$key) {return '';}if(is_array($value)) {$value = json_encode($value);}if(!$time) {return $this->redis->set($this->redis_fix.$key, $value);}return $this->redis->setex($this->redis_fix.$key, $time, $value);}/*** get* @param $key* @return bool|string*/public function get($key) {if(!$key) {return '';}return $this->redis->get($this->redis_fix.$key);}public function gets($key){return $this->redis->get($key);}/*** @param $key* @return array*/public function smembers($key) {return $this->redis->sMembers($this->redis_fix.$key);}public function srem($key,$valus) {return $this->redis->sRem($this->redis_fix.$key,$this->redis_fix.$valus);}public function scard($key) {return $this->redis->sCard($this->redis_fix.$key);}public function lpush($key,$date){return $this->redis->lpush($this->redis_fix.$key,$date);}public function lrange($key,$start,$end){return $this->redis->lrange($this->redis_fix.$key,$start,$end);}public function del($key){return $this->redis->del($this->redis_fix.$key);}public function incr($key){return $this->redis->incr($this->redis_fix.$key);}public function llen($key){return $this->redis->llen($this->redis_fix.$key);}public function lpop($key){return $this->redis->lpop($this->redis_fix.$key);}public function sadd($key,$val){return $this->redis->sadd($this->redis_fix.$key,$this->redis_fix.$val);}//hashpublic function hset($key,$name,$val){return $this->redis->hset($this->redis_fix.$key,$this->redis_fix.$name,$val);}public function hexists($key,$name){return $this->redis->hexists($this->redis_fix.$key,$this->redis_fix.$name);}public function hgetall($key){return $this->redis->hgetall($this->redis_fix.$key);}public function hget($key,$filed){return $this->redis->hget($this->redis_fix.$key,$this->redis_fix.$filed);}public function hvals($key){return $this->redis->hvals($this->redis_fix.$key);}public function hdel($key,$name){return $this->redis->hdel($this->redis_fix.$key,$this->redis_fix.$name);}public function keys($key){return $this->redis->keys($this->redis_fix.$key);}/*** @param $name* @param $arguments* @return array*/public function __call($name, $arguments) {//echo $name.PHP_EOL;//print_r($arguments);if(count($arguments) != 2) {return '';}$this->redis->$name($arguments[0], $arguments[1]);}
}

最后也就是引入的类库Socket6.php

<?php
namespace sockets\socket6;
class Socket6
{//出价public static function bidding($room_id,$name,$price,$price_list){$data['type']='bidding';$data['room_id']=$room_id;$data['name']=$name;$data['price']=$price;$data['price_list']=$price_list;self::push(json_encode($data));}//开始public static function start($room_id){$data['type']="start";$data['room_id']=$room_id;$data['start_time']=date('Y-m-d H:i:s');self::push(json_encode($data));}//成交public static function done($room_id,$name,$price){$data['type']="done";$data['room_id']=$room_id;$data['name']=$name;$data['price']=$price;self::push(json_encode($data));}//结束public static function end($room_id){$data['type']="end";$data['room_id']=$room_id;$data['end_time']=date('Y-m-d H:i:s');self::push(json_encode($data));}//消息通知public static function msg($type,$toid,$msg){$data['type']="msg"; $data['msg']=$msg;$data['toid']=$toid;switch ($type) {//推给单个用户case 'single':$data['totype']='single';break;//推给房间用户case 'room':$data['totype']='room';break;//推给全部用户case 'all':$data['totype']='all';break;   default:break;}print_r($data);self::push(json_encode($data));}//推送public static function push($data){$cli = new \swoole_client(SWOOLE_SOCK_TCP);//判断连接状态(同步连接模式)$res=$cli->connect('127.0.0.1', 12317);if (empty($res)) {return "连接失败";}else{$cli->send($data);}}
}

写到了这里,当点swoole的都知道了,只要在cli中执行php Http.php & 命令就可以了,

完后在TP的常规文件中,执行我们Socket6类中的命令就可以了;

比如说:

<?php
namespace app\index\controller;use app\common\Client;
use app\common\Predis;
use app\index\model\User;
use sockets\socket6\Predis as redis;
use sockets\socket6\Socket6 as send;class Index
{public function ccc(){send::bidding(2,"121212121221村田",100,"1,2,3,4");send::start(2);send::done('2',"刘磊22222222","15000");send::end('2');     send::msg('single',1,"用户1独立消息!!!");echo 13245679;exit();}
}

大家可以简单看一下,不过话说我要是写golang也这么的写,会被打死的``````

swoole通用类库,不管你用的什么框架,一个类库全部搞定!!!相关推荐

  1. 2017年前端框架、类库、工具大比拼

    相比于JavaScript开发人员的数量,目前JavaScript框架.类库和工具的数量似乎更多一些.截至2017年5月,GitHub上的快速搜索显示,有超过110万个JavaScript项目.npm ...

  2. vb.net usb通用协议api_充电头百花齐放不通用,热门全协议充电头盘点,充电问题一站搞定...

    充电头百花齐放却不通用,热门全协议充电头盘点,充电问题一站搞定 快充用来一时爽,协议不握手,5V1A慢慢享 近些年来,由于智能手机的快速发展,手机的耗电量变得越来越大.但是电池技术始终没有得到突破,想 ...

  3. Web前端框架与类库的思考

    说起前端框架,我也是醉了.现在去面试或者和同行聊天,动不动就这个框架碉堡了,那个框架好犀利. 当然不是贬低框架,只是有一种杀鸡焉用牛刀的感觉.网站技术是为业务而存在的,除此毫无意义,框架也是一样.在技 ...

  4. C/C++ 框架,类库,资源集合

    很棒的 C/C++ 框架,类库,资源集合. Awesome C/C++ Standard Libraries Frameworks Artificial Intelligence Asynchrono ...

  5. 天猫php采集列表,QueryList: QueryList是一个基于phpQuery的通用列表采集类,是一个简单、 灵活、强大的采集工具,采集任何复杂的页面 基本上就一句话就能搞定了。...

    #QueryList交流社区: http://querylist.cc/ #QueryList文档: http://doc.querylist.cc/ #QueryList交流QQ群:12326696 ...

  6. 一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出

    一文搞定C#关于NPOI类库的使用读写Excel以及io流文件的写出 今天我们使用NPOI类库读写xlsx文件, 最终实现的效果如图所示 从太平洋官网下载相应的类库,大概4~5MB,不要从github ...

  7. php memcache 类库,php操作Memcache的一个类库的方法(代码)

    详细内容 本篇文章给大家带来的内容是关于php操作Memcache的一个类库的方法(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 代码如下:<?php /** * Cr ...

  8. c#点击按钮调出另一个窗体_在类库或winform项目中打开另一个winform项目窗体的方法...

    本文实例讲述了在类库或winform项目中打开另一个winform项目窗体的方法.分享给大家供大家参考.具体如下: 一.问题: 假设类库或winform项目为A,另一个winform项目为B.那麽在A ...

  9. 通用人工智能最新突破!一个Transformer搞定一切

    Datawhale干货 编辑:梦晨 鱼羊,来源:量子位 通用人工智能,还得看DeepMind. 这回,只一个模型,使用相同的权重,不仅把看家本领雅达利游戏玩得飞起. 和人类聊聊天.看图写话也不在话下. ...

最新文章

  1. R语言与正态总体均值的区间估计
  2. .NET应用迁移到.NET Core(三)从商业角度看移植过程
  3. 虚拟机安装windows ghost版本系统记录完整过程
  4. 关于ORACLE的GUID主键生成
  5. [Luogu 2090]数字对
  6. [笔记] 最大权闭合子图最大流最小割相关笔记
  7. Unity调用Android类方法
  8. jquery 如何获取某个元素中的第几个子元素
  9. C#中如何调出工具箱
  10. Zookeeper、Curator
  11. 手把手教你接入微信开放平台,实现网站拉起微信账号登录,从0开始详细记录
  12. 新锐房地产销售管理系统 (部分流程)技术解析(一)用三层架构搭建项目
  13. ​20X44 FCPX模板电影胶片滚动回忆照片相册图文展示动画 Move Time
  14. 2018+黑苹果+vs+Linux,重点更新!完美黑苹果=Z370M+i5+RX590(硬解)10.15
  15. Ubuntu制作系统ISO镜像
  16. 中国城市人口排名(最新版)
  17. insmod: error inserting ‘./module1.ko‘: -1 Unknown symbol in module
  18. R语言使用Metropolis-Hastings采样算法自适应贝叶斯估计与可视化
  19. 计算机网络中计算机资源管理器,资源管理器
  20. java计算机毕业设计公交线路查询系统MyBatis+系统+LW文档+源码+调试部署

热门文章

  1. OC中栈区与堆区的内存概念解析
  2. codeforces 有意思的思维题 1 ~ 15
  3. 基于FPGA的VGA显示
  4. DOS攻击、DDOS攻击到底是啥
  5. 安卓UI自动化工具4399AT环境搭建
  6. 编程时拼音输入法的设置
  7. matlab 定义函数 调用,matlab 定义函数,matlab定义函数并调用
  8. matlab找不到exe文件,如何修复pyinstaller在从scrip创建exe文件时找不到matlab文件的问题...
  9. 使用adb命令从电脑传文件到手机
  10. 微生物组+代谢组联合分析