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

Laravel - laravel-websockets 开发详解

1.我laravel-websockets 的开发环境

  • Laravel 9.0
  • Laravel WebSockets (最新版)
  • Laravel Vite

2. 安装服务器端包 beyondcode/laravel-websockets

  • 运行以下命令安装laravel-websockets
composer require beyondcode/laravel-websockets
  • 安装完后,发布 Laravel WebSockets 的配置文件
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="config"
  •  发布迁移文件
php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"
  • 运行迁移以创建数据库表 
php artisan migrate

 若安装失败,试试更新所有第三方库:composer update

 3.安装pusher

composer require pusher/pusher-php-server

 4.配置 .env 文件,根据你自身情况填写。

PUSHER_APP_ID=your_app_id
PUSHER_APP_KEY=your_app_key
PUSHER_APP_SECRET=your_app_secret
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1

 此外,还需将 .env 文件中 ,BROADCAST_DRIVER 的值改为 pusher

BROADCAST_DRIVER=pusher

 5.开始创建通知事件,运行以下命令

php artisan make:event SimpleNoticeMessage

 具体代码如下:

<?phpnamespace App\Events;use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;class SimpleNoticeMessage implements ShouldBroadcast
{use Dispatchable, InteractsWithSockets, SerializesModels;public $message;/*** Create a new event instance.** @return void*/public function __construct($message){$this->message = $message;}/*** 获取事件应广播的频道.* 频道应该是 Channel、PrivateChannel 或 PresenceChannel 的实例。 Channel 的实例代表任何用户都可以订阅的公共频道,而 PrivateChannels 和 PresenceChannels 代表需要 频道授权 的私人频道:* 我的理解就是需要发送给谁** @return \Illuminate\Broadcasting\Channel|array*/public function broadcastOn(){return new Channel('test');}/*** 事件的广播名称。(事件名称)* 可选* 如果没定义事件名称,则在客户端监听事件的时候填写的是 类名,即SimpleNoticeMessage* 如果定义了 则未 .server.admin.notice,注意最前面有个 .* @return string*/public function broadcastAs(){return 'server.test.notice';}
}

6.客户端安装 laravel-echo

npm install --save-dev laravel-echo pusher-js
  • 配置 resources\js\bootstrap.js 文件,在创建laravel 文件时有,取消注释就行,代码如下
import Echo from 'laravel-echo';import Pusher from 'pusher-js';
window.Pusher = Pusher;window.Echo = new Echo({broadcaster: 'pusher',key: import.meta.env.VITE_PUSHER_APP_KEY,cluster: import.meta.env.VITE_PUSHER_APP_CLUSTER ?? 'mt1',wsHost: import.meta.env.VITE_PUSHER_HOST ? import.meta.env.VITE_PUSHER_HOST : `ws-${import.meta.env.VITE_PUSHER_APP_CLUSTER}.pusher.com`,wsPort: import.meta.env.VITE_PUSHER_PORT ?? 80,wssPort: import.meta.env.VITE_PUSHER_PORT ?? 443,forceTLS: (import.meta.env.VITE_PUSHER_SCHEME ?? 'https') === 'https',enabledTransports: ['ws', 'wss'],
});
  •  页面脚本配置,在 resources\views\index.blade.php  文件 的 head 标签的结尾添加以下代码
@vite('resources/js/app.js')
<script>window.onload = function(){Echo.channel('test').listen('.server.test.notice', (e) => {console.log(e.message);});}</script>

 7.发送消息,新建控制器 testCl

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Events\SimpleNoticeMessage;class testCl extends Controller{public function sendMsg(Request $request){SimpleNoticeMessage::dispatch("hello world");return "发送成功";}
}

 8.启动项目,为以下命令各开一个终端运行

  • php artisan serve   启动laravel 项目
  • npm run dev 启动vite
  • php artisan queue:work 启动队列
  • php artisan websockets:serve 启动websockets 服务器

 9.结束。

  • 在页面访问 testCl 控制器空的sendMsg 方法,即可。
  • 内部测试,新建一个终端窗口。运行 php artisan tinker ,在窗口中 输入 event (new \App\Events\SimpleNoticeMessage('hello world')) ,回车有,即可在前端控制中打印出 hellow world
  • 调试面板,运行: 127.0.0.1:8000/laravel-websockets ,也可查看出的消息

相关文章:

Laravel - laravel-websockets 开发详解

1.我laravel-websockets 的开发环境 Laravel 9.0Laravel WebSockets &#xff08;最新版&#xff09;Laravel Vite 2. 安装服务器端包 beyondcode/laravel-websockets 运行以下命令安装laravel-websockets composer require beyondcode/laravel-websockets 安装完后&#…...

vue3 学习笔记04 -- axios的使用及封装

vue3 学习笔记04 – axios的使用及封装 安装 Axios 和 TypeScript 类型定义 npm install axios npm install -D types/axios创建一个 Axios 实例并封装成一个可复用的模块&#xff0c;这样可以在整个应用中轻松地进行 API 请求管理。 在 src 目录下创建一个 services 文件夹&…...

键盘快捷键设置录入

效果图&#xff1a; 代码&#xff1a; import React, {useContext, useEffect, useRef} from react import {message} from "antd"; import lodash from "lodash"; import {StateContext} from ../../index.tsx import {useUpdateEffect} from "ahoo…...

刷题Day49|647. 回文子串、516.最长回文子序列

647. 回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;递推公式的含义是[i, j]内的子串是否为回文子串&#xff08;bolean[][])。一共两种情况&#xff1a;s[i] s[j]&#xff0c;i和j相差1以外就得判断中间包含的的字符串是否为回文了&…...

关于transformers库验证时不进入compute_metrics方法的一些坑

生成式任务输入就是标签 transformers在进入compute_metrics前会有一个判断&#xff0c;源码如下&#xff1a; # 版本 transformers4.41.2 # 在trainer.py 的 3842 行 # Metrics! if (self.compute_metrics is not Noneand all_preds is not Noneand all_labels is not Nonea…...

苹果提出RLAIF:轻量级语言模型编写代码

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 代码生成一直是一个充满挑战的领域。随着大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;我们见证了在自然语言理解和生成方面的显著进步。然而&#xff0c;当涉及到代码生成&a…...

[leetcode] shortest-subarray-with-sum-at-least-k 和至少为 K 的最短子数组

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:int shortestSubarray(vector<int>& nums, int k) {int n nums.size();vector<long> preSumArr(n 1);for (int i 0; i < n; i) {preSumArr[i 1] preSumArr[i] nums[i];}int res n…...

专业140+总分420+天津大学815信号与系统考研经验天大电子信息与通信工程,真题,大纲,参考书。

顺利上岸天津大学&#xff0c;专业课815信号与系统140&#xff0c;总分420&#xff0c;总结一些自己的复习经历&#xff0c;希望对于报考天大的同学有些许帮助&#xff0c;少走弯路&#xff0c;顺利上岸。专业课&#xff1a; 815信号与系统&#xff1a;指定教材吴大正&#xf…...

前端如何取消接口调用

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 1. xmlHttpRequest是如何取消请求的&#xff1f; 实例化的XMLHttpRequest对象上也有abort方法 const xhr new XMLHttpRequest(); xhr.addEventListener(load, function(e)…...

k8s 容器环境下的镜像如何转换为docker 使用

在无法连接registry 的环境中&#xff0c;想要把 crictl 中的镜像给docker 使用&#xff0c;应该怎么处理&#xff1f; 其实容器镜像是通用的&#xff0c;crictl 和ctr 以及docker 镜像是可以互相使用的&#xff0c;因为docker 在1.10版本之后遵从了OCI。所以crictl 环境下的镜…...

FreeRTOS 队列

队列是一种任务到任务、任务到中断、中断到任务数据交流的一种机制。在队列中可以存 储数量有限、大小固定的多个数据&#xff0c;队列中的每一个数据叫做队列项目&#xff0c;队列能够存储队列项 目的最大数量称为队列的长度&#xff0c;在创建队列的时候&#xff0c;就需要指…...

如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字

如何识别图片文字转化为文本&#xff1f;5个软件帮助你快速提取图片文字 将图片中的文字提取为文本是一项非常有用的技能&#xff0c;特别是当你需要处理大量扫描文档、截图或其他图片时。以下是五款能够帮助你快速提取图片文字的软件&#xff1a; 迅捷文字识别 这是一款非…...

Flink SQL kafka连接器

版本说明 Flink和kafka的版本号有一定的匹配关系&#xff0c;操作成功的版本&#xff1a; Flink1.17.1kafka_2.12-3.3.1 添加kafka连接器依赖 将flink-sql-connector-kafka-1.17.1.jar上传到flink的lib目录下 下载flink-sql-connector-kafka连接器jar包 https://mvnreposi…...

glm-4 联网搜索 api 测试

今天测试了一下 glm-4 的联网搜索 web_search tool 调用&#xff0c;发现了 web_search 的网页检索返回结果中几个比较诡异的事情&#xff0c;特此记录&#xff1a; 有些检索结果没有 icon、link、media 字段&#xff0c;但从内容上看确实是联网搜索出来的结果&#xff0c;不知…...

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序

Java毕业设计 基于SSM vue图书管理系统小程序 微信小程序 SSM 图书管理系统小程序 功能介绍 用户 登录 注册 首页 图片轮播 图书信息推荐 图书详情 赞 踩 评论 收藏 系统公告 公告详情 用户信息修改 我的待还 图书归还 催还提醒 我的收藏管理 意见反馈 管理员 登录 个人中心…...

bert训练的一些技巧(rand() < self.skipgram_prb)

rand() < self.skip_gram_prb) 是一个条件表达式&#xff0c;用来判断是否进行skip-gram掩码操作。这种掩码操作通常用于自然语言处理中的数据增强&#xff0c;通过概率决定是否应用skip-gram掩码。下面是对这个表达式的详细解释&#xff1a; 解释 rand(): rand() 是一个随…...

pandas修改时间索引报错处理

import pandas as pd import numpy as np import osdfpd.DataFrame(index[a,b,c],data{序列:[1,2,3]}) df.rename(index{a:a1},inplaceTrue) print(df) print(df.index.dtype)df1pd.DataFrame(index[2024-01-01,2024-01-02,2024-01-03],data{序列:[1,2,3]}) df1.rename(index{2…...

Nginx Bla~Bla~

root 和 alias指令都用于指定服务器上的文件系统路径&#xff0c;但它们在用法和行为上有一些不同 root指令通常用于在Nginx配置中定义一个目录&#xff0c;该目录将作为请求的根目录。 server { location /static/ {root /var/www; 请求 /static/index.html 将映射到 /v…...

java awt和swing介绍

Java AWT&#xff08;Abstract Window Toolkit&#xff09;和 Swing 是用于创建图形用户界面&#xff08;GUI&#xff09;的 Java API。 AWT AWT 是 Java 最初的平台依赖的窗口图形界面工具包&#xff0c;它提供了一组基本的 GUI 组件、窗口管理、事件处理等。AWT 组件是重量…...

奇怪的错误记录

https://github.com/meta-llama/llama3/issues/80 读模型没问题&#xff0c;推理时出现&#xff1a; RuntimeError: “triu_tril_cuda_template” not implemented for ‘BFloat16’ ———————————————— 事发原因 我尝试了解transformers的AutoProcessor时&a…...

SpringBoot的两种启动方式原理

在技术领域&#xff0c;我们常常被那些闪耀的、可见的成果所吸引。今天&#xff0c;这个焦点无疑是大语言模型技术。它们的流畅对话、惊人的创造力&#xff0c;让我们得以一窥未来的轮廓。然而&#xff0c;作为在企业一线构建、部署和维护复杂系统的实践者&#xff0c;我们深知…...

收藏!前端打工人破局指南:转AI Agent,告别重复劳动,薪资翻倍

作为前端打工人&#xff0c;那种深陷内耗的痛&#xff0c;真的只有自己懂&#x1f447; 每天围着页面布局、接口联调死磕&#xff0c;需求堆成山&#xff0c;兼容问题调不停&#xff0c;看似忙碌的日子&#xff0c;全是机械的重复劳动&#xff0c;没有一点成长空间。 干得越久越…...

用YOLOv8-pose玩点不一样的:手把手教你用Python+OpenCV把姿态关键点画成卡通小人

用YOLOv8-pose玩转创意姿态可视化&#xff1a;从骨架连线到卡通角色设计 当计算机视觉遇上创意表达&#xff0c;枯燥的骨架连线就能变身活灵活现的卡通角色。想象一下&#xff0c;你的健身应用里不再是单调的线条小人&#xff0c;而是穿着背带裤跳舞的虚拟形象&#xff1b;教学…...

家用混动SUV舒适度技术科普入门:从实测看核心技术要点

在家用混动SUV的日常使用中&#xff0c;接送孩子上下学、家庭短途出行是最高频的场景&#xff0c;而“舒适度”并非单纯的主观感受&#xff0c;而是一套涵盖空间设计、座椅工程、材质工艺、座舱适配及动力平顺性的综合技术体系。对于有儿童乘坐需求的家庭而言&#xff0c;舒适度…...

长生露模式系统开发

模式系统设计 长生露模式通常指结合健康管理、会员服务或直销体系的综合系统。开发需明确业务模式定位&#xff0c;如会员积分、分销奖励或健康数据追踪。核心模块包括用户分层、权益分配、数据分析和后台管理。技术架构选择 采用微服务架构确保系统可扩展性&#xff0c;推荐Sp…...

3D点云检测实战指南-数据准备篇(一):Nuscenes数据集解析与应用

1. Nuscenes数据集基础解析 第一次接触Nuscenes数据集时&#xff0c;我被它庞大的数据量和精细的标注震撼到了。这个由Motional团队打造的自动驾驶数据集&#xff0c;包含了1000个真实驾驶场景&#xff0c;每个场景持续20秒。不同于普通数据集&#xff0c;Nuscenes最吸引我的是…...

AI Agent在数据分析领域应用研究

我个人是从技术做到管理&#xff0c;从实施做到咨询&#xff0c;从售前做到销售&#xff0c;在技术领域来说我最擅长的就是数据技术。在大学时我学过Oracle 6.0&#xff0c;参加工作后又到清华大学参加过Oracle 8i培训&#xff0c;接着又做过Oracle DBA&#xff0c;后来又做数据…...

7个技巧构建Telegraf高可用监控系统:从单点到企业级架构

7个技巧构建Telegraf高可用监控系统&#xff1a;从单点到企业级架构 你是否遇到过监控数据丢失、告警延迟或Agent单点故障&#xff1f;作为插件驱动的服务器代理&#xff08;Plugin-driven server agent&#xff09;&#xff0c;Telegraf在企业级监控中扮演关键角色&#xff0…...

考研408计算机学科专业基础综合 数据结构复习

考研408计算机学科专业基础综合 数据结构复习 第一页&#xff1a;数据结构&#xff08;一&#xff09;——基础线性表&#xff08;高频&#xff09; 一、数据结构核心基础&#xff08;必背&#xff09; 1. 数据结构定义&#xff1a;相互之间存在一种或多种特定关系的数据元素的…...

ollama部署本地大模型|embeddinggemma-300m跨境电商评论情感迁移学习实践

ollama部署本地大模型&#xff5c;embeddinggemma-300m跨境电商评论情感迁移学习实践 1. 环境准备与快速部署 想要在本地运行强大的文本嵌入模型吗&#xff1f;今天我来手把手教你用ollama部署embeddinggemma-300m&#xff0c;这是一个只有3亿参数但效果惊人的小模型&#xf…...