channel.php id,channel.php

/*****

* 线程间点对组通信

*/

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

原始数据

按行查看

历史

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值