今天來跟大家分享排程的經驗,在很多的專案中,有些需要定時工作的項目如爬資料、定時更新/刪除檔案,就會交由定期排程來實作。
在這個實作中,我們是以 Linux 為開發主機,因此我們先進入 crontab 的編輯畫面內。
crontab -e
再輸入以下內容即可定期執行 Laravel 的排程任務
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
並至 app/Console/Kernel.php
內即可進行排程工作囉!
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('everyday')->insert([
['today' => date('Y-m-d H:i:s')]
]);
})->daily();
}
Laravel 也有自訂 command line 的方式,就是用 Artisan 實作的,平常用慣了,想要自己做一個專屬的指令,也可以在這裡做給你。
產生 command 檔
php artisan make:command PrintLog
接下來我們就到 app/Console/Commands/PrintLog.php
內新增程式碼
class PrintLog extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'print:log';
/**
* The console command description.
*
* @var string
*/
protected $description = 'print system log';
/**
* Create a new command instance.
*
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
*
* @return int
*/
public function handle()
{
$this->info('現在時間: ' . now()->toDateTimeString());
}
}
$signature
為這個指令的呼叫名稱,也可以在後面放入變數。handle
為這個指令需要做的工作。
你也可以在這邊引用其他的方法,或是將 Model
或是 Controller
引用近來透過指令進行操作,不過如果是包成指令,還是建議以需要排程的狀況再進行使用即可。
我們先試跑這個已經做完的指令。
php artisan print:log
這個時候就可以到 Kernel.php
內排定這個指令的時間了。
protected function schedule(Schedule $schedule)
{
$schedule->call(function () {
DB::table('recent_users')->delete();
})->daily();
$schedule->command('print:log')
->everyMinute();
}
這樣每分鐘就會執行這個指令一次了,如果你在設計系統的時候需要定期排程更新或刪除檔案,都可以利用這個方式,將所有動作包裝成指令,再進行排程工作,都非常的方便。