首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
队列-创建任务
队列-生成任务类
队列-任务类结构
队列-唯一任务
队列-任务中间件
队列-访问限制
队列-防止任务重复
队列-限制异常
队列-任务调度
队列-延迟调度
队列-同步调度
队列-任务 & 数据库事务
队列-任务链
队列-自定义队列 & 连接
队列-指定任务最大尝试次数 / 超时值
队列-错误处理
队列-任务批处理
队列-定义可批处理任务
队列-分派批处理
队列-将任务添加到批处理
队列-校验批处理
队列-取消批处理
队列-批处理失败
队列-批量清理
队列-队列闭包
队列-运行队列处理器
队列-queue:work 命令
队列-队列优先级
队列-队列处理器 & 部署
队列-任务过期 & 超时
队列-Supervisor 配置
队列-处理失败任务
队列-清理失败任务
队列-重试失败任务
队列-忽略缺失的模型
队列-清理失败的任务
队列-在 DynamoDB 中存储失败的任务
队列-禁用失败的任务存储
队列-任务失败事件
队列-清理队列任务
队列-监控你的队列
队列-测试
队列-伪造任务的一个子集
队列-测试任务链
队列-测试任务批处理
队列-任务事件
限流-简介
限流-缓存配置
限流-基础用法
限流-手动增加请求次数
限流-清除请求
当前位置:
首页>>
技术小册>>
Laravel(10.x)从入门到精通(十三)
小册名称:Laravel(10.x)从入门到精通(十三)
### 队列-生成任务类 在Laravel框架中,队列系统是一个强大的工具,用于处理耗时的任务,如发送电子邮件、处理图片上传后的复杂操作等,从而避免这些任务阻塞Web请求的即时响应。Laravel通过其内置的队列系统,允许你将任务推送到后台队列中,然后由队列的工作进程异步执行这些任务。为了有效地使用Laravel队列,首先需要学会如何生成和管理任务类。本章将详细讲解如何在Laravel 10.x中生成任务类,以及任务类的基本结构和用法。 #### 1. 理解队列任务类 在Laravel中,队列任务通常封装在任务类中。这些类继承自`Illuminate\Bus\Queueable`(或类似的接口/特质),允许你定义任务的具体逻辑,并可以通过Laravel的队列系统被调度执行。任务类提供了一种将业务逻辑与队列操作解耦的方式,使得代码更加清晰、易于维护。 #### 2. 生成任务类 Laravel提供了Artisan命令行工具,可以方便地生成任务类。打开你的命令行工具,切换到你的Laravel项目根目录下,然后使用以下命令来生成一个新的任务类: ```bash php artisan make:job ProcessPodcast ``` 这个命令会在`app/Jobs`目录下创建一个名为`ProcessPodcast`的新类(如果`Jobs`目录不存在,Laravel会自动创建它)。生成的类将包含一个`handle`方法,这个方法是你定义任务具体逻辑的地方。 #### 3. 编写任务类 生成的`ProcessPodcast`任务类看起来可能像这样: ```php <?php namespace App\Jobs; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; class ProcessPodcast implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $podcast; /** * 创建一个新的任务实例。 * * @return void */ public function __construct($podcast) { $this->podcast = $podcast; } /** * 执行任务。 * * @return void */ public function handle() { // 处理Podcast的逻辑,例如转换音频格式、更新数据库状态等 // 例如: $this->podcast->update(['status' => 'processed']); } } ``` 在上面的例子中,`ProcessPodcast`类实现了`ShouldQueue`接口,表明这个类是一个应该被推送到队列中的任务。通过`use`语句,该类引入了几个有用的特质,如`Dispatchable`用于分发任务,`InteractsWithQueue`提供了与队列交互的方法,`Queueable`允许你设置队列选项,而`SerializesModels`则自动处理Eloquent模型的序列化,以便在队列任务中安全使用。 在`__construct`方法中,你可以定义任务执行时所需的任何依赖项。在这个例子中,我们传入了一个`$podcast`变量,它可能是一个Eloquent模型实例,表示要处理的播客。 `handle`方法是任务的核心,你应该在这里编写处理任务的逻辑。在这个例子中,你可以想象在这里执行一些耗时的操作,比如将播客的音频文件转换为不同的格式,或者更新数据库中的播客状态等。 #### 4. 分发任务 一旦你定义了任务类,就可以通过Laravel的调度系统或应用代码中的任何位置来分发(即推送)任务到队列了。分发任务通常使用`dispatch`方法,该方法在任务类上通过`use Dispatchable`特质引入。 例如,在某个控制器中分发`ProcessPodcast`任务: ```php use App\Jobs\ProcessPodcast; use App\Models\Podcast; // ... public function storePodcast(Request $request) { $podcast = Podcast::create($request->all()); // 分发任务到队列 ProcessPodcast::dispatch($podcast); return redirect()->route('podcasts.index')->with('success', 'Podcast created and processing started.'); } ``` 在这个例子中,当用户通过表单提交一个新的播客时,我们首先创建`Podcast`模型实例并将其保存到数据库。然后,我们使用`ProcessPodcast::dispatch($podcast)`将`ProcessPodcast`任务分发到队列中,并将新创建的`Podcast`实例作为参数传递给任务。 #### 5. 队列配置与运行 要使队列工作,你需要在`.env`文件中配置你的队列连接(如数据库、Redis等),并在服务器上运行队列监听器。Laravel提供了`php artisan queue:work`命令来启动队列监听器,该命令将持续运行,监听并处理队列中的任务。 ```bash php artisan queue:work ``` 你也可以选择使用`queue:listen`命令,它会在处理完一个任务后继续等待新的任务,而不是在完成后退出。 ```bash php artisan queue:listen ``` 对于生产环境,建议使用`supervisor`、`systemd`或类似的进程管理工具来确保队列监听器持续运行,即使遇到错误或系统重启也能自动恢复。 #### 6. 队列任务监控与调试 Laravel提供了多种工具来帮助你监控和调试队列任务。你可以使用`php artisan queue:failed`命令列出所有失败的任务,`php artisan queue:retry`命令重试失败的任务,或`php artisan queue:forget`命令删除失败的任务。 此外,Laravel的Horizon是一个可选的、漂亮的仪表板,用于监控Laravel队列。它提供了实时统计、任务吞吐量、失败任务管理等功能,非常适合在生产环境中使用。 #### 7. 结论 在Laravel中,队列和任务类是处理后台任务的重要工具。通过合理地使用队列和任务类,你可以显著提升应用的性能和响应速度,同时保持代码的清晰和可维护性。本章介绍了如何在Laravel 10.x中生成任务类、编写任务逻辑、分发任务到队列以及配置和运行队列监听器。通过掌握这些技能,你将能够更有效地利用Laravel的队列系统来优化你的应用。
上一篇:
队列-创建任务
下一篇:
队列-任务类结构
该分类下的相关小册推荐:
PHP合辑1-基础入门
PHP合辑2-高级进阶
Laravel(10.x)从入门到精通(十)
PHP合辑3-数组函数
PHP合辑5-SPL标准库
Laravel(10.x)从入门到精通(十四)
PHP8入门与项目实战(3)
Laravel(10.x)从入门到精通(十八)
全栈工程师修炼指南
Magento零基础到架构师(库存管理)
PHP8入门与项目实战(8)
PHP高性能框架-Swoole