Laravel 13 队列属性与任务控制
摘要
Laravel 13 引入了队列相关的 PHP Attributes,使任务配置更加声明式。本文将深入讲解队列属性的使用,包括:
- 任务重试属性
- 超时与延迟属性
- 唯一性与防重叠属性
- 队列连接属性
- 实战案例与最佳实践
本文适合希望优化队列任务配置的 Laravel 开发者。
1. 重试属性
1.1 Tries 属性
1 2 3 4 5 6 7 8 9 10 11
| use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\Attributes\Tries;
#[Tries(3)] class ProcessPodcast implements ShouldQueue { use Queueable; }
|
1.2 Backoff 属性
1 2 3 4 5 6 7 8
| use Illuminate\Queue\Attributes\Backoff;
#[Tries(3)] #[Backoff([10, 30, 60])] class ProcessPodcast implements ShouldQueue { }
|
1.3 MaxExceptions 属性
1 2 3 4 5 6 7
| use Illuminate\Queue\Attributes\MaxExceptions;
#[MaxExceptions(3)] class ProcessPodcast implements ShouldQueue { }
|
2. 超时属性
2.1 Timeout 属性
1 2 3 4 5 6 7
| use Illuminate\Queue\Attributes\Timeout;
#[Timeout(120)] class ProcessVideo implements ShouldQueue { }
|
2.2 FailOnTimeout 属性
1 2 3 4 5 6 7 8
| use Illuminate\Queue\Attributes\FailOnTimeout;
#[Timeout(120)] #[FailOnTimeout] class ProcessVideo implements ShouldQueue { }
|
3. 唯一性属性
3.1 ShouldBeUnique 属性
1 2 3 4 5 6 7
| use Illuminate\Queue\Attributes\ShouldBeUnique;
#[ShouldBeUnique(3600)] class GenerateReport implements ShouldQueue { }
|
3.2 WithoutOverlapping 属性
1 2 3 4 5 6 7
| use Illuminate\Queue\Attributes\WithoutOverlapping;
#[WithoutOverlapping(300)] class ProcessOrder implements ShouldQueue { }
|
4. 队列连接属性
4.1 OnConnection 属性
1 2 3 4 5 6 7
| use Illuminate\Queue\Attributes\OnConnection;
#[OnConnection('redis')] class ProcessPodcast implements ShouldQueue { }
|
4.2 OnQueue 属性
1 2 3 4 5 6 7
| use Illuminate\Queue\Attributes\OnQueue;
#[OnQueue('podcasts')] class ProcessPodcast implements ShouldQueue { }
|
4.3 组合使用
1 2 3 4 5 6 7 8
| #[OnConnection('redis')] #[OnQueue('podcasts')] #[Tries(3)] #[Timeout(120)] class ProcessPodcast implements ShouldQueue { use Queueable; }
|
5. 完整示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| <?php
namespace App\Jobs;
use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\Attributes\Tries; use Illuminate\Queue\Attributes\Backoff; use Illuminate\Queue\Attributes\Timeout; use Illuminate\Queue\Attributes\FailOnTimeout; use Illuminate\Queue\Attributes\OnConnection; use Illuminate\Queue\Attributes\OnQueue; use Illuminate\Queue\Attributes\ShouldBeUnique;
#[OnConnection('redis')] #[OnQueue('podcasts')] #[Tries(3)] #[Backoff([10, 30, 60])] #[Timeout(300)] #[FailOnTimeout] #[ShouldBeUnique(3600)] class ProcessPodcast implements ShouldQueue { use Queueable; public function __construct( public int $podcastId ) {} public function handle(): void { } public function uniqueId(): string { return (string) $this->podcastId; } }
|
6. 最佳实践
6.1 合理设置重试
1 2 3 4 5 6 7
| #[Tries(2)] #[Backoff([30, 60])]
#[Tries(5)] #[Backoff([5, 10, 30, 60, 120])]
|
6.2 超时设置
1 2 3 4
| #[Timeout(60)] #[Timeout(300)] #[Timeout(1800)]
|
7. 总结
Laravel 13 的队列属性提供了声明式的任务配置:
- 重试控制:Tries、Backoff、MaxExceptions
- 超时控制:Timeout、FailOnTimeout
- 唯一性:ShouldBeUnique、WithoutOverlapping
- 连接配置:OnConnection、OnQueue
通过本指南,您已经掌握了队列属性的核心用法。
参考资料