任务调度定义在app/Console/Kernel.php
文件的schedule
方法中,该方法中已经包含了一个示例。你能够自由地添加你须要的调度任务到Schedule
对象。php
下面是你惟一须要添加到服务器的Cron条目:html
* * * * * php /项目目录所在/artisan schedule:run 1>> /dev/null 2>&1
该Cron将会每分钟调用Laravel命令调度,而后,Laravel评估你的调度任务并运行到期的任务。node
你能够在App\Console\Kernel
类的schedule
方法中定义全部调度任务。开始以前,让咱们看一个调度任务的例子,在这个例子中,咱们将会在天天午夜调度一个被调用的闭包。在这个闭包中咱们将会执行一个数据库查询来清空表:laravel
<?php namespace App\Console; use DB; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel{ /** * 应用提供的Artisan命令 * * @var array */ protected $commands = [ 'App\Console\Commands\Inspire', ]; /** * 定义应用的命令调度 * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { $schedule->call(function () { DB::table('recent_users')->delete(); })->daily(); } }
除了调度闭包调用外,还能够调度Artisan命令和操做系统命令。例如,能够使用command
方法来调度一个Artisan命令:数据库
$schedule->command('emails:send --force')->daily();
exec
命令可用于发送命令到操做系统:json
$schedule->exec('node /home/forge/script.js')->daily();
固然,你能够分配多种调度到任务:服务器
方法 | 描述 |
---|---|
->cron('* * * * *'); |
在自定义Cron调度上运行任务 |
->everyMinute(); |
每分钟运行一次任务 |
->everyFiveMinutes(); |
每五分钟运行一次任务 |
->everyTenMinutes(); |
每十分钟运行一次任务 |
->everyThirtyMinutes(); |
每三十分钟运行一次任务 |
->hourly(); |
每小时运行一次任务 |
->daily(); |
天天凌晨零点运行任务 |
->dailyAt('13:00'); |
天天13:00运行任务 |
->twiceDaily(1, 13); |
天天1:00 & 13:00运行任务 |
->weekly(); |
每周运行一次任务 |
->monthly(); |
每个月运行一次任务 |
这些方法能够和额外的约束一块儿联合起来建立一周特定时间运行的更加细粒度的调度,例如,要每周一调度一个命令:闭包
$schedule->call(function () { // 每周星期一13:00运行一次... })->weekly()->mondays()->at('13:00')
下面是额外的调度约束列表:app
方法 | 描述 |
---|---|
->weekdays(); |
只在工做日运行任务 |
->sundays(); |
每一个星期天运行任务 |
->mondays(); |
每一个星期一运行任务 |
->tuesdays(); |
每一个星期二运行任务 |
->wednesdays(); |
每一个星期三运行任务 |
->thursdays(); |
每一个星期四运行任务 |
->fridays(); |
每一个星期五运行任务 |
->saturdays(); |
每一个星期六运行任务 |
->when(Closure); |
基于特定测试运行任务 |
when
方法用于限制任务在经过给定测试以后运行。换句话说,若是给定闭包返回true
,只要没有其它约束条件阻止任务运行,该任务就会执行:composer
$schedule->command('emails:send')->daily()->when(function () { return true; });
默认状况下,即便前一个任务仍然在运行调度任务也会运行,要避免这样的状况,可以使用withoutOverlapping
方法:
$schedule->command('emails:send')->withoutOverlapping();
在本例中,Artisan命令emails:send
每分钟都会运行,若是该命令没有在运行的话。若是你的任务在执行时常常大幅度的变化,那么withoutOverlapping
方法就很是有用,你没必要再去预测给定任务到底要消耗多长时间。
Laravel调度器为处理调度任务输出提供了多个方便的方法。首先,使用sendOutputTo
方法,你能够发送输出到文件以便稍后检查:
$schedule->command('emails:send') ->daily() ->sendOutputTo($filePath);
使用emailOutputTo
方法,你能够将输出发送到电子邮件,注意输出必须首先经过sendOutputTo
方法发送到文件。还有,使用电子邮件发送任务输出以前,应该配置Laravel的电子邮件服务:
$schedule->command('foo') ->daily() ->sendOutputTo($filePath) ->emailOutputTo('foo@example.com');
注意:emailOutputTo
和sendOutputTo
方法只对command
方法有效,不支持call
方法。
使用before
和after
方法,你能够指定在调度任务完成以前和以后要执行的代码:
$schedule->command('emails:send') ->daily() ->before(function () { // Task is about to start... }) ->after(function () { // Task is complete... });
使用pingBefore
和thenPing
方法,调度器能够在任务完成以前和以后自动ping给定的URL。该方法在通知外部服务时颇有用,例如Laravel Envoyer,在调度任务开始或完成的时候:
$schedule->command('emails:send') ->daily() ->pingBefore($url) ->thenPing($url);
使用pingBefore($url)
或thenPing($url)
特性须要安装HTTP库Guzzle,能够在composer.json
文件中添加以下行来安装Guzzle到项目:
"guzzlehttp/guzzle": "~5.3|~6.0"