在以前, 開發者需要為每一個需要調度的任務編寫一個 Cron 條目, 這是很讓人頭疼的事. 你的任務調度不在源碼控制中, 你必須使用 SSH 登錄到服務器然后添加這些 Cron 條目.
Laravel
命令調度器允許你平滑而又富有表現力地在Laravel
中定義命令調度, 并且服務器上只需要一個 Cron 條目即可, 任務調度又是我們俗稱的 “計劃任務”
任務調度定義在app/Console/Kernel.php
文件的schedule
方法中,該方法中已經包含了一個示例。你可以自由地添加你需要的調度任務到Schedule
對象
開啟調度
//在linux環境中執行
* * * * * root php /var/www/laravel/artisan schedule:run
/var/www/laravel
為你的項目目錄
該 Cron 將會每分鐘調用Laravel
命令調度,然后,Laravel
評估你的調度任務并運行到期的任務。
定義調度
在
項目根目錄
下創建定時任務所需要進行的操作
創建命令
創建命令(Laravel 5.1):php artisan make:console Stat_Test
創建命令(Laravel 5.3):php artisan make:command Stat_Test
該操作會在app/Console/Commands
下生成一個Stat_Test.php
下面打開該文件 給大家展示一個簡單而又完整的代碼例子
<?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('定時/數據插入成功', $id);
} else {
\Log::error('定時/數據插入失敗', $time);
}
}
}
值得注意的是 這個文件中的 $signature = 'stat:test'
這個簽名在 Kernel.php
中也要相應用到, 下面是附上 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)
{
// 為測試方便 每分鐘執行一次
$schedule->command('stat:test')->everyMinute();
}
}
再強調一次
$schedule->command('stat:test')
里面的stat:test
必須和上面的簽名$signature = 'stat:test'
對應上
protected $commands = [
\App\Console\Commands\Inspire::class,
'\App\Console\Commands\Stat_Test',
];
也要把引入你的調度文件
// 每周星期六11:00運行一次...
$schedule->command('stat:test')->weekly()->saturdays()->at('11:00');
// 每周星期一:00運行一次...
$schedule->command('stat:test')->weekly()->->mondays()->at('01:00');
調度常用選項
當然,你可以分配多種調度到任務
->cron('* * * * *'); 在自定義 Cron 調度上運行任務
->everyMinute(); 每分鐘運行一次任務
->everyFiveMinutes(); 每五分鐘運行一次任務
->everyTenMinutes(); 每十分鐘運行一次任務
->everyThirtyMinutes(); 每三十分鐘運行一次任務
->hourly(); 每小時運行一次任務
->daily(); 每天凌晨零點運行任務
->dailyAt('13:00'); 每天 13:00運行任務
->twiceDaily(1, 13); 每天 1:00 & 13:00 運行任務
->weekly(); 每周運行一次任務
->monthly(); 每月運行一次任務
下面是額外的調度約束列表:
->weekdays(); 只在工作日運行任務
->sundays(); 每個星期天運行任務
->mondays(); 每個星期一運行任務
->tuesdays(); 每個星期二運行任務
->wednesdays(); 每個星期三運行任務
->thursdays(); 每個星期四運行任務
->fridays(); 每個星期五運行任務
->saturdays(); 每個星期六運行任務
->when(Closure); 基于特定測試運行任務