Code前端首页关于Code前端联系我们

laravel5.5定时任务详解(demo示例)

terry 2年前 (2023-09-25) 阅读数 48 #后端开发

1.准备环境

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

框架:laravel 5.5(确认可以运行)

要求:每天晚上凌晨1点运行定时操作

2. 计划任务的步骤

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文件夹。我们会看到里面已经有了一个文件

,大致代码如下:

<?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。调度命令创建完成后,我们需要修改文件中的

文件,主要是定义命令调度时间、命令执行顺序等。

本节参考了laravel的官方文档:

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

4。我的文件

<?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)
 {
 // 每天凌晨  执行同步 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/');
 }
}

具体的调度方法Schedule()可以去laravel。看一下文档,它可以确定很多事情。我这里使用的是钩子函数。当多个定时任务需要同时运行时,可以使用after、before等方法对多个定时任务进行排序。

3。请执行我们的计时

虽然总是说Laravel的定时任务很强大,但本质上是离不开服务器端cron脚本的。 。

1。首先检查服务器上的预定条目

2。添加或编辑 cron 条目

3。添加我们在里面写的方法路径

laravel5.5定时任务详解(demo实例)

在里面添加我们的计划任务。

第一个是确定定时任务的执行时间

第二个是正确写出项目的工艺文件夹路径

第三个schedule:run是运行什么我们前面写的Task调度就是文件中的调度方法。

如果你自己测试一下,你可以写一个定时任务,每分钟运行下一个,这样你就可以准确地知道你的定时任务是否正确。

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门