Laravel 事件处理(event)+ 队列使用(queue)

in web技术 with 0 comment 访问: 2,269 次

步骤

    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        // passport 移除失效令牌事件
        'Laravel\Passport\Events\AccessTokenCreated' => [
            'App\Listeners\RevokeOldTokens',
        ],
        'Laravel\Passport\Events\RefreshTokenCreated' => [
            'App\Listeners\PruneOldTokens',
        ],

        // 测试事件
        'App\Events\Test' => [
            'App\Listeners\TestListener',
        ],
    ];
<?php

namespace App\Listeners;

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

class TestListener implements ShouldQueue
{
    /**
     * 任务应该发送到的队列的连接的名称
     *
     * @var string|null
     */
    public $connection = 'redis';

    /**
     * 任务应该发送到的队列的名称
     *
     * @var string|null
     */
    public $queue = 'FMock';
}
<?php

namespace App\Events;

use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class Test
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $user;

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

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

TestListener.php中传入做具体修改操作:

<?php

namespace App\Listeners;

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

class TestListener implements ShouldQueue
{
    /**
     * 任务应该发送到的队列的连接的名称
     *
     * @var string|null
     */
    public $connection = 'redis';

    /**
     * 任务应该发送到的队列的名称
     *
     * @var string|null
     */
    public $queue = 'FMock';

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

    /**
     * Handle the event.
     *
     * @param  Test  $event
     * @return void
     */
    public function handle(Test $event)
    {
        //
        $event->user->avatar = 'test' . rand();
        $event->user->save();
    }
}
<?php
/**
 * @Author huaixiu.zhen
 * http://litblc.com
 * User: z00455118
 * Date: 2018/12/19
 * Time: 15:59
 */

namespace App\Http\Controllers\Web;


use App\Events\Test;
use App\Repositories\Eloquent\UserRepository;

class IndexController
{
    public function index()
    {
        return 'hello web';
    }

    public function event(UserRepository $userRepository)
    {
        $user = $userRepository->find(14);
        event(new Test($user));
        return '事件测试';
    }
}

该脚本定义了一下优化参数,执行redis中名字为FMock的队列,不输出任何信息,3秒一次,失败后3秒重新执行,最多执行3次。

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue' => 'FMock',
            'retry_after' => 90,
        ],

搞定!

执行一下我们的控制器方法,快速(3s内)查看redis,就可以看到queues:FMock的键值,队列执行完毕则被删除。

注意事项

代码查阅

这段测试代码可以在我的gayhub找到并执行。

赞赏支持
Responses