/*****
* 线程间点对组通信
*/
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
原始数据
按行查看
历史