当前位置:首页 > CMS教程 > 其它CMS > 列表

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

发布:smiling 来源: PHP粉丝网  添加日期:2022-01-16 17:22:22 浏览: 评论:0 

今天小编就为大家分享一篇关于laravel5.5的定时任务详解(demo),具有很好的参考价值,希望对大家有所帮助,一起跟随小编过来看看吧。

一、准备环境

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

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

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

二、定时任务的步骤

1、根据文档,创建命令

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

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

这里使用laravel给定的 php artisan来生成命令,此处的Test就是我们要生成的文件

这里的artisan代表的不仅仅是laravel自带的命令,他其实是laravel下的artisan目录,因为这个目录没有x,也就是可执行权限,所以不能使用 ./artisan 来执行,只能通过php来执行

php artisan make:command Test

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

大致的代码如下:

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

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

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

这部分参考laravel官方文档:

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

4、我的kernel.php文件

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

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

三、执行我们的定时

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

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

crontab -l

2、新增或编辑cron 条目

crontab -e

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

laravel5.5 laravel定时任务

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

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

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

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

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

Tags: laravel5.5 laravel定时任务

分享到:

相关文章