laravel 8 任务调度和延时分发

根据我平常的简单使用,总结一下 laravel 8 的任务调度和延时分发的简单使用

首先:

任务调度:定时,定期执行任务
应用场景:定时数据库备份

延时分发:延时执行任务
应用场景:订单30分钟未支付取消订单

任务调度

在 Console 里生成调用文件

php artisan make:command TestOne
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Log;

class TestOne extends Command
{
    /**
     * The name and signature of the console command.
     * 此处是任务调度的名称
     * @var string
     */
    protected $signature = 'TestOne';

    /**
     * The console command description.
     * 对定时任务的描述
     * @var string
     */
    protected $description = '测试1';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     * 任务的逻辑代码
     * @return int
     */
    public function handle()
    {
        Log::info('TestOne 定时任务执行');
    }
}

在 Kernel.php 里定义调度任务

protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')->hourly();

        //每分钟执行
         $schedule->command('TestOne')->everyMinute();
    }

查看所有任务

php artisan schedule:list

执行任务

php artisan schedule:work

延时分发

使用 redis 队列做任务分发,每次的任务会以有序集合的方式存储在redis中,根据设定的延时时间,进行消费,分发,即执行

直接修改.env配置文件

QUEUE_CONNECTION=redis

生成任务类

php artisan make:job FirstJob

调用任务类

dispatch(new FirstJob($arr, 30));//延时30秒执行
<?php

namespace App\Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;

class FirstJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $data;

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

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $name=$this->data['name'];
        Log::info('现在延时分发执行'.$name);
    }
}

执行

php artisan queue:work
本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
laravel_peng

任务调度:

任务调度:如果不想手动执行的话,可以利用操作系统的 定时任务 来进行自动调度。

  • Linux 操作系统的 crontab
  • Windows 操作系统的 任务计划程序
  • 它的特点是,调度任务执行完,进程就停止了,等待下次系统调度。
  • 任务调度有一个坑需要注意:Laravel 对任务时间调度进行了封装,它接管了 Linux 的 crontab 的调度,因为默认 php artisan schedule:work 都是每分钟执行的,如果在 Kernel.php 定义任务调度时间,也就是说任务调度什么时候执行是在 Laravel 代码控制的。Laravel 会在任务到点的时候去执行任务,并且使用的是 php 禁用的 proc_open函数去执行服务器命令。所以要在 php.ini 文件中的 disable_functions 配置项中启用这个禁用函数,任务调度才能执行成功,否则报错。

延时分发队列任务:

延时分发队列任务:如果不想手动执行,且碰到错误进程退出的情况,可以使用进程监视器来重新拉起。

  • Linux 操作系统可用 supervisor
  • Windows 操作系统可用 pm2
  • 它的特点是,队列中任务执行完,进程还在,等待队列中下个任务到来。但是遇到错误进程会中断,需要守护进程重新拉起,保证长期运行
1年前 评论
amateur (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!