关于laravel5.5的定时任务详解(demo)

吾爱主题 阅读:101 2021-09-13 17:02:00 评论:0

一、准备环境

服务器:linux(debian)+nginx+mysql+php 环境

框架:laravel 5.5 (确认能跑通)

需求:每天晚上1点执行定时操作

二、定时任务的步骤

1、根据文档,创建命令

首先进入到laravel/app/console 目录下,Console 目录包含应用所有自定义的 Artisan 命令,这些命令类可以使用 make:command 命令生成。该目录下还有 Console/Kernel 类,在这里可以注册自定义的 Artisan 命令以及定义调度任务。

例如我们创建一个定时任务,名称为Test:

?
1 2 3 //这里使用laravel给定的 php artisan来生成命令,此处的Test就是我们要生成的文件 //这里的artisan代表的不仅仅是laravel自带的命令,他其实是laravel下的artisan目录,因为这个目录没有x,也就是可执行权限,所以不能使用 ./artisan 来执行,只能通过php来执行 php artisan make:command Test

2、创建完之后,打开console目录下的commands目录,我们会发现里面已经有了一个文件

大致的代码如下:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 <?php   namespace App\Console\Commands;   use App\Services\CalculateDataService; use Illuminate\Console\Command;   class Test extends Command {   //此处代表laravel自动生成的名称,下面执行的时候能用到   protected $signature = 'test:data' ;     //此处代表的是描述,并没有什么用的   protected $description = 'test data' ;     /**   * 计算数据服务的 service 属性   *这里由于要用到我们的逻辑,所以提前定义一下,方便下面使用   * @var CalculateDataService   */   protected $service ;     //这个是laravel自带的构造方法。初始状态下是空的。   //我这里由于要调用CalculateDataService 类的一个方法,所有就用依赖注入的方式引入了一下。   public function __construct(CalculateDataService $service )   {   parent::__construct();     $this ->service = $service ;   }     /**   * Execute the console command.   *这里就是我们执行操作的地方,里面是command要处理的业务。根据我们的需求,   *调用类中的calculateData()方法,该方法是我们自己的需求逻辑部分。   * @return mixed   */   public function handle()   {   try {    $this ->service->calculateData();   } catch (\Exception $e ) {    $this ->error( $e ->getMessage());   }   // line()方法是command类中自带的方法,可以输出我们自定义的信息   $this ->line( 'calculate Data Success!' );   } }

3、定时命令创建好之后,我们需要修改kernel.php文件

kernel.php文件里面,主要是定义命令的调度时间,定义命令的执行先后顺序等。

这部分参考laravel官方文档:

http://laravelacademy.org/post/8484.html

4、我的kernel.php文件

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 <?php //此处省略了命名空间部分 class Kernel extends ConsoleKernel {   /**   * The Artisan commands provided by your application.   *注:此处是引入我们新创建的类。由于我们此处是使用命令名来操作的,所以没用上这个类名。不过还是引入比较标准   * 可以使用 command 方法通过命令名或类来调度一个 Artisan 命令:   * $schedule->command('emails:send --force')->daily();   * $schedule->command(EmailsCommand::class, ['--force'])->daily();   *   * @var array   */   protected $commands = [   Test:: class ,   CalculateData:: class ,   UpdateOffset:: class ,   ];     /**   * Define the application's command schedule.   * 注:   * 1、这个方法按照自己的需求,确定定时方法的执行顺序。通过after,before等关键词来控制   * 2、此处相当于规定同意的定时执行时间,如都在0:30分执行下面的几个定时任务   * @param \Illuminate\Console\Scheduling\Schedule $schedule   * @return void   */   protected function schedule(Schedule $schedule )   {   // 每天凌晨 0.45 执行同步 aliyun 数据的任务,并发送邮件给 ***    $schedule ->command( 'iot:sync Flow' )    ->after( function () {     //更新偏移量,after里面不能加参数    Artisan::call( 'Test:data' );    })    ->after( function () {    // 执行同步数据命令完成后 则执行计算数据任务    Artisan::call( 'calculate:data' );    });   }     /**   * Register the commands for the application.   * //这个部分是laravel自动生成的,引入我们生成的命令文件   * @return void   */   protected function commands()   {   $this ->load(__DIR__. '/Commands' );     require base_path( 'routes/console.php' );   } }

关于具体的调度方法schedule(),大家可以去laravel文档看看,里面可以规定很多东西。我这边是使用的钩子函数。在同时要执行多个定时任务的时候,通过after,before等方法,可以让多个定时任务变得有序起来。

三、执行我们的定时

虽然laravel的定时任务一直都说的很强大,但本质上还是离不开服务器上的cron脚本。。

1、先查看服务器上的定时条目

?
1 crontab -l

2、新增或编辑cron 条目

?
1 crontab -e

3、在里面新增我们写好的方法路径

这里面新加上我们的定时任务。

第一是 规定定时任务的执行时间

第二是 要把项目的artisan目录路径写对

第三 schedule:run就是执行咱们之前写的任务调度,也就是kernel.php文件中的schedule方法。

 

如果是大家自己测试的话,可以随便写个定时任务,每分钟执行以下,这样就能准确的知道自己的定时任务是否正确了。

以上这篇关于laravel5.5的定时任务详解(demo)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/LJFPHP/article/details/80417552

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容