当前位置: 首页 > news >正文

【Fastadmin/ThinkPHP5】使用Queue队列方法详细步骤

在现代应用开发中,合理利用队列系统能够有效提升系统的性能和响应速度,尤其是在处理耗时较长的任务时,如发送大量邮件、执行定时任务等。下面是如何在ThinkPHP框架中设置和使用队列功能的详细指南:

1.配置队列服务

application/extra/queue.php文件中,我们设置了队列的连接器及其相关配置:

<?php

use think\Env;

return [
    'connector' => Env::get('queue.CONNECTOR', 'redis'),//驱动类型,可选择 sync(默认):同步执行,database:数据库驱动,redis:Redis驱动,topthink:Topthink驱动
    //或其他自定义的完整的类名
    'host' => Env::get('app.REDIS_HOST', '127.0.0.1'),
    'port' => Env::get('app.REDIS_PORT', '6379'),
    'password' => Env::get('app.REDIS_PASSWORD', ''),
    'select' => Env::get('app.REDIS_DB', 1),
];

上述代码中,我们可以通过环境变量灵活地配置了队列连接器,支持同步执行、数据库驱动和Redis驱动等多种方式。

2.创建Job类

我们在application/common/library/job/MessageSendJob.php中创建了一个处理邮件发送任务的Job类:

<?php
namespace app\common\library\job;

use app\common\library\Ems;
use think\queue\Job;

class MessageSendJob
{
    /**
     * 处理邮件发送任务
     *
     * @param Job $job 当前任务对象
     * @param array $data 邮件发送所需数据
     */
    public function handle(Job $job, array $data)
    {
        try {
            // 实现邮件发送逻辑
            Ems::sendNotice($data['email'], $data['title'], $data['content']);
            echo $data['email'] . '邮件发送成功'. PHP_EOL;

            // 成功发送邮件后删除队列任务
            $job->delete();
        } catch (\Exception $e) {
            // 若邮件发送失败,可根据实际需求决定是否重新入队
            if ($job->attempts() < 3) { // 例如最多重试3次
                $job->release(60); // 在60秒后再次尝试执行
            } else {
                $this->failed($job, $data);
            }
        }
    }

    /**
     * 任务执行失败后的回调
     *
     * @param Job $job 当前任务对象
     * @param array $data 邮件发送所需数据
     */
    public function failed(Job $job, array $data)
    {
        // 记录日志或采取其他补救措施
        Log::record('邮件发送任务失败,邮箱:' . $data['email'], 'error');
        // 可考虑在此处通知管理员,或采取其他失败后处理逻辑
    }
}

3.将任务加入队列

// 构建邮件发送任务数据
$queueData = [
    'email' => $email,
    'title' => $title,
    'content' => $content,
];

// 使用MessageSendJob类将任务推送到'message'队列
Queue::push(MessageSendJob::class, $queueData, 'message');

4.启动队列监听

  在命令行环境下,我们可以通过以下命令监听特定队列或全局监听所有队列:

  • 监听特定队列(如'message'):php think queue:listen --queue message
  • 全局监听所有队列:php think queue:listen

通过以上步骤,我们成功地在ThinkPHP框架中实现了队列任务的创建、配置与监听,使得系统在处理耗时任务时更加高效流畅。

相关文章:

  • Leetcode 11. 盛最多水的容器
  • Spring八股 常见面试题
  • IDEA开发环境热部署
  • 用冒泡排序模拟C语言中的内置快排函数qsort!
  • vue项目如何解决金额计算超过15出现精度丢失问题
  • 自然语言处理(NLP)技术
  • 前端按钮动画
  • npm install的-S和-D的区别
  • iOS中卡顿产生的主要原因及优化思路
  • Apache Paimon Append Queue表解析
  • 【语音识别】- 几个主流模型
  • 数据库的介绍、分类、作用和特点
  • 【C++精简版回顾】14.(重载2)流重载
  • 【Python】python离线安装依赖
  • 3D工业相机及品牌集合
  • 蓝月亮,蓝禾,三七互娱,顺丰,康冠科技,金证科技24春招内推
  • git入门
  • PCIE Order Set
  • java spring cloud 企业电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展
  • 大宇、固特、希亦超声波清洗机实测,哪款清洗效果好?一篇掌握
  • 证监会发布上市公司信披豁免规定:明确两类豁免范围、规定三种豁免方式
  • 财政部、证监会:加强对会计师事务所从事证券服务业务的全流程监管
  • 30天内三访中国,宝马董事长:没有一家公司可以在全球价值链外独立运行
  • “养老规划师”实则售卖保险,媒体:多部门须合力整治乱象
  • 冲击一英里4分钟大关,基普耶贡挑战女子中长跑极限
  • 漫游者秦龙,一生为经典画插图