在以前, 開發(fā)者需要為每一個(gè)需要調(diào)度的任務(wù)編寫一個(gè) Cron 條目, 這是很讓人頭疼的事. 你的任務(wù)調(diào)度不在源碼控制中, 你必須使用 SSH 登錄到服務(wù)器然后添加這些 Cron 條目.
Laravel命令調(diào)度器允許你平滑而又富有表現(xiàn)力地在Laravel中定義命令調(diào)度, 并且服務(wù)器上只需要一個(gè) Cron 條目即可, 任務(wù)調(diào)度又是我們俗稱的 “計(jì)劃任務(wù)”
任務(wù)調(diào)度定義在app/Console/Kernel.php文件的schedule方法中,該方法中已經(jīng)包含了一個(gè)示例。你可以自由地添加你需要的調(diào)度任務(wù)到Schedule對(duì)象
開啟調(diào)度
//在linux環(huán)境中執(zhí)行
* * * * * root php /var/www/laravel/artisan schedule:run
/var/www/laravel為你的項(xiàng)目目錄
該 Cron 將會(huì)每分鐘調(diào)用Laravel命令調(diào)度,然后,Laravel評(píng)估你的調(diào)度任務(wù)并運(yùn)行到期的任務(wù)。
定義調(diào)度
在
項(xiàng)目根目錄下創(chuàng)建定時(shí)任務(wù)所需要進(jìn)行的操作
創(chuàng)建命令
創(chuàng)建命令(Laravel 5.1):php artisan make:console Stat_Test
創(chuàng)建命令(Laravel 5.3):php artisan make:command Stat_Test
該操作會(huì)在app/Console/Commands下生成一個(gè)Stat_Test.php
下面打開該文件 給大家展示一個(gè)簡(jiǎn)單而又完整的代碼例子
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class Stat_Test extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'stat:test';
/**
* The console command description.
*
* @var string
*/
protected $description = 'stat:test';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return mixed
*/
public function handle()
{
$this->addData();
}
// 例子
public function addData() {
$time = time();
$rand = rand(1, 1000);
$id = \DB::table('data_test')->insertGetId(['uuid' => $time, 'uuid' => $rand]);
if ($id) {
\Log::info('定時(shí)/數(shù)據(jù)插入成功', $id);
} else {
\Log::error('定時(shí)/數(shù)據(jù)插入失敗', $time);
}
}
}
值得注意的是 這個(gè)文件中的 $signature = 'stat:test' 這個(gè)簽名在 Kernel.php 中也要相應(yīng)用到, 下面是附上 Kernel.php 的完整代碼
<?php
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.
*
* @var array
*/
protected $commands = [
\App\Console\Commands\Inspire::class,
'\App\Console\Commands\Stat_Test',
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
// 為測(cè)試方便 每分鐘執(zhí)行一次
$schedule->command('stat:test')->everyMinute();
}
}
再?gòu)?qiáng)調(diào)一次
$schedule->command('stat:test')里面的stat:test必須和上面的簽名$signature = 'stat:test'對(duì)應(yīng)上
protected $commands = [
\App\Console\Commands\Inspire::class,
'\App\Console\Commands\Stat_Test',
];
也要把引入你的調(diào)度文件
// 每周星期六11:00運(yùn)行一次...
$schedule->command('stat:test')->weekly()->saturdays()->at('11:00');
// 每周星期一:00運(yùn)行一次...
$schedule->command('stat:test')->weekly()->->mondays()->at('01:00');
調(diào)度常用選項(xiàng)
當(dāng)然,你可以分配多種調(diào)度到任務(wù)
->cron('* * * * *'); 在自定義 Cron 調(diào)度上運(yùn)行任務(wù)
->everyMinute(); 每分鐘運(yùn)行一次任務(wù)
->everyFiveMinutes(); 每五分鐘運(yùn)行一次任務(wù)
->everyTenMinutes(); 每十分鐘運(yùn)行一次任務(wù)
->everyThirtyMinutes(); 每三十分鐘運(yùn)行一次任務(wù)
->hourly(); 每小時(shí)運(yùn)行一次任務(wù)
->daily(); 每天凌晨零點(diǎn)運(yùn)行任務(wù)
->dailyAt('13:00'); 每天 13:00運(yùn)行任務(wù)
->twiceDaily(1, 13); 每天 1:00 & 13:00 運(yùn)行任務(wù)
->weekly(); 每周運(yùn)行一次任務(wù)
->monthly(); 每月運(yùn)行一次任務(wù)
下面是額外的調(diào)度約束列表:
->weekdays(); 只在工作日運(yùn)行任務(wù)
->sundays(); 每個(gè)星期天運(yùn)行任務(wù)
->mondays(); 每個(gè)星期一運(yùn)行任務(wù)
->tuesdays(); 每個(gè)星期二運(yùn)行任務(wù)
->wednesdays(); 每個(gè)星期三運(yùn)行任務(wù)
->thursdays(); 每個(gè)星期四運(yùn)行任務(wù)
->fridays(); 每個(gè)星期五運(yùn)行任務(wù)
->saturdays(); 每個(gè)星期六運(yùn)行任務(wù)
->when(Closure); 基于特定測(cè)試運(yùn)行任務(wù)