转载请注明: 藏羚骸的博客~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使用教程自研路线不建议使用相关推荐

  1. ThinkPHP6+swoole+easywechat使用教程

    前言 在结合think-swoole+easywechat扩展使用的时候,需要考虑curl兼容swoole携程问题,request兼容swoole框架,因为easywechat底层还是通过$_POST ...

  2. thinkphp 5.1 swoole扩展websocket使用教程

    转载请注明: 藏羚骸的博客~thinkphp 5.1 swoole扩展websocket使用教程. 安装think-swoole ThinkPHP 5.1 安装命令 config/swoole.php ...

  3. PHP 接收 UDP包_php只能做网站?基于swoole+websocket开发双向通信应用

    前言 众所周知,PHP用于开发基于HTTP协议的网站应用非常便捷.而HTTP协议是一种单向的通信协议,只能接收客户端的请求,然后响应请求,不能主动向客户端推送信息.因此,一些实时性要求比较高的应用,如 ...

  4. Swoole Framework 入门教程(1)

    Swoole Framework入门教程1 简介 Swoole为广大php 程序员带来了福音, 用一句话说 重新定义PHP, 底层用c扩展实现,配合PHP7 性能不弱于 golang ,并且还可以脱离 ...

  5. Swoole WebSocket服务使用Task任务详解 (面向对象方法)

    Swoole WebSocket服务使用Task任务详解 (面向对象方法) 作者: 绝爱七八丶 博客: https://blog.csdn.net/qq_40193451 日期: 2018.8.24 ...

  6. 如何高效学习Python?Python入门 Python教程 Python学习路线

    如何高效学习Python?Python入门 Python教程 Python学习路线 试想,这么好的回答,不读完岂不是后悔? Python岗位有哪些呢?主要的岗位有这些: Python全栈开发工程师(1 ...

  7. WebSocket菜鸟教程

    WebSocket菜鸟教程 WebSocket菜鸟教程 看到这想必你了解了webscoket,基本文档原理就不提了! 这张图你能看明白吗?不能没事还有一张更简单的 搞懂这个图很关键,我们与人聊天不是在 ...

  8. 微信小程序之swoole/WebSocket创建聊天室(php)

     一.php安装扩展组件Swoole 参考连接 二.配置linux服务器 在站点的配置文件中#SSL-END下面添加代码 location /wss/ {#通过配置端口指向部署websocker的项目 ...

  9. php swoole实例,Swoole WebSocket实例

    Swoole WebSocket实例 Swoole WebSocket介绍 swoole-1.7.9 增加了内置的websocket服务器支持,通过几行PHP代码就可以写出一个异步非阻塞多进程的Web ...

最新文章

  1. 洛谷P3159 [CQOI2012]交换棋子
  2. python ftp文件传输服务端
  3. golang 协程同步 简介
  4. linux 编译错误 configure: error: no usable python found at /usr/bin/python2.7
  5. mysql isam参数优化_MySQL MyISAM优化设置点滴
  6. wxWidgets:wxCollapsiblePane类用法
  7. java 对象锁定_少锁定Java对象池
  8. 接口的定义与实现(重要)
  9. 王道 ——线程概念和多线程模型
  10. 由浅入深了解Thrift(一)——Thrift介绍与用法
  11. 3dm下载的都是linux游戏,3DM的游戏怎么下载和安装(没智商的小白用户)
  12. 领克车机2.0安装 app 方法,亲测有效
  13. JavaGuide--Java篇
  14. python判断闰年_python如何判断闰年
  15. 2019我依旧满腔热血,追寻爱与梦想
  16. 《JavaScript》条件运算符
  17. shopNC开发手册
  18. Qt ‘tr‘ was not declared in this scop
  19. 陈松松:新人做短视频项目,四步找准自己的定位
  20. CoreXY运动结构工作原理

热门文章

  1. 进军互联网该如何选择html模板?
  2. CSS3D导航栏翻转效果
  3. React使用Swiper实现3D coverflow 效果
  4. 树莓派摄像头无法识别 mmal
  5. Unable to determine the relationship represented by navigation ‘XXX‘ of type ‘XXX‘.
  6. 188数码管驱动案方案
  7. 关于新款macbook的vscode不能用‘!‘创建模板问题
  8. 利用全加器实现7段数码管_简单共阴极数码管电路图大全(CD4511/段译码/驱动器)...
  9. android mux协议,协议细节 - Mux.Cool - 《Project V(V2RAY)文档手册》 - 书栈网 · BookStack...
  10. python array类型取特定值