详细讲解laravel6中的队列与任务调度

(一)队列实现

在laravel中,队列的实现我们只需要通过操作,就能实现,在实现的前提,我们需要进行简单的配置,对config/queue.php进行修改,具体查看官方文档,这里我不进行详细说明,下面我们直接进入正题。

  1. 首先,通过执行php artisan make:job 任务类名称我们可以实现一个队列任务,执行该命令后,将会在app目录下生成Jobs目录并创建一个新的任务类,该任务类会自动继承Illuminate\Contracts\Queue\ShouldQueue接口,我们的队列会调用该任务类的handle方法,因此我们只需要在handle里面去实现我们具体的业务逻辑,就可以轻松的实现任务类。而此时,我们这是对我们任务类进行处理,那我们该怎么去分配任务进行处理呢?
    9fe3bdf2dc1b025b963d722e3917fd6e-0

  2. 在laravel中,任务的分发,也只需要通过简单的已实现的方法进行任务分配,我们只需要将任务指定对应的队列进行分发处理,具体的实现方式只需要以下简单的几行代码,便可以实现任务分发。

    //任务指定到对应的队列
    $job = (new TestQueue())->onQueue('队列名称');
    //分发任务
    dispatch($job);
  3. 实现的队列的分发之后,我们通过运行php artisan queue:work队列处理器,该处理器便会对分发到队列里的任务进行处理,它会一直运行直到它被手动停止或终端关闭。需要注意的是,由于队列处理器是作为一个常驻进程并且在内存中保存着已经启动的应用状态,当我们修改对应的代码时,我们需要重启队列处理器才会载入修改后的代码逻辑。所以当我们对相应的任务类进行修改时,我们需要重启以保证正确性。

  4. Supervisor 配置,这里官方文档讲得挺明白的,我就没必要在复述一次官方文档传送门

(二)任务调度

这里我直接引用官方文档的话语,简明易懂。

过去,你可能需要在服务器上为每一个调度任务去创建 Cron 入口。但是这种方式很快会变得不友好,因为这些任务调度不在源代码中,并且你每次都需要通过 SSH 链接登录到服务器中才能增加 Cron 入口。
Laravel 命令行调度器允许你在 Laravel 中对命令调度进行清晰流畅的定义。且使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口。你的任务调度在 app/Console/Kernel.php 的 schedule 方法中进行定义。

  1. 任务调度定义。在laravel官方文档中,我们更常用的是任务Artisan命令调度和队列调度。

    //artisan命令调度
    $schedule->command('emails:send Taylor --force')->daily();
    //队列调度
    $schedule->job(new Heartbeat)->everyFiveMinutes();
    // 分发任务到「heartbeats」队列...
    $schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes();
  2. 任务调用频率,如上步骤的daily()everyFiveMinutes()等,都是对任务的调用频率进行限制,从字面意义上也不难理解,其实就是设置每分钟或每天调用一次。具体调用如下(凑个长度),具体也可移步官方文档进行查看。

方法 描述
->cron(’* * * * *’); 自定义 Cron 计划执行任务
->everyMinute(); 每分钟执行一次任务
->everyFiveMinutes(); 每五分钟执行一次任务
->everyTenMinutes(); 每十分钟执行一次任务
->everyFifteenMinutes(); 每十五分钟执行一次任务
->everyThirtyMinutes(); 每三十分钟执行一次任务
->hourly(); 每小时执行一次任务
->hourlyAt(17); 每小时第 17 分钟执行一次任务
->daily(); 每天午夜执行一次任务(译者注:每天零点)
->dailyAt(‘13:00’); 每天 13 点执行一次任务
->twiceDaily(1, 13); 每天 1 点及 13 点各执行一次任务
->weekly(); 每周执行一次任务
->weeklyOn(1, ‘8:00’); 每周一的 8 点执行一次任务
->monthly(); 每月执行一次任务
->monthlyOn(4, ‘15:00’); 每月 4 号的 15 点 执行一次任务
->quarterly(); 每季度执行一次任务
->yearly(); 每年执行一次任务
->timezone(‘America/New_York’); 设置时区
  1. 最后当然是启动调度器运行,执行* * * * * cd /项目地址 && php artisan schedule:run >> /dev/null 2>&1
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片