/*****

* 线程间点对组通信

*/

use Beanstalk\Client;

require_once __DIR__ . '/Beanstalk/Client.php';

require __DIR__ .'/vendor/autoload.php';

//创建websocket服务器对象,监听0.0.0.0:9502端口

$ws = new swoole_websocket_server("0.0.0.0", 9503);

$ws->set(array('worker_num' => 4 //设置开启的线程数量

,'daemonize' => true )); //是否是守护进程

// ,'heartbeat_check_interval' => 5 //每五秒检测一下心跳

// ,'heartbeat_idle_time' => 10, //十秒内无数据交互 关闭连接

$ws->buffer = array(); //全局数据 其他设置全局数据的方法貌似有时效性

$ws->on('WorkerStart', function ($ws, $worker_id) { //监听WebSocket开启事件

$redis = new \Redis();

$redis->connect('127.0.0.1', 6379);

$ws->redis = $redis; //线程间redis不共用 都是单独的redis连接 mysql同理

});

$ws->on('open', function ($ws, $request) { //客户端每次连接都会触发

echo $ws->worker_id.'connection'; //当前线程的id号

});

$ws->on('message', function ($ws, $frame) { //监听WebSocket消息事件

$redis = $ws->redis; //获取当前线程内的redis连接

$data = json_decode($frame->data, true);

if ($data['action'] == 'push_group') {

foreach ($ws->connections as $fd) { //获取该服务器上所有线程的所有连接(和workerman不同) $fd是累计的 不管在几个线程 共用一套fd的计数规则

if ($redis->get('channel_' . $fd) != null) {

$result = json_decode($redis->get('channel_' . $fd), true); //获取连接绑定在redis的数据

if ($result['group_id'] == $data['to_group']) {

$ws->push($fd, "server: " . time() . ',' . $ws->worker_id); //在当前线程内广播信息给特定组的连接

}

}

}

} elseif ($data['action'] == 'login') {

$redis->set('channel_' . $frame->fd, json_encode(['user_id' => $data['userid'], 'group_id' => $data['groupid']])); //写入redis

} elseif ($data['action'] == 'report') {

foreach ($ws->connections as $fd) { //获取该服务器上所有线程的所有连接(和workerman不同) $fd是累计的 不管在几个线程 共用一套fd的计数规则

if ($redis->get('channel_' . $fd) != null) {

$result = json_decode($redis->get('channel_' . $fd), true); //获取连接绑定在redis的数据

if ($result['group_id'] == $data['to_group']) {

$ws->push($fd, "server: " . $data['data'] . ',' . $ws->worker_id); //在当前线程内广播信息给特定组的连接

}

}

}

}

});

$ws->on('close', function ($ws, $fd) { //监听WebSocket连接关闭事件

echo $fd.'close/n';

$redis=$ws->redis; //获取当前线程内的redis连接

echo $redis->get('channel_'.$fd);

echo $redis->del('channel_'.$fd); //当客户端关闭连接 清理fd绑定的数据

echo count($ws->connections).'connection....'; //获取当前连接数 客户端连接关闭 connections里面还是有这个fd连接 做好判断

});

$ws->start();

一键复制

编辑

Web IDE

原始数据

按行查看

历史

channel.php id,channel.php相关推荐

  1. ORA-03113: end-of-file on communication channel Process ID: 252 Session ID: 1 Serial number: 3

    进入字符界面: sqlplus  / as sysdba startup nomount; alter database mount; alter database open; 报如下错误: * ER ...

  2. nil channel与closed channel的读写

    nil channel与closed channel的读写 名词解释 nil channel:未初始化的channel,即没有执行make操作closed channel:执行了closed操作的ch ...

  3. 【Flutter】Flutter 混合开发 ( Flutter 与 Native 通信 | 通信场景 | Channel 通信机制 | Channel 支持的通信数据类型 | Channel 类型 )

    文章目录 一.Flutter 和 Native 应用之间的通信场景 二.Flutter 和 Native 的 Channel 通信机制 三.Channel 通信机制支持的数据类型 四.Channel ...

  4. matlab构建信道模型channel model, Rayleigh channel (NLoS), Rician channel (LoS)

    1. NLoS: 此时的channel coefficients的模服从Rayleigh distribution Rayleigh distribution: 当一个随机二维向量的两个分量呈独立的. ...

  5. channel java_Java中channel用法总结

    本文实例总结了Java中channel用法.分享给大家供大家参考.具体分析如下: 1.Channel接口的定义: public interface Channel { public boolean i ...

  6. [QCA6174]QCA6174 DFS认证4.6.2.1 Channel Availablity Check Channel 120/124/128信道静默时间不满足10min问题分析及解决方案

    DFS机制及认证 5 GHz频段在开放WiFi之前一直用于航空和气象雷达.到处都是旧的雷达,WiFi接入点不能干扰它们.如果接入点检测到雷达信号,则必须更改其信道,这通常会中断与其客户端的连接.这种机 ...

  7. scsi 驱动的host channel id lun在哪里看

    涉及到两个结构体 1.scsi_device 里包含channel,id,lun 2.Scsi_Host 里包含host_no 3 通过lsscsi可以看到最左边有[0:0:0:0]4个数字,其中这4 ...

  8. spring session 退出登录 清理session

    2019独角兽企业重金招聘Python工程师标准>>> spring session 退出登录 清理session 博客分类: spring /*** Allows creating ...

  9. vue+js+海康web开发包接入海康威视摄像头

    一.登录海康开放平台下载web开发包,下载需要先登录海康账号,没有的需先注册一个. 海康开放平台web开发包下载地址:https://open.hikvision.com/download/5cda5 ...

最新文章

  1. CentOS 7.3 安装配置RabbitMQ
  2. Android调试错误-No resource identifier found for attribute 'showAsAction'
  3. [开心]很搞笑的贴图,必看(收藏)
  4. 性能提升约 7 倍!Apache Flink 与 Apache Hive 的集成
  5. php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
  6. CodeForces - 1321E World of Darkraft: Battle for Azathoth(二维偏序+线段树)
  7. 创建macOS 启动安装盘
  8. js与c语言效率_JavaScript控制流及关键字与C语言之比较
  9. 【C++11新特性】 C++11智能指针之weak_ptr
  10. python从入门到放弃-掌握这个学习方法,让 Python 不再从入门到放弃
  11. LeetCode题解之Missing Number
  12. Axure RP9 的元件库
  13. Windows11在Edge浏览器中打开IE浏览器兼容的页面,在Edge浏览器打开加载ActiveX控件的页面
  14. 《少有人走的路-心智成熟的旅程》读书分享
  15. 对多个Excel表中的数据进行合并计算
  16. 基于c语言 自制编程语言,自制编程语言:基于C语言
  17. float转int 四舍五入问题
  18. 最新Uniapp开发的多端影视APP+对接苹果CMS
  19. [翻译]Linter简介-摘自维基百科
  20. oracle索引管理

热门文章

  1. 北京游玩的推荐爬的山
  2. [转]看完吓一跳,FireFox和IE漏洞对比报告
  3. Packet Tracer DHCP服务器配置实验
  4. 江苏大学计算机网络设计,江苏大学计算机网络实验报告
  5. 基于数据驱动故障预测的多台电力设备预测性维护调度
  6. Base64加密与解密的三种方法
  7. @ControllerAdvice基础介绍
  8. scrapy爬虫实战(四)--------------登陆51job并使用cookies进行爬取
  9. 论开发能力提高之道-御剑飞升的实现 1
  10. 锤子投资人炮轰阿里,谁会成为罗永浩的白衣骑士?