利用Laravel Websocket:实用指南
#教程 #php #laravel #websockets

在本教程中,我们将探讨Websocket API或Websockets的概念及其在实时应用程序中的意义。与传统的HTTP请求不同,WebSocket提供了服务器和客户端之间的双向通信渠道。

使用Ajax(Axios,Fetch)时,我们可以从服务器发送和接收数据而无需重新加载页面。但是,这种方法依赖于单向通信,如果没有事先请求,服务器就无法将数据发送给客户端。在Ajax聊天应用程序之类的方案中,这种限制变得很明显,我们经常需要发送请求以检查新消息。

为了克服这一挑战,Websocket通过建立服务器和用户网页之间的持久交互式连接会话来发挥作用。该连接允许连续通信,类似于服务器和浏览器之间的电话。启动后,服务器可以随时将消息或对象发送到网页,而无需重复投票。

通过利用Websocket,我们可以创建实时应用程序,服务器可以在其中立即将数据发送到网页。例如,考虑将Facebook通知系统告知用户帖子喜欢的信息。当某人喜欢帖子时,服务器会触发类似事件并迅速发送Websocket消息通知,例如“某人喜欢您的帖子”。

通过本教程,我们将探索如何设置Laravel WebScockets服务器,使用Laravel 9启用实时功能9.请继续关注逐步的示例和实际实现。

laravel websocket概念
在Laravel中,Websocket的概念围绕创建渠道和广播事件,以提供实时,实时更新的用户界面。这是Laravel Websocket概念的细分:

1通道创建:在Laravel中,您可以在路由/channels.php文件中定义通道。这些渠道充当服务器与客户之间的通信路径。

2-broadcasting Events :要发送实时更新,您可以在特定频道上广播Laravel事件。当触发事件时,与之关联的消息将发送给所有订阅该特定频道的客户。

3订阅通道:客户端,通常是Web浏览器,可以订阅特定的频道以接收服务器发送的消息。这允许实时更新而无需持续的轮询。

我们可以通过作曲家安装Laravel-Websockets包。

composer require beyondcode/laravel-websockets

该软件包带有迁移,以保存有关运行WebSockets服务器的统计信息。

php artisan vendor:publish --provider="BeyondCode\LaravelWebSockets\WebSocketsServiceProvider" --tag="migrations"

并发布WebSocket配置文件

composer require pusher/pusher-php-server "~3.0"

我们需要使我们的broadcast_driver成为.env文件中的推动器。

BROADCAST_DRIVER=pusher

要在config/broadcasting.php文件中为laravel websockets配置推送器,您可以按以下方式修改配置:

        'pusher' => [
            'driver' => 'pusher',
            'key' => env('PUSHER_APP_KEY'),
            'secret' => env('PUSHER_APP_SECRET'),
            'app_id' => env('PUSHER_APP_ID'),
            'options' => [
                'cluster' => env('PUSHER_APP_CLUSTER'),
                'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
                'port' => env('PUSHER_PORT', 443),
                'scheme' => env('PUSHER_SCHEME', 'https'),
                'encrypted' => true,
                'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
            ],
            'client_options' => [
                // Guzzle client options: https://docs.guzzlephp.org/en/stable/request-options.html
            ],
        ],

和.env添加Pusher App键,秘密,主机,端口,模式和集群

PUSHER_APP_ID=local
PUSHER_APP_KEY=local
PUSHER_APP_SECRET=local
PUSHER_HOST=127.0.0.1
PUSHER_PORT=6001
PUSHER_SCHEME=http
PUSHER_APP_CLUSTER=mt1

现在我们可以使用Websockets

php artisan websockets:serve

以及在不同的终端运行laravel服务器中
http://127.0.0.1:8000/laravel-websockets
看到仪表板

php artisan serve

在公共渠道上广播Laravel活动
为了使我们的服务器能够在不需要身份验证的公共渠道中向客户端发送消息,我们将首先创建事件。此事件将作为广播消息的触发因素。

php artisan make:event PublicMessageEvent

要使用showsbroadcast界面广播我们的事件,我们需要在活动类中实现它(您的示例中的app \ events \ publicMessageEvent.php)。该界面提供了广播事件的必要方法,并指定了要广播的频道。

<?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;
use App\Http\Traits\WebSocketsTrait;


class PublicMessageEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels,WebSocketsTrait;

    /**
     * Create a new event instance.
     */
    public $data;
    public function __construct()
    {
        //
    }



    /**
     * Get the channels the event should broadcast on.
     *
     * @return array<int, \Illuminate\Broadcasting\Channel>
     */
    public function broadcastOn()
    {
        $this->data = $this->status();

        return [
            new Channel('public'),
        ];
    }
}

默认情况下,该事件将存储在队列作业中,但是如果您想立即广播,请使用showsbroadcastnow界面。

,在Web中添加该路由

Route::get('/status', [\App\Http\Controllers\WebSocket::class, 'status']);

您可以广播事件并在控制器中创建方法

<?php

namespace App\Http\Controllers;

use App\Events\PublicMessageEvent;
use Illuminate\Http\Request;

class WebSocket extends Controller
{
    public function status () {
         broadcast(new PublicMessageEvent());
    }
}

我利用WebSocketStrait来广播消息,消除了导航到特定频道的需求。

<?php

namespace App\Http\Traits;

use App\Models\User;

trait WebSocketsTrait
{
    public function status()
    {

        return User::all();
    }


}

请注意,您不必在路由\ channels.php

中声明公共渠道

现在所有的东西看起来都很好

要开始,请按照以下步骤打开Laravel Websockets仪表板并建立连接:
1-开放laravel Websockets仪表板 http://127.0.0.1:8000/laravel-websocket

2键连接按钮,并确保使用端口6001


然后在另一个浏览器选项卡中转到http://127.0.0.1:8000/status
您应该看到所有用户。
您可以在Websockets仪表板中的API-Message中看到频道名称和事件名称。

聆听从vue,react或任何其他框架等前端框架中的Laravel后端播放的事件,您可以利用Laravel Echo。 Laravel Echo是一个JavaScript库,简化了订阅频道和聆听事件的过程。

结论
总之,通过将Laravel Websocket集成到您的后端基础架构中,您可以解锁服务器和客户端之间实时通信的潜力。利用Websockets使您可以建立持久连接,启用双向数据流并促进动态和交互式应用程序的开发。通过遵循本教程中概述的步骤,您将有基础来实现Laravel Websockets并在后端体系结构中利用其功能。愉快的编码!