首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
队列-创建任务
队列-生成任务类
队列-任务类结构
队列-唯一任务
队列-任务中间件
队列-访问限制
队列-防止任务重复
队列-限制异常
队列-任务调度
队列-延迟调度
队列-同步调度
队列-任务 & 数据库事务
队列-任务链
队列-自定义队列 & 连接
队列-指定任务最大尝试次数 / 超时值
队列-错误处理
队列-任务批处理
队列-定义可批处理任务
队列-分派批处理
队列-将任务添加到批处理
队列-校验批处理
队列-取消批处理
队列-批处理失败
队列-批量清理
队列-队列闭包
队列-运行队列处理器
队列-queue:work 命令
队列-队列优先级
队列-队列处理器 & 部署
队列-任务过期 & 超时
队列-Supervisor 配置
队列-处理失败任务
队列-清理失败任务
队列-重试失败任务
队列-忽略缺失的模型
队列-清理失败的任务
队列-在 DynamoDB 中存储失败的任务
队列-禁用失败的任务存储
队列-任务失败事件
队列-清理队列任务
队列-监控你的队列
队列-测试
队列-伪造任务的一个子集
队列-测试任务链
队列-测试任务批处理
队列-任务事件
限流-简介
限流-缓存配置
限流-基础用法
限流-手动增加请求次数
限流-清除请求
当前位置:
首页>>
技术小册>>
Laravel(10.x)从入门到精通(十三)
小册名称:Laravel(10.x)从入门到精通(十三)
### 队列-创建任务 在Laravel框架中,队列系统是一个强大的工具,用于异步处理耗时的任务,如发送电子邮件、处理图片上传后的优化、执行复杂的数据分析等。通过将这些任务放入队列中,Laravel能够立即返回响应给用户,而后台工作进程则负责处理队列中的任务,从而显著提高应用的性能和响应速度。本章将深入探讨如何在Laravel 10.x中创建队列任务,包括任务类的定义、任务的分发以及如何将任务推送到队列中。 #### 一、队列基础概念 在深入创建任务之前,先简要回顾一下Laravel队列系统的几个核心概念: - **任务(Job)**:需要异步处理的代码块,通常封装在特定的类中。 - **队列(Queue)**:存储待处理任务的列表。Laravel支持多种队列驱动,如数据库、Redis、Amazon SQS等。 - **工作进程(Worker)**:负责从队列中取出任务并执行它们的进程。 - **失败处理**:当任务执行失败时,Laravel提供了机制来捕获这些失败的任务并进行重试或记录。 #### 二、创建任务类 在Laravel中,每个队列任务都应该是一个实现了`ShouldQueue`接口的类。Laravel提供了`artisan`命令来快速生成这样的类。 ##### 1. 使用Artisan命令生成任务类 打开终端或命令提示符,定位到你的Laravel项目根目录,然后运行以下命令来生成一个新的队列任务类: ```bash php artisan make:job ProcessPodcast ``` 这个命令会在`app/Jobs`目录下创建一个名为`ProcessPodcast.php`的新文件(如果`Jobs`目录不存在,Laravel会自动创建它)。这个类默认实现了`ShouldQueue`接口,并包含了一些基本的方法框架,如`handle`方法,用于定义任务的具体逻辑。 ##### 2. 编写任务逻辑 打开`ProcessPodcast.php`文件,你会看到类似以下的代码结构: ```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; /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { // 任务的逻辑代码 } } ``` 在`handle`方法中,你可以编写任何需要异步处理的代码。例如,假设我们需要处理一个播客文件的上传和转换: ```php public function handle() { // 假设$podcast是通过构造函数注入的播客模型实例 // $this->podcast->processFile(); // 假设这是处理文件的方法 // 示例:简单打印日志表示任务正在执行 \Log::info('Processing podcast...'); // 可以在这里添加复杂的处理逻辑 } ``` #### 三、分发任务 创建并定义了任务类之后,下一步是将任务分发到队列中。这可以通过多种方式完成,但最常见的是使用`dispatch`方法。 ##### 1. 使用`dispatch`方法 你可以直接在控制器、事件监听器或任何其他服务类中分发任务。例如,在控制器中: ```php use App\Jobs\ProcessPodcast; public function storePodcast(Request $request) { // 假设$podcast是处理上传后创建的播客模型实例 $podcast = Podcast::create($request->all()); // 分发任务到队列 ProcessPodcast::dispatch(); return response()->json(['message' => 'Podcast uploaded and processing queued.'], 202); } ``` 注意,上面的例子中`ProcessPodcast::dispatch()`没有传递任何参数给任务。如果你需要在任务中访问某些数据(如播客模型的ID),你应该通过构造函数将这些数据传递给任务: ```php // 修改ProcessPodcast构造函数以接受播客ID public function __construct($podcastId) { $this->podcastId = $podcastId; } // 在分发任务时传递播客ID ProcessPodcast::dispatch($podcast->id); ``` ##### 2. 使用队列辅助函数 Laravel还提供了全局的`dispatch`函数,它允许你在不直接引用任务类的情况下分发任务。这在你只需要快速分发一个任务而不需要显式引用类时非常有用。然而,为了代码的清晰和可维护性,通常建议直接使用任务类的`dispatch`静态方法。 #### 四、配置队列 在分发任务之前,确保你的`.env`文件中配置了正确的队列连接。Laravel支持多种队列驱动,如`database`、`redis`、`sqs`等。例如,如果你使用数据库作为队列驱动,你的`.env`文件应该包含类似以下的配置: ``` QUEUE_CONNECTION=database ``` 然后,运行迁移来创建队列所需的数据库表: ```bash php artisan queue:table php artisan migrate ``` #### 五、运行队列工作进程 最后,为了实际处理队列中的任务,你需要启动一个或多个队列工作进程。这可以通过`artisan`命令完成: ```bash php artisan queue:work ``` 这个命令会启动一个工作进程,它会持续运行并等待队列中的任务。你也可以使用`queue:listen`命令,它与`queue:work`类似,但会在每次任务完成后不会退出,而是继续监听新的任务。 为了在生产环境中更有效地运行队列工作进程,你可能希望使用进程管理器(如Supervisor)来管理这些进程,确保它们即使在崩溃后也能自动重启。 #### 六、总结 在Laravel中创建和分发队列任务是一个相对直接的过程,它允许你以异步方式处理耗时的任务,从而提高应用的性能和响应速度。通过定义任务类、分发任务到队列以及运行队列工作进程,你可以轻松地将复杂的处理逻辑从主请求处理流程中解耦出来,实现更加高效和可扩展的应用架构。 在本书后续章节中,我们将进一步探讨队列的高级特性,如任务重试、失败处理、优先级队列以及与其他Laravel特性的集成,如事件和监听器。这些功能将帮助你更深入地理解和利用Laravel的队列系统,构建出更加健壮和高效的应用。
下一篇:
队列-生成任务类
该分类下的相关小册推荐:
PHP8入门与项目实战(5)
Magento零基础到架构师(系统管理)
HTTP权威指南
Laravel(10.x)从入门到精通(四)
Workerman高性能Web框架-Webman
PHP安全之道
Swoole高性能框架-SwooleWorker
PHP8入门与项目实战(1)
Laravel(10.x)从入门到精通(二)
Magento零基础到架构师(内容设计)
Yii2框架从入门到精通(中)
Yii2框架从入门到精通(上)