0Pricing
PHP Academy · 课时

任务重试、延迟与链式执行

配置尝试次数和延迟,并将相互依赖的任务串联起来。

任务重试、延迟与链式执行 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. 队列概念与驱动
  2. 创建和分发任务
  3. 任务重试、延迟与链式执行
  4. 使用 Laravel Horizon 监控队列
← 返回 PHP Academy