Magento2 開發 – 設置排程群組
如果各位接觸Magento2開發有一段時間,對於添加排程工作想必不陌生。今天想與大家進一步分享的,是關於排程進階的參數控制。如果您發現預計執行的工作,沒有如預期產生在cron_schedule資料表,或者沒有正常的執行,那麼有可能是被這些隱性參數所影響。
當我們新增排程任務時,可以選擇依附在原生預設的排程群組裡,或者另外新增自己的排程群組。使用自己的群組,就多了進階參數可以控制旗下任務的排程細節。
假設現在要為範例模組 AstralWeb_Test 設定單獨的排程群組,需要新增以下範例檔
app/code/AstralWeb/Test/etc/cron_group.xml
這個cron_demo群組,有著下參數:
schedule_generate_every – 群組任務寫入資料表cron_schedule的頻率。假設值為10,則每隔10鐘,才會長出近期要執行的任務資料。這裏我們設定每分鐘。
schedule_ahead_for – 排程資料產生的提前時間。這裡設定為前五分鐘,也就說,假設任務執行預定每分鐘,那麼在1:00這個時點,排程會確保 1:01、1:02、1:03、1:04、1:05 的任務資料被產生。
schedule_lifetime – 任務的有效時間。這個值是控制任務是否執行的過期判定,因為前面設定每分鐘都產生,所以這裡設定一分鐘過期即可。
history_cleanup_every – 清除歷史資料的頻率。對於無用的資料,定期清除可以減少資料庫負擔。
history_success_lifetime – 執行成功的任務資料保留時間。
history_failure_lifetime – 執行失敗的任務資料保留時間。為了保留除錯資訊,通常這個值會極大。
use_seperate_process – 是否獨立執行。若群組獨立執行,表示不會受到其他群組排程執行的影響。這樣講有點抽象,我們不妨直接以目前的設定值0,測試不獨立會有什麼結果:
首先在群組cron_demo下建立任務cron_demo_example,設定每分鐘執行。
另外在群組default(原生提供)下建立任務cron_demo_broken_example,一樣設定每分鐘執行。
在cron正常啟用下,每分鐘這兩個任務都會如期執行。
現在我們針對任務cron_demo_broken_example做點手腳,置入強制中斷的程式碼 exit(‘demo’); 來模擬異常中斷。
繼續觀察排程的執行,會發現cron_demo_broken_example不斷發生執行狀態error,而cron_demo_example則始終停留在pending。顯然cron_demo_example在執行上因前者異常中斷,沒有被執行,甚至新的排程資料也沒有產生。
現在把群組cron_demo的參數use_seperate_process改成1,再次查看排程狀態
這回兩個任務皆正常運作:cron_demo_broken_example維持error,cron_demo_example執行成功,彼此互不影響。相信這個測試,各位應該清楚其中的差異囉!
透過以上的參數調整,開發者可以依據任務的特性,盡量以較少的系統資源順暢任務執行。反之,若參數不當使用,就會出現烏龍排程。比如說,schedule_ahead_for設定5分鐘,schedule_generate_every卻長達一小時,則預定每分鐘要執行的任務,會變成僅運作每小時的前五分鐘,因為整點時只產五分鐘內的工作排程,而接下來的55分鐘卻不會有任何工作產生,也就發生不明原因的停擺囉!
那麼要是發現參數需要緊急修正,或者臨時要強制驅動任務該怎麼辦呢?顯然Magento已經考慮到這樣的需求,所有的排程群組,都可以從後台即時調整參數值:
STORES > Advanced > System > Cron (Scheduled Tasks)
從這個介面,管理者可以總覽控制全部的排程群組,包括原生、套件、與自行客製的項目。下回發生特定排程任務異常時,若非程式錯誤引起,各位不妨在這裏檢查一下,我們下回見囉!
如果您有更多疑問可以詢問我們,未來會撰寫更多電商網站相關文章,您想知道什麼嗎?歡迎在下方留言給我們。或追蹤我們的粉絲專頁及IG,也別忘了訂閱電子報,就不錯過最新文章喔!
想學習更多Magento設定嗎?請見:Magento教學導覽
我要留言