Files
jianfeng-server/app/im/controller/WebsocketTest.php
2025-10-02 10:33:06 +08:00

142 lines
3.3 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | Longbing [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright Chengdu longbing Technology Co., Ltd.
// +----------------------------------------------------------------------
// | Website http://longbing.org/
// +----------------------------------------------------------------------
// | Sales manager: +86-13558882532 / +86-13330887474
// | Technical support: +86-15680635005
// | After-sale service: +86-17361005938
// +----------------------------------------------------------------------
use Swoole\WebSocket\Server;
use think\facade\Cache;
class WebsocketTest {
public $server;
public $redis;
public $key;
public function __construct() {
$this->key = '122345446';
if(empty($this->redis)){
$this->redis = new Redis();
$this->redis ->connect('127.0.0.1',6379);
}
$this->server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
$this->server->set(array(
'reactor_num' => 2, //reactor thread num
'worker_num' => 4, //worker process num
'backlog' => 128, //listen backlog
'max_request' => 50,
'dispatch_mode' => 1,
// 'daemonize' => 1
));
$this->server->on('open', function (swoole_websocket_server $server, $request) {
//加入房间域
$this->redis->hset($this->key,$request->fd,$request->fd);
//加入组集合
$this->redis->sadd('group', $this->key);
});
$this->server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
// echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
$group = $this->redis->sMembers('group');
foreach ($group as $v) {
$fangjian = $this->redis->hGetAll($v);
foreach ($fangjian as $k => $vv) {
$server->push($vv, count($fangjian).$frame->fd);
}
}
});
$this->server->on('close', function ($server, $fd) {
$this->redis->hdel($this->key, 2);
//echo "client {$fd} closed\n";
//退出并删除多余的分组fd
$group = $this->redis->sMembers('group');
foreach ($group as $v) {
$fangjian = $this->redis->hgetall($v);
foreach ($fangjian as $k => $vv) {
// if ($fd == $vv) {
$this->redis->hdel($v, $vv);
// }
}
}
});
//
$this->server->on('request', function ($request, $response) {
// 接收http请求从get获取message参数的值给用户推送
// $this->server->connections 遍历所有websocket连接用户的fd给所有用户推送
foreach ($this->server->connections as $fd) {
// 需要先判断是否是正确的websocket连接否则有可能会push失败
if ($this->server->isEstablished($fd)) {
$this->server->push($fd, '11');
}
}
});
$this->server->start();
}
}
new WebsocketTest();