一、任務調度簡介
任務調度是指在應用程序中預定、計劃和執行任務的過程。Laravel任務調度器提供了一種友好的方式來註冊定期運行的任務,而不需要藉助操作系統的Cron語法。任務調度器提供了很多便捷的函數用於設置和維護任務,比如運行頻率、參數、甚至鉤子函數等。
二、任務調度的使用
任務調度的使用需要引入任務調度器的服務提供者和對應的Facade類。在任務調度器中,我們可以使用類似於CRON表達式的語法來定義我們的任務。比如,我們可以定義一個每小時執行一次的代碼塊:
// 註冊任務
$schedule->call(function () {
DB::table('recent_users')->delete();
})->hourly();
除了按照規定時間來執行,我們還可以在任務中構造循環執行的任務:
// 定義循環任務
$schedule->call(function () {
DB::table('users')->update(['queue' => 1]);
})->everyFiveMinutes();
// 規定執行時間
$schedule->call(function () {
// 該語句將在10:00執行
})->dailyAt('10:00');
三、任務調度的控制
任務調度不僅僅是添加和執行任務,它還有很多控制功能。我們可以在任務中使用before和after鉤子函數來控制任務。當然,我們可以使用互斥鎖來避免任務重疊執行,避免數據的不一致性。
$schedule->command('send:report')->sendOutputTo('/tmp/report.log')
->before(function () {
// 首先需要刪除所有郵件數據
DB::table('emails')->delete();
})
->after(function () {
// 定義郵件發送後的操作
})->runInBackground();
四、自定義任務
除了自帶的任務,我們還可以自定義任務。這是一種非常靈活和可用性高的做法。我們可以使用artisan命令來創建我們自己的任務代碼塊。這些任務可以被注入到任務調度器中,並像默認任務一樣被執行。
// 創建task代碼塊
php artisan make:command EmailSend
// 在任務調度器中註冊EmailSend任務
$schedule->command('email:send')->weekly();
五、任務調度的日誌
任務調度的日誌記錄也是非常重要的。我們可以通過使用sendOutputTo和emailOutputTo函數將執行任務後的輸出重定向到日誌文件,也可以通過email函數將任務執行消息郵件給管理員。
// 輸出到日誌文件
$schedule->command('emails:report')->daily()->sendOutputTo('/tmp/report.log');
// 任務執行後的郵件提醒
$schedule->command('emails:report')->daily()->emailOutputTo('admin@example.com');
六、任務調度的異常處理
當任務執行過程中發生異常的時候,我們可以通過usingFailures方法來記錄下這些異常。
// 註冊任務,並定義任務執行的上下文
$schedule->command('emails:report')->daily()
->onSuccess(function () {
// 定義任務成功時的操作
})
->onFailure(function () {
//清除緩存隊列
Artisan::call('queue:restart');
echo "Job Fail".PHP_EOL;
})->withoutOverlapping()->appendOutputTo('log.txt')->usingRealtime();
七、總結
任務調度在Laravel框架中是非常常見和有用的功能。它通過一種簡單的方式,為我們的應用程序提供了自動化管理任務的功能。不僅如此,任務調度器提供了很多高級的特性來控制任務的執行效果,比如鉤子函數、任務間的互斥鎖等。我們相信,使用任務調度器,可以大幅度的提高我們的應用程序的執行效率和可靠性。
原創文章,作者:EGBKN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/370514.html