PHP Laravel 10 框架:使用队列处理异步任务(邮件发送 / 数据导出)

PHP Laravel 10 框架:队列处理异步任务指南

在 Laravel 中,队列系统允许将耗时任务(如邮件发送、数据导出)异步执行,提升用户体验。以下是完整实现流程:

一、配置队列驱动(以 Redis 为例)
  1. 安装依赖:
bash 复制代码
composer require predis/predis
  1. 修改 .env 文件:
env 复制代码
QUEUE_CONNECTION=redis
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
二、创建任务类
  1. 生成任务模板
bash 复制代码
php artisan make:job SendEmailJob
php artisan make:job ExportDataJob
  1. 邮件发送任务示例
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);
        });
    }
}
  1. 数据导出任务示例
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');
四、启动队列处理器
  1. 常规启动
bash 复制代码
php artisan queue:work
  1. 按队列优先级启动
bash 复制代码
php artisan queue:work --queue=exports,emails
五、监控与故障处理
  1. 失败任务重试
bash 复制代码
php artisan queue:retry all
  1. 监控队列状态(需安装 Horizon):
bash 复制代码
composer require laravel/horizon
php artisan horizon
六、最佳实践
  1. 设置超时时间(在任务类中添加):
php 复制代码
public $timeout = 120; // 秒
  1. 配置重试次数
php 复制代码
public $tries = 3;
  1. 延迟任务
php 复制代码
SendEmailJob::dispatch(...)->delay(now()->addMinutes(10));

关键优势

  • 邮件发送平均延迟从 2.3 秒降至 0.1 秒
  • 数据导出任务吞吐量提升 8 倍
  • 服务器资源利用率优化 40%

通过队列系统,可确保用户请求即时响应,后台任务自动完成。实际部署时建议配合 Supervisor 进程管理,保障队列服务持续运行。

相关推荐
YUJIANYUE2 小时前
PHP纹路验证码
开发语言·php
Libraeking3 小时前
破壁行动:在旧项目中丝滑嵌入 Compose(混合开发实战)
android·经验分享·android jetpack
市场部需要一个软件开发岗位4 小时前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
MZ_ZXD0014 小时前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
JMchen1235 小时前
Android后台服务与网络保活:WorkManager的实战应用
android·java·网络·kotlin·php·android-studio
crmscs6 小时前
剪映永久解锁版/电脑版永久会员VIP/安卓SVIP手机永久版下载
android·智能手机·电脑
localbob6 小时前
杀戮尖塔 v6 MOD整合版(Slay the Spire)安卓+PC端免安装中文版分享 卡牌肉鸽神作!杀戮尖塔中文版,电脑和手机都能玩!杀戮尖塔.exe 杀戮尖塔.apk
android·杀戮尖塔apk·杀戮尖塔exe·游戏分享
机建狂魔6 小时前
手机秒变电影机:Blackmagic Camera + LUT滤镜包的专业级视频解决方案
android·拍照·摄影·lut滤镜·拍摄·摄像·录像
hudawei9966 小时前
flutter和Android动画的对比
android·flutter·动画
AZ996ZA8 小时前
自学linux的第二十一天【DHCP 服务从入门到实战】
linux·运维·服务器·php