thinkphp6+swoole websocket使用教程自研路线不建议使用
转载请注明: 藏羚骸的博客~thinkphp6+swoole websocket使用教程自研路线不建议使用.
介绍
对于think-swoole网上资料五花八门,根据网上资料,我成功走上了岔路口,但是websocket连接时也可以走通,因为项目比较急,既然能走通那就直接用,也做成了满足需求的聊天软件,但是本着质量至上的态度,我又把代码改了一份正规的路线,下面分享我的自研路线,紧分享学习路程,不建议使用,正规路线在最下方。
安装think-swoole
ThinkPHP 6 安装命令
具体操作
config/swoole.php
复制一份think\swoole\websocket\socketio\Handler.php到app\http\Ywliveanchor.php
app\http\Ywliveanchor.php
<?phpnamespace app\http;use Swoole\Server;
use Swoole\Websocket\Frame;
use Swoole\WebSocket\Server as WebsocketServer;
use think\Config;
use think\Request;
use think\swoole\contract\websocket\HandlerInterface;class Ywliveanchor implements HandlerInterface
{/** @var WebsocketServer */protected $server;/** @var Config */protected $config;public function __construct(Server $server, Config $config){$this->server = $server;$this->config = $config;}/*** "onOpen" listener.** @param int $fd* @param Request $request*/public function onOpen($fd, Request $request){echo "队列{$fd}连接\n";}/*** "onMessage" listener.* only triggered when event handler not found** @param Frame $frame* @return bool*/public function onMessage(Frame $frame){$packet = $frame->data;if (Packet::getPayload($packet)) {return false;}$this->checkHeartbeat($frame->fd, $packet);return true;}/*** "onClose" listener.** @param int $fd* @param int $reactorId*/public function onClose($fd, $reactorId){return;}protected function checkHeartbeat($fd, $packet){$packetLength = strlen($packet);$payload = '';if ($isPing = Packet::isSocketType($packet, 'ping')) {$payload .= Packet::PONG;}if ($isPing && $packetLength > 1) {$payload .= substr($packet, 1, $packetLength - 1);}if ($isPing) {$this->server->push($fd, $payload);}}
}
标准的websocket连接方式使用原生swoole处理即可
逻辑完成后
php think swoole
开启多服务时报错:swoole http server process is already running.
think\swoole\command\Server.php
注释掉
// if ($pidManager->isRunning()) {// $this->output->writeln('<error>swoole http server process is already running.</error>');// return;// }
示例逻辑
public function onMessage(Frame $frame){\go(function ()use($frame) {$redis = new \Redis();$redis->connect('127.0.0.1', 6379);$data=json_decode($frame->data);// var_dump($data);// if($data->con=='not_logged_in'){// //未登录// //存储房间信息// $redis->sAdd('room'.$data->roominfo->id,$frame->fd);// $redis->set('fd_roominfo'.$frame->fd,json_encode($data->roominfo));// }elseif($data->con=='already_logged_in'){// //已登录存储用户信息//1.提供user列表$redis->set('fd_userinfo'.$frame->fd,json_encode($data));//fd绑定info消息$redis->zAdd('user'.$data->roominfo->id,$frame->fd,json_encode($data));// 有序集合记录房间info列表信息$info=$redis->zRevRange('user'.$data->roominfo->id, 0, -1);//获取房间info列表信息//2.提供user单个信息// $redis->set('fd_userinfo'.$frame->fd,json_encode($data->userinfo));//fd绑定userinfo// $userinfo=$redis->get('fd_userinfo'.$frame->fd);//存储房间信息$redis->set('fd_roominfo'.$frame->fd,json_encode($data->roominfo));//fd绑定房间$redis->sAdd('room'.$data->roominfo->id,$frame->fd);//无序集合记录房间fd列表$room=$redis->sMembers('room'.$data->roominfo->id);//获取房间fd列表var_dump($room);$res=array('open'=>'1',//'data'=>['con'=>'open','msg'=>'发送成功','count'=>count($room),'info'=>json_decode($userinfo)]'data'=>['con'=>'open','msg'=>'发送成功','count'=>count($room),'info'=>$info]);}elseif($data->con=='already_logged_out'){$roominfo= json_decode($redis->get('fd_roominfo'.$frame->fd));//获取房间信息$redis->srem('room'.$roominfo->id,$frame->fd);//删除房间信息$room=$redis->sMembers('room'.$roominfo->id); //获取房间fd列表var_dump($room);//1.提供user列表$data=$redis->get('fd_userinfo'.$frame->fd);//获取关闭用户的info信息// var_dump($data);$a=$redis->zRem('user'.$roominfo->id,$data);// var_dump($a);$info=$redis->zRevRange('user'.$roominfo->id, 0, -1);$redis->del('fd_userinfo'.$frame->fd);//移除房间用户// var_dump($info);//2.提供user单个信息// $userinfo=$redis->get('fd_userinfo'.$frame->fd);// $redis->del('fd_userinfo'.$frame->fd);$res=array('open'=>'1',//'data'=>['con'=>'close',"count"=>count($room),'info'=>json_decode($userinfo)]'data'=>['con'=>'close','msg'=>'发送成功','count'=>count($room),'info'=>$info]);echo "队列{$frame->fd}关闭1\n";}\go(function ()use($res,$room) {$jsonStr = json_encode($res);foreach($room as $fd){$this->server->push($fd, $jsonStr); }});}
正规方式
转载请注明: 藏羚骸的博客~thinkphp6+swoole websocket使用教程自研路线不建议使用.
thinkphp6+swoole websocket使用教程自研路线不建议使用相关推荐
- ThinkPHP6+swoole+easywechat使用教程
前言 在结合think-swoole+easywechat扩展使用的时候,需要考虑curl兼容swoole携程问题,request兼容swoole框架,因为easywechat底层还是通过$_POST ...
- thinkphp 5.1 swoole扩展websocket使用教程
转载请注明: 藏羚骸的博客~thinkphp 5.1 swoole扩展websocket使用教程. 安装think-swoole ThinkPHP 5.1 安装命令 config/swoole.php ...
- PHP 接收 UDP包_php只能做网站?基于swoole+websocket开发双向通信应用
前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷.而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息.因此,一些实时性要求比较高的应用,如 ...
- Swoole Framework 入门教程(1)
Swoole Framework入门教程1 简介 Swoole为广大php 程序员带来了福音, 用一句话说 重新定义PHP, 底层用c扩展实现,配合PHP7 性能不弱于 golang ,并且还可以脱离 ...
- Swoole WebSocket服务使用Task任务详解 (面向对象方法)
Swoole WebSocket服务使用Task任务详解 (面向对象方法) 作者: 绝爱七八丶 博客: https://blog.csdn.net/qq_40193451 日期: 2018.8.24 ...
- 如何高效学习Python?Python入门 Python教程 Python学习路线
如何高效学习Python?Python入门 Python教程 Python学习路线 试想,这么好的回答,不读完岂不是后悔? Python岗位有哪些呢?主要的岗位有这些: Python全栈开发工程师(1 ...
- WebSocket菜鸟教程
WebSocket菜鸟教程 WebSocket菜鸟教程 看到这想必你了解了webscoket,基本文档原理就不提了! 这张图你能看明白吗?不能没事还有一张更简单的 搞懂这个图很关键,我们与人聊天不是在 ...
- 微信小程序之swoole/WebSocket创建聊天室(php)
一.php安装扩展组件Swoole 参考连接 二.配置linux服务器 在站点的配置文件中#SSL-END下面添加代码 location /wss/ {#通过配置端口指向部署websocker的项目 ...
- php swoole实例,Swoole WebSocket实例
Swoole WebSocket实例 Swoole WebSocket介绍 swoole-1.7.9 增加了内置的websocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的Web ...
最新文章
- 洛谷P3159 [CQOI2012]交换棋子
- python ftp文件传输服务端
- golang 协程同步 简介
- linux 编译错误 configure: error: no usable python found at /usr/bin/python2.7
- mysql isam参数优化_MySQL MyISAM优化设置点滴
- wxWidgets:wxCollapsiblePane类用法
- java 对象锁定_少锁定Java对象池
- 接口的定义与实现(重要)
- 王道 ——线程概念和多线程模型
- 由浅入深了解Thrift(一)——Thrift介绍与用法
- 3dm下载的都是linux游戏,3DM的游戏怎么下载和安装(没智商的小白用户)
- 领克车机2.0安装 app 方法,亲测有效
- JavaGuide--Java篇
- python判断闰年_python如何判断闰年
- 2019我依旧满腔热血,追寻爱与梦想
- 《JavaScript》条件运算符
- shopNC开发手册
- Qt ‘tr‘ was not declared in this scop
- 陈松松:新人做短视频项目,四步找准自己的定位
- CoreXY运动结构工作原理
热门文章
- 进军互联网该如何选择html模板?
- CSS3D导航栏翻转效果
- React使用Swiper实现3D coverflow 效果
- 树莓派摄像头无法识别 mmal
- Unable to determine the relationship represented by navigation ‘XXX‘ of type ‘XXX‘.
- 188数码管驱动案方案
- 关于新款macbook的vscode不能用‘!‘创建模板问题
- 利用全加器实现7段数码管_简单共阴极数码管电路图大全(CD4511/段译码/驱动器)...
- android mux协议,协议细节 - Mux.Cool - 《Project V(V2RAY)文档手册》 - 书栈网 · BookStack...
- python array类型取特定值