没有不值得去解决的问题,也没有不值得去学习的技术!

在 Laravel 6 的模块中使用队列

调用 API ,任务分发至队列后,可以在命令行中看到监听的状态

1、使用以下 Artisan 命令来为指定的模块生成一个新的队列任务。如图1

使用以下 Artisan 命令来为指定的模块生成一个新的队列任务
图1

PS E:\wwwroot\object> php artisan module:make-job ThemeInstallation ThemeStoreDB
Created : E:/wwwroot/object/Modules/ThemeStoreDB/Jobs/ThemeInstallation.php
PS E:\wwwroot\object>


2、任务分发,推送任务到队列


use Modules\ThemeStoreDB\Jobs\ThemeInstallation as ThemeInstallationJob;

// 推送任务到队列
ThemeInstallationJob::dispatch($themeInstallationTask);


3、编辑 /Modules/ThemeStoreDB/Jobs/ThemeInstallation.php 。队列中的处理示例,主要是将表 theme_installation_task 的字段 step 的值修改为 2。

<?php
 
namespace Modules\ThemeStoreDB\Jobs;
 
use Modules\ThemeStoreDB\Entities\ThemeInstallationTask;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
 
class ThemeInstallation implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 
    protected $themeInstallationTask;
 
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(ThemeInstallationTask $themeInstallationTask)
    {
        // 队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID
        $this->themeInstallationTask = $themeInstallationTask;
    }
 
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $this->themeInstallationTask->step = ThemeInstallationTask::STEP_DOWNLOAD_ZIP;
        $this->themeInstallationTask->save();
    }
}
 
 

4、在命令行启动队列系统,队列在启动完成后会进入监听状态:


PS E:\wwwroot\object> php artisan queue:listen


5、调用 API ,任务分发至队列后,可以在命令行中看到监听的状态。如图2

调用 API ,任务分发至队列后,可以在命令行中看到监听的状态
图2

PS E:\wwwroot\object> php artisan queue:listen
[2022-05-18 14:12:39][0brUqtQG1q1J8njW3uyUnrXE16ubcCXs] Processing: Modules\ThemeStoreDB\Jobs\ThemeInstallation
[2022-05-18 14:12:39][0brUqtQG1q1J8njW3uyUnrXE16ubcCXs] Processed:  Modules\ThemeStoreDB\Jobs\ThemeInstallation



6、查看数据表 theme_installation_task 的字段 step 的值已经修改为 2。且 created_at 与 updated_at 分别为:2022-05-18 14:12:37、2022-05-18 14:12:39。修改时间较之创建时间晚了 2 秒钟。符合预期。如图3

查看数据表 theme_installation_task 的字段 step 的值已经修改为 2。且 created_at 与 updated_at 分别为:2022-05-18 14:12:37、2022-05-18 14:12:39。修改时间较之创建时间晚了 2 秒钟。符合预期
图3

7、当 handle 方法抛出异常时,队列任务执行失败,日志信息插入至表 failed_jobs 中。期望将异常的 message 同步插入至表 theme_installation_task 的字段 message 中。如图4

当 handle 方法抛出异常时,队列任务执行失败,日志信息插入至表 failed_jobs 中。期望将异常的 message 同步插入至表 theme_installation_task 的字段 message 中
图4

PS E:\wwwroot\object> php artisan queue:listen
[2022-05-18 15:49:45][XFUmrUWBn2muST8AXmRXzjVLUr72UUde] Processing: Modules\ThemeStoreDB\Jobs\ThemeInstallation
[2022-05-18 15:49:45][XFUmrUWBn2muST8AXmRXzjVLUr72UUde] Failed:     Modules\ThemeStoreDB\Jobs\ThemeInstallation



8、在任务类中定义 failed 方法。导致任务失败的 Exception 将被传递给 failed 方法。

<?php
 
namespace Modules\ThemeStoreDB\Jobs;
 
use Modules\ThemeStoreDB\Entities\ThemeInstallationTask;
use Exception;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
 
class ThemeInstallation implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
 
    /**
     * 任务可以尝试的最大次数。
     *
     * @var int
     */
    public $tries = 1;
 
    /**
     * 任务可以执行的最大秒数 (超时时间)。
     *
     * @var int
     */
    public $timeout = 600;
 
    protected $themeInstallationTask;
 
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(ThemeInstallationTask $themeInstallationTask)
    {
        // 队列任务构造器中接收了 Eloquent 模型,将会只序列化模型的 ID
        $this->themeInstallationTask = $themeInstallationTask;
    }
 
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        checkhere();
        $this->themeInstallationTask->step = ThemeInstallationTask::STEP_DOWNLOAD_ZIP;
        $this->themeInstallationTask->save();
    }
 
    /**
     * 任务失败的处理过程
     *
     * @param  Exception  $exception
     * @return void
     */
    public function failed(Exception $exception)
    {
        $this->themeInstallationTask->message = $exception->getMessage();
        $this->themeInstallationTask->save();
    }
}
 
 

9、异常的 message 同步插入至表 theme_installation_task 的字段 message 中。符合预期。如图5

异常的 message 同步插入至表 theme_installation_task 的字段 message 中。符合预期
图5

PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理