Laravel 事件(event)+ 队列(queue)基础

1,在 Providers 目录下的 EventServiceProviders.php 文件 中,手动加入红色框起来的代码。

'App\Events\Demo' => [
            'App\Listeners\DemoListener',
        ],

 2,在项目的根目录执行

php artisan event:generate

此时项目中,会多出两个目录 ,Events  和 Listeners 。并会自行创建两个文件 , Demo.php 和 DemoListener.php 如下图所示

3,Demo.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;

class Demo
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $data;

    /**
     * Create a new event instance.
     *
     * @return void
     */
    public function __construct($data)
    {
        $this->data = $data;
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new PrivateChannel('channel-name');
    }
}

 4,DemoListeners.php 文件中的内容:

<?php

namespace App\Listeners;

use App\Events\Demo;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;

class DemoListener
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Events\Demo  $event
     * @return void
     */
    public function handle(Demo $event)
    {
        $data = $event->data;
        file_put_contents("../logs.txt",json_encode($data).PHP_EOL,FILE_APPEND);
    }
}

5,在控制器中,自己写一下测试事件的数据如下

public function index()
    {
        $arr = [1,2,3,'laravel event'];
        event(new Demo($arr));
        echo "事件执行完毕";
    }

6,访问控制器,看事件是否执行成功,结果会在项目根目录下,出现一个logs.txt文件,如下图:

以上就是laravel事件的简单实用,仅供参考 

接下来是学习event+queue的使用。

1,将 DemoListener 继承(implements)  ShouldQueue ,在上面的基础上,只是增加了,圈红的代码。如图所示:

<?php

namespace App\Listeners;

use App\Events\Demo;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Log;
use Illuminate\Queue\InteractsWithQueue;

class DemoListener implements ShouldQueue
{
    public $queue = 'demo';

    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  \App\Events\Demo  $event
     * @return void
     */
    public function handle(Demo $event)
    {
        $data = $event->data;
        Log::info(json_encode($data).PHP_EOL);
        //file_put_contents("../logs.txt",json_encode($data).PHP_EOL,FILE_APPEND);
    }
}

2,修改一下 config 目录下的 queue.php 文件,主要位置,如图所示:可以根据自己的需求,自行更改。 

3,访问一下控制器。这次很惊讶的发现,项目根目录没有找到 logs.txt 文件。这是因为,这次是事件 + 队列的形式。访问控制器,只是把事件放入redis队列中,但是还没有执行。下图就是:redis中事件的内容

 注意:

1,项目需要在laravel生成的.env文件中将队列驱动由同步sync改为redis

QUEUE_CONNECTION=redis

2,使用redis异步驱动,需要安装predis/predis包

composer require predis/predis

3,用框架自带的log文件代替了上面的logs.txt 文件

4,队列中已经有事件了,下面就执行一下该队列。如图所示:

php artisan queue:listen --queue=demo

 最后log文件会记录信息

总结:

事件 + 队列 和 事件的单独使用,区别在于,被监听的事件类,是否 继承 ShouldQueue。如果没有继承则就是单独的事件,继承则就是事件+队列。
单独的事件:就是当程序触发事件以后,事件会立即执行。
事件+队列:就是当程序触发事件以后,事件首先会被分发到队列。等待队列依次的执行。

猜你喜欢

转载自blog.csdn.net/u012322399/article/details/127654821