Laravel 設定排程,自動執行指令
Laravel 自帶類似crontab的功能,設定起來非常方便。
好處就是可以隨著專案一起上git;壞處就是會隨著專一起上git哈哈哈~
我用自己是有設定排程固定時間進行更新,並且在執行維護的時候寄Email通知我,下面就是設定的內容啦~
首先我的層級目錄是這樣的app
-Console
-Commands
-Update1.php
-Update2.php
-Kernel.php
然後在 Kernel.php 中寫 - 要執行的指令 && 排程<?phpnamespace App\Console;use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use Config;
use Mail;
use Log;class Kernel extends ConsoleKernel
{
// 如果有自定義的Command,這要在這先註冊 class name
protected $commands = [
Commands\Update1::class,
Commands\Update2::class,
];protected function schedule(Schedule $schedule)
{// 任務1
$schedule
->command('update:num1')
->weekly() // 每週執行
->mondays() // 每個星期一執行
->at(Config::get('update.time')) // 維護的時間在config中
->after(function () {
Log::info('維護開始');
Mail::raw('維護開始', function($message) {
$message->to('[email protected]');
$message->subject('維護開始');
});
});// 任務2
$schedule
->command...
->...
}
}?>
然後要注意的是,在維護的時候一般是任務是不會生效的,
所以要用 evenInMaintenanceMode()$schedule->command('down');
$schedule->command('update:num1')->evenInMaintenanceMode(); //這樣才會執行
$schedule->command('up')->evenInMaintenanceMode();
承上:要如何自訂 Command 呢?
首先,透過artisan建立命令php artisan make:command Update1
然後在 app/Console/Commands/ 下會生成 Update1.php ,內容為<?phpnamespace App\Console\Commands;use Illuminate\Console\Command;class Update1 extends Command
{
// 取名你要下的指令名稱,可以和 class name 不同
protected $signature = 'update:num1';// 簡單的功能描述
protected $description = 'Update num1 Sum';public function __construct()
{
parent::__construct();
}// 這個命要要執行的內容
public function handle()
{
$this->mySum();
}// 這句可以讓執行完後,在畫面上顯示一些提示
$this->info('Update num1 finished');// handle() 裡面可以用外面的function才不會一大包
protected function mySum($x, $y)
{
...
}
}?>
更詳細的排程設定可以參考
https://laravel-china.org/docs/laravel/5.5/scheduling/1325#maintenance-mode