当前位置: 首页 > news >正文

【旧文搬运】为你的 Laravel 应用添加一个基于 Swoole 的 WebSocket 服务

做了一个基于 Swoole 的 WebSocket 扩展包,可以用来做实时状态推送,或者自定义消息处理实现 im,有需要的可以看看: [giorgio-socket]

在这里插入图片描述

使用方法

安装

安装扩展包

composer require wu/giorgio-socket

发布配置文件

php artisan vendor:publish --provider="GiorgioSocket\Providers\SocketServiceProvider"

运行 Socket 服务

php artisan socket:start

注意事项

  • 可以通过实现 GiorgioSocket\Services\Handlers\Interfaces 下的接口类来自定义自己的业务逻辑。

  • 如果要从服务端发送消息,这里有两种方式:

    • 第一种,借助 Laravel HTTP 客户端
      Route::get('/socket', function () {\Illuminate\Support\Facades\Http::asForm()->post('http://127.0.0.1:9501', ['to' => 2,'message' => 'server message',]);
      });
      
    • 第二种:借助 Laravel Listener,需要将 .env 文件中的 QUEUE_CONNECTION 配置修改为 redis 或其他异步队列。配置更改后,运行以下命令:php-artisan queue:work --queue=socket-listener监听队列,然后按以下代码调用 event
      Route::any('socket', function (Request $request){\GiorgioSocket\Events\SocketEvent::dispatch($request->get('to'), $request->get('message'));
      });
      
  • 如果你正在使用 laravel/breeze 扩展包,并且使用了 Blade 模板,可以将以下代码粘贴到 dashboard.blade.php 中进行快速测试:

      @auth<div class="py-12"><div class="max-w-7xl mx-auto sm:px-6 lg:px-8"><div class="bg-white dark:bg-gray-800 overflow-hidden shadow-sm sm:rounded-lg"><div class="grid grid-cols-1 md:grid-cols-2"><div class="p-6" id="server-message">messages:<br/></div><div class="p-6"><label class="block font-medium text-sm text-gray-700 dark:text-gray-300" for="from">from</label><input class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm block mt-1 w-full" value="{{ auth()->user()->getKey() }}" id="from"><label class="block font-medium text-sm text-gray-700 dark:text-gray-300" for="to">to</label><input class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm block mt-1 w-full" value="" id="to"><label class="block font-medium text-sm text-gray-700 dark:text-gray-300" for="message">message</label><textarea class="border-gray-300 dark:border-gray-700 dark:bg-gray-900 dark:text-gray-300 focus:border-indigo-500 dark:focus:border-indigo-600 focus:ring-indigo-500 dark:focus:ring-indigo-600 rounded-md shadow-sm block mt-1 w-full" id="message"></textarea><input class="inline-flex items-center px-4 py-2 bg-gray-800 dark:bg-gray-200 border border-transparent rounded-md font-semibold text-xs text-white dark:text-gray-800 uppercase tracking-widest hover:bg-gray-700 dark:hover:bg-white focus:bg-gray-700 dark:focus:bg-white active:bg-gray-900 dark:active:bg-gray-300 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 dark:focus:ring-offset-gray-800 transition ease-in-out duration-150 mt-3" type="button" id="submit" value="submit"></div></div></div></div></div><script type="text/javascript">let heartBeatTimer = 0;let socket = connectWebSocket();function startHeartbeat(interval) {interval = interval || 30;heartBeatTimer = setInterval(function () {sendMessage(null, "heart_beat");}, interval * 1000);}function stopHeartbeat() {clearInterval(heartBeatTimer);}function connectWebSocket() {const wsServer = 'ws://127.0.0.1:9501';const socket = new WebSocket(wsServer);let userId = document.getElementById('from').value;socket.onopen = function (evt) {let data = {user_id: userId,type: 'connect'};console.log('open', data)socket.send(JSON.stringify(data));};socket.onmessage = function (evt) {console.log('get message from server: ' + evt.data);if (evt.data !== 'heart_beat') {let data = JSON.parse(evt.data);let message = document.getElementById("server-message")message.innerHTML += data.user_name + ': ' + data.data + '<br/>'}};socket.onerror = function (evt) {console.log(evt);};socket.onclose = function () {let data = {user_id: userId,type: 'close'};socket.send(JSON.stringify(data));};return socket;}function sendMessage(to, message) {if (socket != null && socket.readyState === WebSocket.OPEN) {if (message !== 'heart_beat') {let messageBox = document.getElementById("server-message")messageBox.innerHTML += 'me: ' + message + '<br/>'}let from = document.getElementById("from")socket.send(JSON.stringify({user_id: from.value,user_name: '{{ auth()->user()->name }}',to: to,type: 'message',data: message,}));console.log("webSocket send message:" + JSON.stringify({user_id: from.value,user_name: '{{ auth()->user()->name }}',to: to,type: 'message',data: message,}));} else {console.log("webSocket closed");}}let button = document.getElementById("submit");button.addEventListener('click', function () {let message = document.getElementById("message");let to = document.getElementById("to");sendMessage(to.value, message.value)});</script>@endauth
    

    如有任何疑问,欢迎提交 [issue]

相关文章:

【旧文搬运】为你的 Laravel 应用添加一个基于 Swoole 的 WebSocket 服务

做了一个基于 Swoole 的 WebSocket 扩展包&#xff0c;可以用来做实时状态推送&#xff0c;或者自定义消息处理实现 im&#xff0c;有需要的可以看看: [giorgio-socket] 使用方法 安装 安装扩展包 composer require wu/giorgio-socket发布配置文件 php artisan vendor:pu…...

vue项目从后端下载文件显示进度条或者loading

//API接口 export const exportDownload (params?: Object, peCallback?: Function) > {return new Promise((resolve, reject) > {axios({method: get,url: ,headers: {access_token: ${getToken()},},responseType: blob,params,onDownloadProgress: (pe) > {peC…...

[技巧]Arcgis之图斑四至点批量计算

前言 上一篇介绍了arcgis之图斑四至范围计算&#xff0c;这里介绍的图斑四至点的计算及获取&#xff0c;两者之间还是有差异的。 [技巧]Arcgis之图斑四至范围计算 这里说的四至点指的是图斑最东、最西、最南、最北的四个地理位置点坐标&#xff0c;如下图&#xff1a; 四至点…...

【java】20:枚举

枚举的二种实现方式 1) 自定义类实现枚举 2) 使用 enum 关键字实现枚举 自定义实现枚举&#xff1a; 1.不需要提供setXxx方法&#xff0c;因为枚举对象值通常为只读. 2.对枚举对象/属性使用final static共同修饰&#xff0c;实现底层优化. 3.枚举对象名通常使用全部大写&…...

★【二叉搜索树(中序遍历特性)】【 ★递归+双指针】Leetcode 98. 验证二叉搜索树

★【二叉搜索树&#xff08;中序遍历特性&#xff09;】【 ★递归双指针】Leetcode 98. 验证二叉搜索树 二叉搜索树 98. 验证二叉搜索树解法1 笨 中序递归遍历为一个数组 然后判断数组是不是升序排列就可以★解法2 不使用数组 递归法 ---------------&#x1f388;&#x1f38…...

打造无缝滚动体验:JavaScript中的scrollIntoView()方法实战指南

在现代Web开发中&#xff0c;提升用户体验是至关重要的。通过JavaScript的scrollIntoView()方法&#xff0c;我们可以为用户创造出流畅而令人愉悦的滚动体验。本文将深入研究scrollIntoView()的强大功能&#xff0c;并结合实例演示如何在项目中巧妙应用&#xff0c;以打造出无缝…...

实战:如何将Oracle单实例数据库转换成Oracle RAC数据库

导读 本文介绍如何将Oracle单实例数据库转换成Oracle RAC数据库 环境说明&#xff1a; 数据库节点2上有个单实例数据库zlxdb2&#xff0c;现在要将zlxdb2转换成RAC数据库&#xff0c;RAC数据库的两个实例分别是lzydb1和lzydb2。 以下是详细的操作步骤&#xff1a; 1、查看zlxdb…...

基于华为atlas的分类模型实战

分类模型选用基于imagenet训练的MobileNetV3模型&#xff0c;分类类别为1000类。 pytorch模型导出为onnx&#xff1a; 修改mobilenetv3.py中网络结构&#xff0c;模型选用MobileNetV3_Small模型&#xff0c;网络输出节点增加softmax层&#xff0c;将原始的return self.linear4…...

编程语言:SQL Server数据库使用教程,SQL Server增删改查语句

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全自学教程》 SQL Server是微软提供的一种关系型数据库&#xff0c…...

【tableau学习笔记】tableau无法连接数据源

【tableau学习笔记】tableau无法连接数据源 背景&#xff1a; 学校讲到Tableau&#xff0c;兴奋下载Kaggle Excel&#xff0c;一看后缀CSV&#xff0c;导入Tableau发现报错“tableau无法连接数据源”&#xff0c;自作聪明改为后缀XLSX&#xff0c;bug依旧。 省流&#xff1a…...

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…...

无极低码:无极低码部署版操作指南

无极低码 &#xff1a;https://wheart.cn 无极低码是一个面向开发者的工具&#xff0c;旨在为开发者、创业者或研发企业&#xff0c;提供快速&#xff0c;高效&#xff0c;标准化&#xff0c;可定制&#xff0c;私有化部署的平台&#xff0c;在兼顾开发速度的同时&#xff0c;兼…...

C语言实现日本某地发生了一件谋杀案

题目 猜凶手 题目内容&#xff1a; 日本某地发生了一件谋杀案&#xff0c;警察通过排查确定杀人凶手必为4个嫌疑犯的一个。 以下为4个嫌疑犯的供词: A说&#xff1a;不是我。 B说&#xff1a;是C。 C说&#xff1a;是D。 D说&#xff1a;C在胡说 已知3个人说了真话&…...

【C++】const成员

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 前言2. const成员3. 取地址及const取地址操作符重载 1. 前言 在之前已经已经分享过了关于 【C】类和对象之常引用与运算符重载&#xff0c;这次分享的有关const的内容&#xff0c;话不多说&#xff0c;正文开始。…...

利用小蜜蜂AI智能问答ChatGPT+AI高清绘图生成图文故事案例

利用小蜜蜂AI智能问答ChatGPTAI高清绘图生成图文故事案例 这段时间利用小蜜蜂AI网站做了一些编程、绘图以及数据分析方面的案例。再过几个月&#xff0c;我的大孙子就要出生了。我要用小蜜蜂AI智能问答和AI高清绘图为大孙子生成一个1-9的数字图文故事。 小蜜蜂AI网站可以扫如…...

Github项目推荐-LightMirrors

项目地址 https://github.com/NoCLin/LightMirrors 项目简述 “LightMirrors是一个开源的缓存镜像站服务&#xff0c;用于加速软件包下载和镜像拉取。目前支持DockerHub、PyPI、PyTorch、NPM等镜像缓存服务。 当前项目仍处于早期阶段。”–来自项目说明。 也就是说&#xff…...

day14:栈排序

问题描述&#xff1a; 栈排序。 编写程序&#xff0c;对栈进行排序使最小元素位于栈顶。最多只能使用一个其他的临时栈存放数据&#xff0c;但不得将元素复制到别的数据结构&#xff08;如数组&#xff09;中。该栈支持如下操作&#xff1a;push、pop、peek 和 isEmpty。当栈…...

【LeetCode:2368. 受限条件下可到达节点的数目 + BFS】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

pyorbbecsdk奥比中光python版本SDK在Windows下环境配置笔记

1、概述 Orbbec SDK Python Wrapper基于Orbbec SDK进行设计封装&#xff0c;主要实现数据流接收&#xff0c;设备指令控制。 2、系统要求 2.1、操作系统 Windows&#xff1a;Windows 10 (x64)&#xff08;本文 针对windows&#xff09;Linux: 18.04/20.04/22.04 (x64)Arm32:…...

YOLOV8介绍

原文链接&#xff1a; 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署&#xff08;实战&#xff09;&#xff08;&#xff09;有具体部署和训练实现代码YOLOV8模型训练部署&#xff08;实战&#xff09;&…...

终极指南:5分钟快速配置OpenTabletDriver开源数位板驱动

终极指南&#xff1a;5分钟快速配置OpenTabletDriver开源数位板驱动 【免费下载链接】OpenTabletDriver Open source, cross-platform, user-mode tablet driver 项目地址: https://gitcode.com/gh_mirrors/op/OpenTabletDriver 还在为昂贵的数位板驱动软件发愁吗&#…...

亚马逊停止旧款 Kindle 支持,用户与市场面临新变局

2026 年旧款 Kindle 告别 Kindle 商店亚马逊宣布从 2026 年 5 月 20 日起&#xff0c;停止对 2013 年前发布的 Kindle 电子阅读器和 Fire 平板电脑的支持。届时&#xff0c;这些设备将无法访问 Kindle 商店&#xff0c;不能借阅、购买或下载新书籍&#xff0c;但仍可阅读设备上…...

【万字文档+源码】基于springboot与vue海鲜市场系统-计算机项目设计学习

基于springboot与vue海鲜市场系统1.项目简介 管理员的功能是对用户和商家的信息进行监管&#xff0c;使得管理员能够管理用户、商家、海鲜分类等&#xff0c;并可以对这些进行修改和删除等来保证系统的整体运行。 用户的功能有可以去浏览系统首页和商品的信息&#xff0c;查看…...

5分钟搞定万字提示词的底层方法论是什么?

最近有很多人想问六哥写提示词的方法论是什么&#xff1f;兄弟&#xff0c;你想学写提示词&#xff1f;说实话&#xff0c;大家赚钱都不容易&#xff0c;千万别走弯路去背什么“提示词语法”或“代码公式”。六哥写提示词的核心方法论就四个字&#xff1a;“借势喂养”。高质量…...

WPF新手村教程(七)—— 终章(MVVM架构初见杀)姑

1. 哑铃图是什么&#xff1f; 哑铃图&#xff08;Dumbbell Plot&#xff09;&#xff0c;有时也称为DNA图或杠铃图&#xff0c;是一种用于比较两个相关数据点的可视化图表。 它源于人们对更有效数据比较方式的持续探索。 在传统的时间序列比较中&#xff0c;我们通常使用两条折…...

BetterNCM-Installer技术指南:从部署到定制的全方位解决方案

BetterNCM-Installer技术指南&#xff1a;从部署到定制的全方位解决方案 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 核心功能解析 1.1 插件架构概览 痛点&#xff1a;用户常因不…...

速成正果经

慈于一切众生&#xff0c;恭敬一切众生&#xff0c;以所有世界永远无苦为方向&#xff0c;以顺一切众生的愿为方向&#xff0c;以增一切众生的慧为方向&#xff0c;以增一切众生的智为方向&#xff0c;以健一切众生的体为方向&#xff0c;以促进一切众生内心舒畅为方向&#xf…...

AI图文识别 VS 人类学习|后Transformer时代

AI怎么识别是哪部小说总结前置&#xff1a; 视觉编码器负责把图片“翻译”成一种数学语言&#xff08;向量&#xff09;&#xff0c;告诉大模型&#xff1a;“嘿&#xff0c;这里有一堆黑线条组成了这种形状”。然后大模型根据它的知识库反应过来&#xff1a;“哦&#xff0c;这…...

AMD Ryzen硬件调试终极指南:SMUDebugTool深度解析与实战手册

AMD Ryzen硬件调试终极指南&#xff1a;SMUDebugTool深度解析与实战手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

观点_倒计时4年!Gartner重磅发布《2026网络安全6大趋势》,AI失控、量子威胁已逼近企业生命线

观点|倒计时4年&#xff01;Gartner重磅发布《2026网络安全6大趋势》&#xff0c;AI失控、量子威胁已逼近企业生命线 Gartner 重磅发布 2026 年网络安全六大核心趋势&#xff0c;直指在 AI 技术迭代、量子计算发展与地缘政治相互交织下&#xff0c;网络安全已成为贯穿企业治理…...