任务重试、延迟与链式执行
配置尝试次数和延迟,并将相互依赖的任务串联起来。
任务重试、延迟与链式执行 是 CoddyKit 上的免费 PHP Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 PHP Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 PHP Academy 课程共包含 4 节课。
最大尝试次数
设置任务在移入 failed_jobs 之前应重试的次数。
<?php
class SendWelcomeEmail implements ShouldQueue
{
public int $tries = 3; // retry up to 3 times
}最大异常次数
使用 $maxExceptions 根据异常次数限制重试次数(不同于尝试次数,后者会计算包括超时在内的所有尝试)。
<?php
public int $maxExceptions = 3;重试间隔
设置两次重试尝试之间的延迟时间(以秒为单位)。
<?php
public int $backoff = 60; // wait 60 seconds before retry
// Or exponential backoff:
public function backoff(): array
{
return [1, 5, 10]; // 1s, 5s, 10s between attempts
}任务超时
设置最大执行时间(以秒为单位)。如果工作进程超过该时间,任务会被释放回队列。
<?php
public int $timeout = 120; // 2 minutes max延迟分发
在调用分发的位置延迟任务。
<?php
SendReminder::dispatch($user)->delay(now()->addDay());
// Or pass a Carbon instance:
SendReminder::dispatch($user)->delay(Carbon::tomorrow());fail() 和 released()
在 handle() 中,调用 $this->fail($exception) 可立即将任务标记为失败;调用 $this->release($delay) 可延迟后将任务重新加入队列。
<?php
public function handle(): void
{
try {
// ...
} catch (TransientException $e) {
$this->release(30); // re-queue in 30 seconds
} catch (FatalException $e) {
$this->fail($e); // mark as failed now
}
}failed() 方法
在任务中定义 failed() 方法,以便在所有尝试耗尽后执行清理工作。
<?php
public function failed(\Throwable $exception): void
{
// Notify team, update DB, etc.
Log::error("Job failed: ".$exception->getMessage());
}任务链
将任务串联起来,使每个任务仅在前一个任务成功后运行。
<?php
Bus::chain([
new DownloadFile($url),
new ProcessFile($path),
new NotifyUser($user),
])->dispatch();捕获任务链失败
使用 catch() 处理任务链失败,而不停止整个任务链。
<?php
Bus::chain([...])
->catch(fn (\Throwable $e) => Log::error($e))
->dispatch();Bus::batch()
并行分发一批任务,并在全部完成或任一任务失败时运行回调。
<?php
Bus::batch([
new ImportRow($rows[0]),
new ImportRow($rows[1]),
])->then(fn ($b) => Log::info("All done"))
->catch(fn ($b, $e) => Log::error($e))
->dispatch();队列工作进程标志
使用特定的重试和超时设置启动工作进程:php artisan queue:work --tries=3 --timeout=90。任务级设置会覆盖工作进程级设置。
总结
在任务中设置 $tries、$backoff 和 $timeout。对临时失败使用 release(),对永久失败使用 fail()。使用 Bus::chain() 串联顺序执行的任务。
快速检查
哪个方法会在 handle() 内部延迟后将任务重新加入队列?
常见问题解答
「任务重试、延迟与链式执行」课时是免费的吗?
是的 — 「任务重试、延迟与链式执行」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 PHP Academy 课程的其余内容,请升级到 CoddyKit PRO。 PHP Academy 课程共包含 4 节课。
「任务重试、延迟与链式执行」这节课中我会学到什么?
配置尝试次数和延迟,并将相互依赖的任务串联起来。 你通过在浏览器中直接运行的动手代码来练习 PHP Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 PHP Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 PHP Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「任务重试、延迟与链式执行」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 PHP Academy 课中编写并运行代码吗?
能。每节 PHP Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 队列概念与驱动
- 创建和分发任务
- 任务重试、延迟与链式执行
- 使用 Laravel Horizon 监控队列