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 ,也可查看出的消息
相关推荐
ServBay2 天前
告别面条代码,PSL 5.0 重构 PHP 性能与安全天花板
后端·php
多厘3 天前
别再手写 psr-4 了!用 Composer 隐藏魔法干掉上千行烂配置
laravel
JaguarJack4 天前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo4 天前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack5 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo5 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack6 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay7 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954487 天前
CTF 伪协议
php
BingoGo9 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php