Laravel 事件、队列、控制台命令、任务调度之间的区别和联系

阅读数: 4901 2018年06月29日

事件:其实就是监听者模式一种实现。

如果需要使用事件,必须要有1个事件类和一个监听类,一个事件可以被多个类监听。一个监听类可以关注(收听)多个事件。

事件类:其实就是一个动作,这个动作里面主要带有事件的数据(描述事件)。

监听类:针对传递过来的事件进行处理,取出事件里面数据。


创建事件:

1、在 EventServiceProvider $listen 里面设置好事件对应的监听类。

2、然后在控制台创建事件命令:

php artisan event:generate

PHP 会自动创建文件夹 Events 和 Listeners ,并根据 $listen 的设置,创建事件类和监听类。


触发事件:使用 event(new XxxEvent()); 

与队列的联系:触发事件的时候,和同步队列委派的时候一样,都是立即执行。这方面他们比较像。


队列:需要执行的程序排队执行。

针对耗时比较长的程序操作,或者需要异步执行的操作。

创建Job:每个操作程序类叫做一个Job。

消费队列:

php artisan queue:work


控制台命令:命令行执行PHP代码

创建命令:

php artisan make:command SendEmails
<?php

namespace App\Console\Commands;

use App\User;
use App\DripEmailer;
use Illuminate\Console\Command;

class SendEmails extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'email:send {user}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Send drip e-mails to a user';

    /**
     * The drip e-mail service.
     *
     * @var DripEmailer
     */
    protected $drip;

    /**
     * Create a new command instance.
     *
     * @param  DripEmailer  $drip
     * @return void
     */
    public function __construct(DripEmailer $drip)
    {
        parent::__construct();
    
        $this->drip = $drip;
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->drip->send(User::find($this->argument('user')));
    }
}


任务调度:定时调用控制台命令或者执行程序

只需开启一个 crontab 即可:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1

可在 app/Console/Kernel.php 里面配置每个命令的执行时间:

call(function () {
            DB::table('recent_users')->delete();
        })->daily();
    }
}


phpriji.cn | 网站地图 | 沪ICP备17015433号-1