监听返回app_基于 Redis 消息队列实现 Laravel 事件监听及底层源码探究

本文深入探讨了Laravel中如何基于Redis消息队列实现事件监听,包括事件监听基本使用、队列处理事件监听以及底层源码探究。通过事件监听,可以将耗时操作推送到消息队列,提升系统性能。文章详细介绍了事件触发、监听器创建、事件与监听器的映射关系,以及如何将监听器推送到队列进行异步处理。
摘要由CSDN通过智能技术生成

9b41c428b371af667181a65b356d2c40.png

在 Laravel 中,除了使用 dispatch 辅助函数通过 Illuminate\Bus\Dispatcher 显式推送队列任务外,还可以通过事件监听的方式隐式进行队列任务推送,在这个场景下,事件监听器实际上扮演了「任务类」的角色。

还是以文章浏览数更新为例。开始之前,我们先来给大家演示下事件监听和处理的基本实现。

事件监听基本使用

首先创建一个文章浏览事件类 PostViewed

sail artisan make:event PostViewed

然后编写这个事件类代码如下:

<?php namespace App\Events;use App\Models\Post;use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Foundation\Events\Dispatchable;use Illuminate\Queue\SerializesModels;class PostViewed{
    use Dispatchable, InteractsWithSockets, SerializesModels;public Post $post;/**
     * Create a new event instance.
     *
     * @param Post $post
     */public function __construct(Post $post){ $this->post = $post;
    }/**
     * Get the channels the event should broadcast on.
     *
     * @return Channel|array
     */public function broadcastOn(){ return new PrivateChannel('channel-name');
    }
}

事件类的作用就是装载事件相关的数据,这里我们引入了 Post 模型实例,以便在事件监听器中进行相应的处理,事件类中默认还有一个 broadcastOn 表示事件的广播通道,我们在后面介绍广播时再详细介绍这个方法。

有了事件之后,还要创建一个监听这个事件的处理器:

php artisan make:listener IncreasePostViews

编写处理器代码如下:

<?php namespace App\Listeners;use App\Events\PostViewed;use Illuminate\Support\Facades\Redis;class IncreasePostViews{
    /**
     * Create the event listener.
     *
     * @return void
     */public function __construct(){ //
    }/**
     * Handle the event.
     *
     * @param PostViewed $event
     * @return void
     */public function handle(PostViewed $event){ if ($event->post->increment('views')) {
            Redis::zincrby('popular_posts', 1, $event->post->id);
        }
    }
}

我们将之前队列任务类的 handle 方法代码搬到了事件监听器的 handle 方法中,作为文章浏览事件发生时的处理逻辑。

要建立事件与监听器之间的映射关系,保证事件发生时可以通过监听器对其进行处理,需要在 EventServiceProvider 中维护一个监听数组配置:

protected $listen = [
    ...
    PostViewed::class => [
        IncreasePostViews::class
    ],
];

以事件做键,事件监听器做值,表示一个事件可以同时被多个事件监听器监听和处理。

Laravel 还提供了事件自动发现功能,不过考虑到反射性能较差,我们这里还是使用传统的手动注册方式。

这样一来,当我们在 PostControllershow 方法中触发 PostViewed 事件时:

// 浏览文章
public function show($id){
    $post = $this->postRep
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值