任务调度|综合话题《Laravel 6 中文文档 6.x》|laravel china中文社区
过去,你可能需要在服务器上为每一个调度任务去创建 Cron 条目。因为这些任务的调度不是通过代码控制的,你要查看或新增任务调度都需要通 SSH 远程登录到服务器上去操作,所以这种方式很快会让人变得痛苦不堪。
Laravel 的命令行调度器允许你在 Laravel 中清晰明了地定义命令调度。在使用这个任务调度器时,你只需要在你的服务器上创建单个 Cron 入口。你的任务调度在 app/Console/Kernel.php 的 schedule 方法中进行定义。为了帮助你更好的入门,这个方法中有个简单的例子。
# 将运行调度器的命令,加入到cron服务中,每分钟调用一次调度器运行命令
# schedule:run 命令被执行时,Laravel将根据定义的内容执行预定的程序
* * * * * /usr/sbin/php /data/www/artisan schedule:run >> /dev/null 2>&1
Linux定时任务(cron服务)
在 Laravel 中的 App\Console\Kernel 类中定义所有的调度任务
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
* 应用中自定义的artisan命令
*
* @var array
*/
protected $commands = [
//
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
/**
* 调度方法: 闭包调用 | shell命令调用 | artisan命令调用 | 队列命令调用 | invokable object调用
*
* 闭包调用:$schedule->call(function () {...})
* shell命令调用:$schedule->exec(...)
* artisan命令调用:$schedule->command(...)
* 队列命令调用:$schedule->job(...)
* invokable object调用:$schedule->job(...)
*/
/**
* 调度频率设置
*
* ->cron('* * * * *') 自定义 Cron 计划执行任务
* ->everyMinute() 每分钟执行一次任务
* ->everyFiveMinutes() 每五分钟执行一次任务
* ->everyTenMinutes() 每十分钟执行一次任务
* ->everyFifteenMinutes() 每十五分钟执行一次任务
* ->everyThirtyMinutes() 每三十分钟执行一次任务
* ->hourly() 每小时执行一次任务
* ->hourlyAt(17) 每小时第 17 分钟执行一次任务
* ->daily() 每天零点执行一次任务
* ->dailyAt('13:00') 每天 13 点执行一次任务
* ->twiceDaily(1, 13) 每天 1 点及 13 点各执行一次任务
* ->weekly() 每周执行一次任务
* ->weeklyOn(1, '8:00') 每周一的 8 点执行一次任务
* ->monthly() 每月执行一次任务
* ->monthlyOn(4, '15:00') 每月 4 号的 15 点 执行一次任务
* ->quarterly() 每季度执行一次任务
* ->yearly() 每年执行一次任务
* ->timezone('America/New_York') 设置时区
*/
// 以下所用例子,调度频率统一设置为每天0点调用
/**
* 闭包调用
* 例:
*/
$schedule->call(function () {
echo "闭包调用测试"."\r\n";
})->daily(); // 正常调度
/**
* invokable object调用
* Invokable objects 指的是 PHP 中含有 __invoke 方法的类。
* 例:
*/
$schedule->call(new DeleteRecentUser)->daily();
/**
* shell命令调用
* $schedule使用exec方法向系统发送命令
* 例:
*/
$schedule->exec('ps -aux | grep drc')->daily();
/**
* artisan命令调用
* 可以通过command()方法传递命令名称或者类来调度一个artisan命令
* 例:
*/
$schedule->command('make:command syncAttackSyslog')->daily();
$schedule->commamd(MakeCommand::class,'syncAttackSyslog')->daily();
/**
* 队列任务调度
* job 方法可以用来调度 队列任务 。 此方法提供了一种快捷方式来调度任务,而无需使用 call 方法创建闭包来调度任务
* 例:
*/
$schedule->job(new Heartbeat)->everyFiveMinutes();
$schedule->job(new Heartbeat, 'heartbeats')->everyFiveMinutes(); // 分发任务到「heartbeats」队列...
/******************************************调度限制*********************************************************************/
/**
* 调度频率限制:
*
* ->weekdays() 限制任务在工作日执行
* ->weekends() 限制任务在周末执行
* ->sundays() 限制任务在周日执行
* ->mondays() 限制任务在周一执行
* ->tuesdays() 限制任务在周二执行
* ->wednesdays() 限制任务在周三执行
* ->thursdays() 限制任务在周四执行
* ->fridays() 限制任务在周五执行
* ->saturdays() 限制任务在周六执行
* ->between($start, $end) 限制任务在 $start 和 $end 区间执行
* ->unlessBetween 不限制任务在一天中的某个时间段的执行
* ->when(Closure) 限制任务在其闭包返回为真时执行
* ->environments($env) 限制任务在特定环境中执行
*/
// 特殊限制条件详解
/**
* ->when(Closure)
* when 方法可根据给定的闭包函数的执行结果判断是否执行,返回 true ,若无其他限制条件阻止,任务就会一直执行:
*
* ->skip()为->when()的逆方法:当其闭包返回true时不执行调度任务
*
* 例:
*/
$schedule->commamd('make:command test')->daily()->when(function () {
return true;
});
/**
* ->environments($env):environments方法可限制任务在给定环境中执行
* 例:
*/
$schedule->commamd('list')->daily()->enviroments(['staging', 'production']);
/***************************************************************************************************************/
/**
* 调度任务避免任务重复: ->withoutOverlapping()
* 例:
*/
$schedule->command('make:command test')->withoutOverlapping();
/**
* 任务仅运行在同一台服务器上: ->onOneServer()
*/
/***************************************后台任务************************************************************************/
/**
* 重点
* 任务后台运行: ->runInBackground(),适用于单个任务执行时间长会延误后面的任务
* 例:
*/
$schedule->command('analytics:report')->daily()->runInBackground();
/***************************************任务输出************************************************************************/
/**
* 任务执行结果输出:
* 正常方式: ->sendOutputTo(string $filePath)
* 附加方式: ->appendOutputTo(string $filePath)
* 发送到指定邮箱: ->emailOutputTo('[email protected]')
* 任务失败时发送结果到邮箱:->emailOutputOnFailure('[email protected]');
*/
/***************************************任务钩子************************************************************************/
/**
* 在调度任务前或调度任务后执行指定的闭包
* 调度任务前: ->before(function () {...})
* 调度任务后: ->after(function() {...})
*/
/**
* 任务成功或失败后执行相应的闭包
* 成功: ->onSuccess(function () {...})
* 失败: ->onFailure(function () {...})
*/
/**
* 在调度任务前或调度任务后ping指定的url, 对于需要通知外部服务任务执行情况有用。
* 调度任务前: ->pingBefore(string $url)
* 调度任务后: ->thenPing(string $url)
* 给定条件为true时,才执行以上命令
* ->pingBeforeIf($condition,string $url)
* ->thenPingIf($condition,$string $url)
*/
/**
* 任务成功或失败后ping 指定的 url
* 成功: ->pingOnSuccess($successUrl)
* 失败: ->pingOnFailure($failureUrl)
*/
}
/**
* Register the commands for the application.
*
* @return void
*/
protected function commands()
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}