think-swoole,tp6的websocket实现
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实现相关推荐
- swoole 1.79 websocket 聊天室 基于swoole_server
基于 swoole 1.79 swoole_server 写的 websocket 网页聊天室,基本功能,以供参考 所需环境 php swoole 1.79 redis <a href=&quo ...
- Swoole实现基于WebSocket的群聊私聊
本文属于入门级文章,大佬们可以绕过啦.如题,本文会实现一个基于Swoole的websocket聊天室(可以群聊,也可以私聊,具体还需要看数据结构的设计). 搭建Swoole环境 通过包管理工具 # 安 ...
- Swoole基础知识,安装,websocket应用及各种问题详解
1. swoole基础-概述 Swoole基础课程正式推出!零基础开始,让你循环渐进的掌握swoole. 传统的phper们大部分都是用于开发web应用程序,并且大部分都是在用类似yii\larave ...
- swoole服务器主动推消息,实现websocket-主动消息推送laravelswoole
实现一个可以主动触发消息推送的功能,这个可以实现向模板消息那个,给予所有成员发送自定义消息,而不需要通过客户端发送消息,服务端上message中监听传送的消息进行做相对于的业务逻辑. 主动消息推送实现 ...
- websocket 历史及使用详解
一.阅前热身 什么是keep-alive 1.keep-alive只是客户端的一种建议 我们打开百度首页,进一步查看header. image_1b2idfp2k4ecu8pagh1mkutf39.p ...
- 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(nginx配置篇章)
laravel项目中的配置 原文出处:https://laravelacademy.org/post/19700.html,感谢原文作者让laravel这款可爱的php框架,进入了高并发的殿堂 如果 ...
- 通过webSocket实现app产生的数据在网页实时显示
一概述 ## 在项目中有这样一个需要,app为智能心电跑步类app,在跑步时需要在网页端显示用户的跑步信息,包括跑步时长.心率.心电图等,其中心电图是需要实时更新的.当用户开始跑步时在网页上显示这些信 ...
- 通过webSocket实现app运动数据在网页实时显示
一概述 ## 在项目中有这样一个需要,app为智能心电跑步类app,在跑步时需要在网页端显示用户的跑步信息,包括跑步时长.心率.心电图等,其中心电图是需要实时更新的.当用户开始跑步时在网页上显示这些信 ...
- php swoole 视频直播_swoole如何实现直播
swoole如何实现直播? swoole做直播具体步骤:(带摄像头的笔记本) 1.Swoole创建 2个监听 一个WebSocket监听服务(用于视频流传输).一个本地 [Unix Socket文件描 ...
最新文章
- 2013上半年-学习目录
- Ubuntu中安装配置和卸载FTP(转)
- makefile常见伪目标(.PHONY 不会去检查目标文件)
- linux系统的4个部分,以下是Linux文件系统的4个相关的结构定义中的一部分: Struct i..._考试资料网...
- SpringMVC视图解析器
- 携程发布2021第三季度财报:营收53亿元 国际国内旅游市场“攻守”同发力
- Kotlin入门(6)条件分支的实现
- docker host模式拿到nginx远程ip端口_docker网络模式实战
- python 3d游戏脚本_3ds Max python脚本编写及部分API介绍
- java 麻将小程序_麻将小程序麻将这么玩
- 计算机网络图标打不开怎么回事,双击打不开图标怎么办 双击打不开图标解决方法【详解】...
- awl伪装MAC地址进行多线程SYN攻击
- vue项目通讯录_vue 自定义组件实现通讯录功能
- 同事写了一个责任链模式,bug无数...
- python求梅森尼数_梅森尼数
- 妈蛋!HR你搞我,我的缺点就是身体不好不能加班,怎么了?
- 串口TXD和RXD的线序导致不能通信的问题
- 群晖php7.0,群晖新版操作系统DSM 7.0下载
- Spring boot在线客服系统源码 在线坐席对话源码
- 用HTML和CSS3制作3D动画