首页 » 网站建设 » Php编写websoket技巧_Laravel中运用swoole项目实战开拓案例一 建立swoole和前端通信

Php编写websoket技巧_Laravel中运用swoole项目实战开拓案例一 建立swoole和前端通信

访客 2024-11-28 0

扫一扫用手机浏览

文章目录 [+]

工欲善其事,必先利其器。
在正式开拓之前我们检讨好须要安装的拓展,不要开拓中创造这些问题,打断思路影响我们的开拓效率。

安装 swoole 拓展包安装 redis 拓展包安装 laravel5.5 版本以上

如果你还不会用swoole就out了

Php编写websoket技巧_Laravel中运用swoole项目实战开拓案例一 建立swoole和前端通信

如果喜好我的文章,想与一群资深开拓者一起互换学习的话,获取更多干系大厂口试咨询和辅导,关注我或点击此处2 Laravel 天生命令行php artisan make:command SwooleDemo

class SwooleDemo extends Command{protected $signature = 'swoole:demo';protected $description = '这是关于swoole的一个测试demo';public function __construct(){ parent::__construct();}public function handle(){ $this->line("hello world");}}

我们分别运行 php artisan 指令和 php artisan swoole:demo 会看到关于这个命令的解释,和输出 hello world。
(laravel 命令行用法详解)

Php编写websoket技巧_Laravel中运用swoole项目实战开拓案例一 建立swoole和前端通信
(图片来自网络侵删)

本课程为swoole入门教程,通过从swoole的安装讲到swoole-tcp、同步客户端、异步客户端、udp到做事端客户端等技能,同时每一小结理论配套干系商业项目实战案例,增加学习效果,达到闇练节制并利用。

喜好我的文章可以找我要进阶资料,助力你达到30K

3 命令行逻辑代码编写一个最根本的 swoole 命令行逻辑代码

<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;use Illuminate\Support\Facades\Redis;class SwooleDemo extends Command{ // 命令名称 protected $signature = 'swoole:demo'; // 命令解释 protected $description = '这是关于swoole websocket的一个测试demo'; // swoole websocket做事 private static $server = null; public function __construct() { parent::__construct(); } // 入口 public function handle() { $this->redis = Redis::connection('websocket'); $server = self::getWebSocketServer(); $server->on('open',[$this,'onOpen']); $server->on('message', [$this, 'onMessage']); $server->on('close', [$this, 'onClose']); $server->on('request', [$this, 'onRequest']); $this->line("swoole做事启动成功 ..."); $server->start(); } // 获取做事 public static function getWebSocketServer() { if (!(self::$server instanceof \swoole_websocket_server)) { self::setWebSocketServer(); } return self::$server; } // 做事处始设置 protected static function setWebSocketServer():void { self::$server = new \swoole_websocket_server("0.0.0.0", 9502); self::$server->set([ 'worker_num' => 1, 'heartbeat_check_interval' => 60, // 60秒检测一次 'heartbeat_idle_time' => 121, // 121秒没活动的 ]); } // 打开swoole websocket做事回调代码 public function onOpen($server, $request) { if ($this->checkAccess($server, $request)) {\ self::$server->push($request->fd,"打开swoole做事成功!
");\ } } // 给swoole websocket 发送回调代码 public function onMessage($server, $frame) { } // http要求swoole websocket 回调代码 public function onRequest($request,$response) { } // websocket 关闭回调代码 public function onClose($serv,$fd) { $this->line("客户端 {$fd} 关闭"); } // 校验客户端连接的合法性,无效的连接不许可连接 public function checkAccess($server, $request):bool { $bRes = true; if (!isset($request->get) || !isset($request->get['token'])) { self::$server->close($request->fd); $this->line("接口验证字段不全"); $bRes = false; } else if ($request->get['token'] !== "123456") { $this->line("接口验证缺点"); $bRes = false; } return $bRes; } // 启动websocket做事 public function start() { self::$server->start(); }}

编写 websoket js 代码

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>swoole测试</title> <meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"></head><body><h1>这是一个测试</h1></body><script> var ws;//websocket实例 var lockReconnect = false;//避免重复连接 var wsUrl = 'ws://{{$_SERVER["HTTP_HOST"]}}:9502?page=home&token=123456'; function initEventHandle() { ws.onclose = function () { reconnect(wsUrl); }; ws.onerror = function () { reconnect(wsUrl); }; ws.onopen = function () { //心跳检测重置 heartCheck.reset().start(); }; ws.onmessage = function (event) { //如果获取到,心跳检测重置 //拿到任何都解释当前连接是正常的 var data = JSON.parse(event.data); heartCheck.reset().start(); } } createWebSocket(wsUrl); / 创建链接 @param url / function createWebSocket(url) { try { ws = new WebSocket(url); initEventHandle(); } catch (e) { reconnect(url); } } function reconnect(url) { if(lockReconnect) return; lockReconnect = true; //没连接上会一贯重连,设置延迟避免要求过多 setTimeout(function () { createWebSocket(url); lockReconnect = false; }, 2000); } //心跳检测 var heartCheck = { timeout: 60000,//60秒 timeoutObj: null, serverTimeoutObj: null, reset: function(){ clearTimeout(this.timeoutObj); clearTimeout(this.serverTimeoutObj); return this; }, start: function(){ var self = this; this.timeoutObj = setTimeout(function(){ //这里发送一个心跳,后端收到后,返回一个心跳, //onmessage拿到返回的心跳就解释连接正常 ws.send("heartbeat"); self.serverTimeoutObj = setTimeout(function(){//如果超过一定韶光还没重置,解释后端主动断开了 ws.close();//如果onclose会实行reconnect,我们实行ws.close()就行了.如果直接实行reconnect 会触发onclose导致重连两次 }, self.timeout); }, this.timeout); }, header:function(url) { window.location.href=url } }</script></html>

相关文章

微信第三方登录便捷与安全的完美融合

社交平台已成为人们日常生活中不可或缺的一部分。微信作为我国最受欢迎的社交软件之一,拥有庞大的用户群体。为了方便用户在不同平台间切换...

网站建设 2025-02-18 阅读1 评论0

广东高速代码表解码高速公路管理智慧

高速公路作为国家交通动脉,连接着城市与城市,承载着巨大的物流和人流。广东作为我国经济大省,高速公路网络密布,交通流量巨大。为了更好...

网站建设 2025-02-18 阅读1 评论0