Schedule 任務排程,讓Laravel 自動執行排定任務
Schedule 任務排程可以在很多種情況下使用到,比如說需要定期檢查某件事情完成與否,或扯定期將資料送往另一台伺服器
又或者最常見的將電子報寄送,都是透過這種排成任務的方式來執行
基本概念
對Laravel 還不是很熟悉的朋友請先看過以下文章喔
首先,最基本的觀念是透過作業系統的定期排程工作來完成事件的觸發
在windows上可以用排程工作設定需要定期執行哪個檔案(通常可以寫成.bat)
在linux上可以透過
| 
					 1  | 
						crontab -e  | 
					
來編輯需要排成的工作指令,舉例
| 
					 1 2  | 
						# 每天凌晨 3 點做資料備份 0 3 * * * /usr/bin/php /home/document/project/artisan cronjob:backup  | 
					
值得注意的是,前面0 3 跟 * 代表的是時間,分別說明如下
- 分(0-59)
 - 時(0-23)
 - 每個月第幾天(1-31)
 - 月份(1-12)
 - 每週的第幾天(0-6),0代表星期日其他依序
 
參考範例
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
						# 每小時的第 18 分鐘執行 18 * * * * # 8 點 10 分執行 10 8 * * * # 8 點的每分鐘執行一次(共執行 60 次) * 8 * * * # 在每個禮拜二每小時的第 18 分鐘執行 18 * * * 2 # 你也可以每隔一段時間去執行 crontab # 如果我們每 15 分鐘要去執行,你可以用這樣的格式 */15 # 這樣的意思是將分鐘數,切割成(除以)每 15 分鐘執行 */15 * * * * # 每 2 小時執行 0 */2 * * * # 每 2 小時又 20 分鐘執行 */20 */2 * * *  | 
					
Larvel 實作
透過作業系統排程每分鐘執行 schedule:run 指令
| 
					 1  | 
						* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1  | 
					
舉例說明
我們將要排程的工作寫在app/Console/Command/test.php
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29  | 
						<?php namespace App\Console\Commands; use Illuminate\Console\Command; use DB; class TestLog extends Command {     // 命令名稱     protected $signature = 'test:insert';     // 說明文字     protected $description = '[測試] 寫入資料庫';     public function __construct()     {         parent::__construct();     }     // Console 執行的程式     public function handle()     {         DB::table('log')          ->insert([           'time' => date('Y-m-d H:i:s')          ])     } }  | 
					
重點 :需要執行工作的地方寫在handle()中
以上設定完成之後可以透過指令直接執行
| 
					 1  | 
						php artisan test:insert  | 
					
接著要在laravel中定義此排程工作,編輯檔案 app/Console/Command/Kernal.php
大略會長成這樣子
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22  | 
						<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule; use Illuminate\Foundation\Console\Kernel as ConsoleKernel; class Kernel extends ConsoleKernel {     // 定義應用程式的 Artisan 指令     protected $commands = [         \App\Console\Commands\test::class,     ];     // 定義應用程式的排程     protected function schedule(Schedule $schedule)     {         // 每分鐘執行 Artisan 命令 test:Log         $schedule->command('test:insert')->everyMinute();     } }  | 
					
接著就會在資料庫中看到每分鐘記錄下來的資料了
避免重複執行
有些排程工作可能需要一點時間才能做完,修改$schedule指令可以避免工作還沒完成又再次進入工作
| 
					 1  | 
						$schedule->command('test:insert')->withoutOverlapping();  | 
					
首頁 » 技術文章 » Laravel » Schedule 任務排程,讓Laravel 自動執行排定任務

