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 () { // 任务已经完成... });