任務過期 & 超時
任務過期 在配置文件 config/queue.php
中,每個連接都定義了 retry_after
項。該配置項的目的是定義任務在執行以後多少秒後釋放回隊列。如果retry_after
設定的值爲 60, 任務在運行 60 秒後還未完成,那麼將被釋放回隊列而不是刪除掉。毫無疑問,你需要把 retry_after
的值設定爲任務執行時間的最大可能值。
注:只有 Amazon SQS 配置信息不包含 retry_after 項。Amazon SQS 的任務執行時間基於
Default Visibility Timeout
,該項在 Amazon AWS 控制檯配置。
隊列進程超時 隊列進程 queue:work
可以設定超時 --timeout
項。該 --timeout
控制隊列進程執行每個任務的最長時間,如果超時,該進程將被關閉。各種錯誤都可能導致某個任務處於“凍結”狀態,比如 HTTP 無響應等。隊列進程超時就是爲了將這些“凍結”的進程關閉:
php artisan queue:work --timeout=60
配置項 retry_after
和 Aritisan 參數項 --timeout
不同,但目的都是爲了確保任務的安全,並且只被成功的執行一次。
注:參數項
--timeout
的值應該始終小於配置項retry_after
的值,這是爲了確保隊列進程總在任務重試以前關閉。如果--timeout
比retry_after
大,那麼你的任務可能被執行兩次。
進程休眠時間 當任務在隊列中有效時,進程會持續處理任務,沒有延遲。不過,我們可以使用 sleep
配置項來指定沒有新的有效任務產生時的休眠時間:
php artisan queue:work --sleep=3