网络小程序开发(小程序开发软件开发)
1901
2022-09-02
ThinkPHP5结合Swoole开发实现WebSocket在线聊天(thinkphp5 websocket)
ThinkPHP使用
Swoole需要安装 think-swoole Composer包,前提系统已经安装好了Swoole PECL 拓展
在tp5的项目根目录下执行composer命令安装think-swoole:
composer require topthink/think-swoole
安装成功:
代码如下
新建WebSocket.php控制器:
监听端口要确认服务器放行,宝塔环境还需要添加安全组规则
protected $host = '0.0.0.0'; //监听所有地址 protected $port = 9501; //监听9501端口 protected $serverType = 'socket';
protected $option = [
'worker_num'=> 4, //设置启动的Worker进程数 'daemonize' => false, //守护进程化(上线改为true) 'backlog' => 128, //Listen队列长度 'dispatch_mode' => 2, //固定模式,保证同一个连接发来的数据只会被同一个worker处理 //心跳检测:每60秒遍历所有连接,强制关闭10分钟内没有向服务器发送任何数据的连接 'heartbeat_check_interval' => 60,
'heartbeat_idle_time' => 600 ];
//建立连接时回调函数 public function onOpen($server,$req) {
$fd = $req->fd;//客户端标识 $uid = $req->get['uid'];//客户端传递的用户id $token = $req->get['token'];//客户端传递的用户登录token //省略token验证逻辑...... if (!$token) {
$arr = array('status'=>2,'message'=>'token已过期');
$server->push($fd, json_encode($arr));
$server->close($fd);
return;
}
//省略给用户绑定fd逻辑...... echo "用户{$uid}建立了连接,标识为{$fd}\n";
}
//接收数据时回调函数 public function onMessage($server,$frame) {
$fd = $frame->fd;
$message = $frame->data;
//省略通过fd查询用户uid逻辑...... $uid = 666;
$data['uid'] = $uid;
$data['message'] = '用户'.$uid.'发送了:'.$message;
$data['post_time'] = date("m/d H:i",time());
$arr = array('status'=>1,'message'=>'success','data'=>$data);
//仅推送给当前连接用户 //$server->push($fd, json_encode($arr)); //推送给全部连接用户 foreach($server->connections as $fd) {
$server->push($fd, json_encode($arr));
}
}
//连接关闭时回调函数 public function onClose($server,$fd) {
echo "标识{$fd}关闭了连接\n";
}
}
前端演示页面:
省略控制器判断登录状态、分配数据逻辑......
发送
服务器移到项目根目录开启服务:
php public/index.php Websocket/start
这里的路径,是因为我绑定了home模块为默认模块,tp5默认情况是:
php public/index.php index/Websocket/start
)
开启成功,查看端口已经被监听:
lsof -i:9501
服务器监听如下:
用户每刷新重连一次,fd标识都会改变。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~