Skip to main content

什麼是任務排程

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

排程器的執行流程

排程的定義方式

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

可排程的任務種類

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.php 的 schedule_timezone。
若使用有夏令時間的時區,切換時刻可能導致任務執行兩次或完全不執行。 建議盡量使用 UTC。

條件限制

when / skip

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

environments

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

時間的限制

用 between / unlessBetween 可限制執行時段。

星期的限制

防止重複

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

多台伺服器的執行控制

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

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

任務分組

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

背景執行

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

維護模式

當應用程式處於維護模式時,排程任務不會執行。 若要在維護模式中仍強制執行,使用 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日