laravel 定时任务

1.php artisan make:console Test 生成任务文件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 = '测试';

 

//这个是laravel自带的构造方法。初始状态下是空的。

public function __construct()

{

parent::__construct();

}

/**

* Execute the console command.

*这里就是我们执行操作的地方,里面是command要处理的业务。根据我们的需求进行相关操作

*

* @return mixed

*/

public function handle()

{

DB::table('recent_users')->delete();

}

}

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

<?php

namespace App\Console;

use App\Console\Commands\Test;

use Illuminate\Console\Scheduling\Schedule;

use Laravel\Lumen\Console\Kernel as ConsoleKernel;

 

class Kernel extends ConsoleKernel

{

/**

* The Artisan commands provided by your application.

*引入我们新创建的

* @var array

*/

protected $commands = [

 

'test' => Test::class,

 

];

 

/**

* Define the application's command schedule.

*

* @param \Illuminate\Console\Scheduling\Schedule $schedule

*

* @return void

*/

protected function schedule(Schedule $schedule)

{

// 每日凌晨一点更新会员等级

$schedule->command('test')

->dailyAt('01:00');

// 方式二闭包形式 : call

// $schedule->call(function () {

// DB::table('recent_users')->delete();

// })->daily();

// 方式三 artisan 命令 或者 系统命令 

// $schedule->command('emails:send --force')->daily();

// 方式四 exec 方法可用于调用操作系统命令

// $schedule->exec('node /home/forge/script.js')->daily();

}

}

4.执行测试

一次性启动任务: 常用于测试

php artisan schedule:run //运行所有任务

定时调度

crontab -e * * * * * php 文件路径/artisan schedule:run >> /dev/null 2>&1

 

扩展:

1.真理测试的约束条件

when 方法用于限制任务基于给定真理测试的结果执行。换句话说,如果给定闭包返回true,只要没有其它约束条件阻止任务运行,该任务就会执行:

$schedule->command('emails:send')->daily()->when(function () { return true; });

skip 方法和 when 相反,如果 skip 方法返回true,调度任务将不会执行:

$schedule->command('emails:send')->daily()->skip(function () { return true; });

2.避免任务重叠

$schedule->command('emails:send')->withoutOverlapping();

3.在单台服务器上运行任务

$schedule->command('report:generate') ->fridays() ->at('17:00') ->onOneServer();

4.任务输出

使用sendOutputTo 方法,你可以发送输出到文件以便稍后检查

$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);

追加输出到给定文件,可以使用 appendOutputTo 方法

$schedule->command('emails:send') ->daily() ->appendOutputTo($filePath);

使用 emailOutputTo 方法,你可以将输出通过邮件发送给接收人。使用邮件发送任务输出之前,需要配置 Laravel 的邮件服务

$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');

5.任务钩子

使用 before 和 after 方法,你可以指定在调度任务完成之前和之后要执行的代码:

$schedule->command('emails:send') ->daily() ->before(function () { // 任务即将开始... }) ->after(function () { // 任务已经完成... });

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值