Laravel - laravel-websockets 开发详解

1.我laravel-websockets 的开发环境

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

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

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

3.安装pusher

bash 复制代码
composer require pusher/pusher-php-server

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

bash 复制代码
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

bash 复制代码
BROADCAST_DRIVER=pusher

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

bash 复制代码
php artisan make:event SimpleNoticeMessage

具体代码如下:

bash 复制代码
<?php

namespace 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

bash 复制代码
npm install --save-dev laravel-echo pusher-js
  • 配置 resources\js\bootstrap.js 文件,在创建laravel 文件时有,取消注释就行,代码如下
javascript 复制代码
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 标签的结尾添加以下代码
javascript 复制代码
@vite('resources/js/app.js')
<script>
   window.onload = function(){
         Echo.channel('test').listen('.server.test.notice', (e) => {
               console.log(e.message);
          });
   }
 </script>

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

php 复制代码
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 ,也可查看出的消息
相关推荐
两个人的幸福3 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982076 天前
PHP 扩展——从入门到理解
php
鹏仔先生6 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下6 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip6 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒7 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2507 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis7 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel