Skip to main content

什麼是任務排程

過去在伺服器上要定期執行的任務,每個都需手動撰寫 cron entry。 但這樣的排程定義存在於原始碼之外,無法納入版本控制,每次確認或變更都需要 SSH 登入。 使用 Laravel 的排程器,可在應用程式內流暢定義排程。 在伺服器上只需登記一行 cron entry,排程定義隨程式碼一起納入版控。 排程通常寫在 routes/console.php,是標準風格。
schedule:list Artisan 指令可查看已定義任務清單與下次執行時間。

排程器的執行流程

排程的定義方式

排程定義寫在 routes/console.php。 也可以透過 bootstrap/app.phpwithSchedule 方法定義。

可排程的任務種類

Artisan 指令的排程

command 方法排程 Artisan 指令。 可用指令名稱或類別名稱指定。
在 closure 定義的 Artisan 指令,也可在定義後緊接鏈式排程方法。

Queue Job 的排程

job 方法排程queue job。 是不用 closure 就能把 job 送入 queue 的便利方法。
也可指定 queue 名稱或連線目標。

Shell 指令的排程

exec 方法執行 OS 指令。

Closure 的排程

call 方法排程任意 PHP closure。
也能傳入有 __invoke 方法的 Invocable 物件。

設定排程頻率

主要頻率方法

以下為常用的頻率方法。

用 cron 式直接指定

也可用 cron 方法直接指定 cron 式。

頻率與星期的組合

結合頻率方法與星期限制可製作更精細的排程。

設定時區

timezone 方法可為個別任務指定時區。
若要為所有任務設定共同時區,使用 config/app.phpschedule_timezone
若使用有夏令時間的時區,切換時刻可能導致任務執行兩次或完全不執行。 建議盡量使用 UTC。

條件限制

when / skip

when 在 closure 回傳 true 時執行任務。 skip 相反,回傳 true 時跳過。

environments

environments 方法可限制只在特定環境執行。

時間的限制

between / unlessBetween 可限制執行時段。

星期的限制

防止重複

預設情況下,即使上次的任務仍在執行也會啟動下次執行。 用 withoutOverlapping 可讓下一次執行等待上次結束。
也能指定鎖定的有效期限(分鐘)。預設 24 小時。
withoutOverlapping 使用應用程式的快取管理鎖定。 任務因非預期問題卡住時,可用 schedule:clear-cache 解除鎖定。

多台伺服器的執行控制

若多台伺服器都執行排程器,可用 onOneServer 讓任務只在一台伺服器執行。
使用此功能需將應用預設快取 driver 設為 databasememcacheddynamodbredis,且所有伺服器需連到同一台快取伺服器。

onOneServer() 的分散執行控制流程

任務分組

當多個任務要套用相同設定時,可用 group 方法整合。

背景執行

同時刻排程的任務預設會依定義順序依序執行。 若有長時間任務,會延遲後續任務的開始。 用 runInBackground 可讓任務在背景平行執行。
runInBackground 只能用於 commandexec 方法。

維護模式

當應用程式處於維護模式時,排程任務不會執行。 若要在維護模式中仍強制執行,使用 evenInMaintenanceMode

維護模式的處理流程

暫停排程器

可在不改動程式碼下暫停排程器。
若在停止期間仍想讓特定任務持續執行,使用 evenWhenPaused。 適用於健康檢查或系統監控等即使維護中也需持續執行的任務。

輸出處理

輸出到檔案

sendOutputTo 可將任務輸出存入檔案。
appendOutputTo 則會附加到既有檔案。

輸出到郵件

emailOutputTo 可將任務輸出以郵件寄送。 需先完成 Laravel 的郵件設定
僅在失敗時寄信可用 emailOutputOnFailure

任務 Hook

before / after 方法可在任務執行前後插入處理。
成功/失敗時的 hook 用 onSuccess / onFailure 定義。

部署到伺服器

1

加入 cron entry

在伺服器的 crontab 加入以下一行,Laravel 排程器就會每分鐘執行。
可用 crontab -e 指令編輯。
2

確認排程器運作

確認已定義任務清單與下次執行時間。
使用 Laravel Cloud 可以不用設定 cron 也能管理排程任務。

本機開發時的執行

本機可不用 cron,而是用 schedule:work 指令常駐排程器。
此指令會在前景執行,每分鐘呼叫排程器。按 Ctrl+C 停止前會持續運作。

Sub-minute 排程(小於 1 分的頻率)

一般 cron 最小單位為 1 分鐘,但 Laravel 可設定以秒為單位的排程。
當有 sub-minute 任務時,schedule:run 會持續運行到該分鐘結束以處理所有 sub-minute 任務。
Sub-minute 任務建議委派給 queue job 或背景指令執行。 因為任務本體若花費時間過長,會延遲後續 sub-minute 任務的執行。
若要在部署期間中斷執行中的 schedule:run,在部署腳本加入以下:

常用指令總覽

最後修改於 2026年8月2日