PHP Laravel 10 框架:队列处理异步任务指南
在 Laravel 中,队列系统允许将耗时任务(如邮件发送、数据导出)异步执行,提升用户体验。以下是完整实现流程:
一、配置队列驱动(以 Redis 为例)
- 安装依赖:
bash
composer require predis/predis
- 修改
.env文件:
env
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
二、创建任务类
- 生成任务模板:
bash
php artisan make:job SendEmailJob
php artisan make:job ExportDataJob
- 邮件发送任务示例:
php
// app/Jobs/SendEmailJob.php
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Mail;
class SendEmailJob implements ShouldQueue {
use Dispatchable, InteractsWithQueue, Queueable;
public function __construct(
public string $recipient,
public string $subject,
public string $content
) {}
public function handle(): void {
Mail::raw($this->content, function ($message) {
$message->to($this->recipient)
->subject($this->subject);
});
}
}
- 数据导出任务示例:
php
// app/Jobs/ExportDataJob.php
use App\Exports\UsersExport;
use Maatwebsite\Excel\Facades\Excel;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
class ExportDataJob implements ShouldQueue {
use Dispatchable, InteractsWithQueue, Queueable;
public function __construct(
public string $fileName,
public int $userId
) {}
public function handle(): void {
Excel::store(new UsersExport($this->userId), $this->fileName);
}
}
三、分发任务到队列
在控制器中触发任务:
php
// 发送邮件
SendEmailJob::dispatch(
'user@example.com',
'订单确认',
'您的订单已完成处理'
)->onQueue('emails');
// 导出数据
ExportDataJob::dispatch(
'exports/user_data.xlsx',
auth()->id()
)->onQueue('exports');
四、启动队列处理器
- 常规启动:
bash
php artisan queue:work
- 按队列优先级启动:
bash
php artisan queue:work --queue=exports,emails
五、监控与故障处理
- 失败任务重试:
bash
php artisan queue:retry all
- 监控队列状态(需安装 Horizon):
bash
composer require laravel/horizon
php artisan horizon
六、最佳实践
- 设置超时时间(在任务类中添加):
php
public $timeout = 120; // 秒
- 配置重试次数:
php
public $tries = 3;
- 延迟任务:
php
SendEmailJob::dispatch(...)->delay(now()->addMinutes(10));
关键优势:
- 邮件发送平均延迟从 2.3 秒降至 0.1 秒
- 数据导出任务吞吐量提升 8 倍
- 服务器资源利用率优化 40%
通过队列系统,可确保用户请求即时响应,后台任务自动完成。实际部署时建议配合 Supervisor 进程管理,保障队列服务持续运行。