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
時才運行。