Laravel 命令调度器允许你在 Laravel 中对命令调度进行清晰流畅的定义,并且仅需要在服务器上增加一条 Cron 项目即可。
你的调度已经定义在 app/Console/Kernel.php
文件的 schedule
方法中。为了方便你开始,在该方法内包含了一个简单的例子。你可以随意增加调度到 Schedule
对象中。
1、唯一一个需要加入到服务器的 Cron 项目(注意这里path为项目绝对路径):
* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1
e.g. * * * * * php /home/vagrant/Code/test/artisan schedule:run >> /dev/null 2>&1
2、你可以将所有的计划任务定义在 App\Console\Kernel
类的 schedule
方法中。在开始之前,先让我们来看看一个任务的调度示例。在该例子中,我们计划了一个会在每分钟被调用的闭包。该闭包将插入一条数据:
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Illuminate\Support\Facades\DB;
class Kernel extends ConsoleKernel
{
protected $commands = [
Commands\Inspire::class,
];
/**
* 在这里定义你的计划任务
*/
protected function schedule(Schedule $schedule)
{
//每分钟添加一条数据
$schedule->call(function () {
$data = [
'name'=>'myname'.rand(2,100),
'email'=>'myname'.rand(2,100).'@126.com',
'password'=>bcrypt('123456'),
];
DB::table('users')->insert($data);
})->everyMinute();
}
}
调度频率设置#
当然,你可以针对你的任务来分配多种调度计划:
方法 | 描述 |
---|---|
->cron('* * * * * *'); | 在自定义的 Cron 调度运行该任务 |
->everyMinute(); | 每分钟运行该任务 |
->everyFiveMinutes(); | 每五分钟运行该任务 |
->everyTenMinutes(); | 每十分钟运行该任务 |
->everyThirtyMinutes(); | 每三十分钟运行该任务 |
->hourly(); | 每小时运行该任务 |
->daily(); | 每天午夜运行该任务 |
->dailyAt('13:00'); | 每天的 13:00 运行该任务 |
->twiceDaily(1, 13); | 每天的 1:00 及 13:00 运行该任务 |
->weekly(); | 每周运行该任务 |
->monthly(); | 每月运行该任务 |
->yearly(); | 每年运行该任务 |
这些方法可以合并其它限制条件以生成更精确的调度。例如在某周的某几天运行调度。举个例子,计划一个每周周一的调度:
$schedule->call(function () {
// 在每个礼拜一的 13:00 运行一次...
})->weekly()->mondays()->at('13:00');
下方列出其它额外限制条件:
方法 | 描述 |
---|---|
->weekdays(); | 限制任务在工作日 |
->sundays(); | 限制任务在星期日 |
->mondays(); | 限制任务在星期一 |
->tuesdays(); | 限制任务在星期二 |
->wednesdays(); | 限制任务在星期三 |
->thursdays(); | 限制任务在星期四 |
->fridays(); | 限制任务在星期五 |
->saturdays(); | 限制任务在星期六 |
->when(Closure); | 限制任务基于一个为真的验证; |
为真验证限制条件#
when
方法可以用来判断是否要运行任务,主要基于一个指定的为真验证的运行结果。换句话说,如果指定的 闭包
返回 true
,且没有其它限制条件存在,那么这个任务将会被继续运行。
$schedule->command('emails:send')->daily()->when(function () {
return true;
});
当链式调用了 when
方法时,计划命令只有在所有的 when
条件返回 true
时才运行。