TP6的websocket实现

基于tp6,简单实现WebSocket,这一篇就够了。
学习路线

php
tp6(事件机制)
swoole的websocket实现
think-swoole在tp6中实现websocket
nginx代理
think-swoole (案例文档)

下面的代码,是假设在你对TP6的事件机制和swoole的websocket原生实现有所了解的基础上进行的。

websocket
websocket是出于osi模型应用层的长连接协议,允许全双工通信。更多websocket知识点—点击这里
websocket提供了一整套用API,查看详细文档—点击这里
swoole
swoole是PHP一套特别框架,是一个面向生产环境的 PHP 异步网络通信引擎,使 PHP 开发人员可以编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务。详细文档—点击这里
Nginx
nginx代理基本知识点。nginx反向代理如何实现。

代码实现
在应用根目录下创建事件订阅类

php think make:subscribe WebSocket

WebSocket.php

<?php
declare (strict_types = 1);namespace app\subscribe;use app\Request;
use Swoole\Server;
use Swoole\WebSocket\Frame;
use think\cache\driver\Redis;
use think\Container;class WebSocket
{protected $websocket = null;protected $server = null;public function __construct(Server $server, \think\swoole\Websocket $websocket, Container $container){$this->websocket = $websocket;//依赖注入的方式$this->server = $server;}public function onConnect(Request $request){}// 监听客户连接public function onOpen(Request $request){$fd = $this->websocket->getSender();// 获取连接标识$this->server->push($fd , 'something');// 发送给客户端}// 监听客户端发送消息public function onMessage(Server $server,Frame $frame){$fd = $frame->fd; // 为当前连接唯一值$msg = json_decode($frame->data , true) ;// 获取cli上传的消息,json格式$this->server->push($fd , $msg);// 发送给客户端}//onClose触发的事件public function onClose(){// 一般做一些资源释放的动作}
}

修改app/config/swoole.php配置文件,没有的话就去vender扩展里面找think-swoole的扩展文件复制出来

<?phpuse think\swoole\websocket\socketio\Handler;return ['server'     => ['host'      => env('SWOOLE_HOST', '127.0.0.1'), // 监听地址'port'      => env('SWOOLE_PORT', 9000), // 监听端口'mode'      => SWOOLE_PROCESS, // 运行模式 默认为SWOOLE_PROCESS'sock_type' => SWOOLE_SOCK_TCP, // sock type 默认为SWOOLE_SOCK_TCP'options'   => ['pid_file'              => runtime_path() . 'swoole.pid','log_file'              => runtime_path() . 'swoole.log','daemonize'             => false,// Normally this value should be 1~4 times larger according to your cpu cores.'reactor_num'           => swoole_cpu_num(),'worker_num'            => swoole_cpu_num(),'task_worker_num'       => swoole_cpu_num(),'enable_static_handler' => true,'document_root'         => root_path('public'),'package_max_length'    => 20 * 1024 * 1024,'buffer_output_size'    => 10 * 1024 * 1024,'socket_buffer_size'    => 128 * 1024 * 1024,],],'websocket'  => ['enable'        => true,// 启动websocket'ping_interval' => 25000,'ping_timeout'  => 60000,'room'          => ['type'  => 'table','table' => ['room_rows'   => 4096,'room_size'   => 2048,'client_rows' => 8192,'client_size' => 2048,],'redis' => ['host'          => '127.0.0.1','port'          => 6379,'max_active'    => 3,'max_wait_time' => 5,],],'listen'        => [],'subscribe'     => [app\subscribe\WebSocketEvent::class],],'rpc'        => ['server' => ['enable'   => false,'port'     => 9000,'services' => [],],'client' => [],],'hot_update' => ['enable'  => env('APP_DEBUG', false),'name'    => ['*.php'],'include' => [app_path()],'exclude' => [],],//连接池'pool'       => ['db'    => ['enable'        => true,'max_active'    => 3,'max_wait_time' => 5,],'cache' => ['enable'        => true,'max_active'    => 3,'max_wait_time' => 5,],//自定义连接池],'coroutine'  => ['enable' => true,'flags'  => SWOOLE_HOOK_ALL,],'tables'     => [],//每个worker里需要预加载以共用的实例'concretes'  => [],//重置器'resetters'  => [],//每次请求前需要清空的实例'instances'  => [],//每次请求前需要重新执行的服务'services'   => [],
];

在根目录下执行

php think swoole启动监听

如果启动失败,根据提示信息修改
如果前端连接失败,一般是被nginx或防火墙拦截了。
前端html测试文件

<!doctype html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1, maximum-scale=1, user-scalable=no"><title>websocket</title></head><body><input id="text" value=""><input type="submit" value="send" onclick="start()"><input type="submit" value="close" onclick="close()">
<div id="msg"></div><script>/***0:未连接*1:连接成功,可通讯*2:正在关闭*3:连接已关闭或无法打开*///创建一个webSocket 实例var webSocket  = new  WebSocket("ws://127.0.0.1:9000");webSocket.onerror = function (event){onError(event);};// 打开websocketwebSocket.onopen = function (event){onOpen(event);};//监听消息webSocket.onmessage = function (event){onMessage(event);};webSocket.onclose = function (event){onClose(event);}//关闭监听websocketfunction onError(event){document.getElementById("msg").innerHTML = "<p>close</p>";console.log("error"+event.data);};function onOpen(event){console.log("open:"+sockState());document.getElementById("msg").innerHTML = "<p>Connect to Service</p>";};function onMessage(event){console.log("onMessage");document.getElementById("msg").innerHTML += "<p>response:"+event.data+"</p>"};function onClose(event){document.getElementById("msg").innerHTML = "<p>close</p>";console.log("close:"+sockState());webSocket.close();}function sockState(){var status = ['未连接','连接成功,可通讯','正在关闭','连接已关闭或无法打开'];return status[webSocket.readyState];}function start(event){console.log(webSocket);var msg = document.getElementById('text').value;document.getElementById('text').value = '';console.log("send:"+sockState());console.log("msg="+msg);webSocket.send("msg="+msg);document.getElementById("msg").innerHTML += "<p>request"+msg+"</p>"};function close(event){webSocket.close();}</script></body>
</html>
服务端
前端

think-swoole,tp6的websocket实现相关推荐

  1. swoole 1.79 websocket 聊天室 基于swoole_server

    基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href=&quo ...

  2. Swoole实现基于WebSocket的群聊私聊

    本文属于入门级文章,大佬们可以绕过啦.如题,本文会实现一个基于Swoole的websocket聊天室(可以群聊,也可以私聊,具体还需要看数据结构的设计). 搭建Swoole环境 通过包管理工具 # 安 ...

  3. Swoole基础知识,安装,websocket应用及各种问题详解

    1. swoole基础-概述 Swoole基础课程正式推出!零基础开始,让你循环渐进的掌握swoole. 传统的phper们大部分都是用于开发web应用程序,并且大部分都是在用类似yii\larave ...

  4. swoole服务器主动推消息,实现websocket-主动消息推送laravelswoole

    实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中监听传送的消息进行做相对于的业务逻辑. 主动消息推送实现 ...

  5. websocket 历史及使用详解

    一.阅前热身 什么是keep-alive 1.keep-alive只是客户端的一种建议 我们打开百度首页,进一步查看header. image_1b2idfp2k4ecu8pagh1mkutf39.p ...

  6. 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(nginx配置篇章)

    laravel项目中的配置  原文出处:https://laravelacademy.org/post/19700.html,感谢原文作者让laravel这款可爱的php框架,进入了高并发的殿堂 如果 ...

  7. 通过webSocket实现app产生的数据在网页实时显示

    一概述 ## 在项目中有这样一个需要,app为智能心电跑步类app,在跑步时需要在网页端显示用户的跑步信息,包括跑步时长.心率.心电图等,其中心电图是需要实时更新的.当用户开始跑步时在网页上显示这些信 ...

  8. 通过webSocket实现app运动数据在网页实时显示

    一概述 ## 在项目中有这样一个需要,app为智能心电跑步类app,在跑步时需要在网页端显示用户的跑步信息,包括跑步时长.心率.心电图等,其中心电图是需要实时更新的.当用户开始跑步时在网页上显示这些信 ...

  9. php swoole 视频直播_swoole如何实现直播

    swoole如何实现直播? swoole做直播具体步骤:(带摄像头的笔记本) 1.Swoole创建 2个监听 一个WebSocket监听服务(用于视频流传输).一个本地 [Unix Socket文件描 ...

最新文章

  1. 2013上半年-学习目录
  2. Ubuntu中安装配置和卸载FTP(转)
  3. makefile常见伪目标(.PHONY 不会去检查目标文件)
  4. linux系统的4个部分,以下是Linux文件系统的4个相关的结构定义中的一部分: Struct i..._考试资料网...
  5. SpringMVC视图解析器
  6. 携程发布2021第三季度财报:营收53亿元 国际国内旅游市场“攻守”同发力
  7. Kotlin入门(6)条件分支的实现
  8. docker host模式拿到nginx远程ip端口_docker网络模式实战
  9. python 3d游戏脚本_3ds Max python脚本编写及部分API介绍
  10. java 麻将小程序_麻将小程序麻将这么玩
  11. 计算机网络图标打不开怎么回事,双击打不开图标怎么办 双击打不开图标解决方法【详解】...
  12. awl伪装MAC地址进行多线程SYN攻击
  13. vue项目通讯录_vue 自定义组件实现通讯录功能
  14. 同事写了一个责任链模式,bug无数...
  15. python求梅森尼数_梅森尼数
  16. 妈蛋!HR你搞我,我的缺点就是身体不好不能加班,怎么了?
  17. 串口TXD和RXD的线序导致不能通信的问题
  18. 群晖php7.0,群晖新版操作系统DSM 7.0下载
  19. Spring boot在线客服系统源码 在线坐席对话源码
  20. 用HTML和CSS3制作3D动画

热门文章

  1. 如何在WordPress中显示链接的实时预览
  2. 腾讯2018秋招笔试真题(2)
  3. 字符对应的URL编码值集合
  4. 优化算法|MOAVOA:一种新的多目标人工秃鹰优化算法(Matlab代码实现)
  5. if 嵌套if 多重if结构
  6. 每日LeetCode一道题————有效的数独
  7. python+opencv实现人脸识别|采用现成训练好的模型
  8. 在linux上安装微信
  9. 协议篇————3、DUP协议详解
  10. 晕LIVEnbsp;WRITER设置教程是网易…