简介

其中主要介绍了关于使用think-queue来实现普通队列和延迟队列的相关内容,think-queue是thinkphp官方提供的一个消息队列服务

基本特性:

消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等
队列的多队列, 内存限制 ,启动,停止,守护等
消息队列可降级为同步执行

消息队列实现过程

  1. 通过生产者推送消息到消息队列服务中
  2. 消息队列服务将收到的消息存入redis队列中(zset)
  3. 消费者进行监听队列,当监听到队列有新的消息时,获取队列第一条
  4. 处理获取下来的消息调用业务类进行处理相关业务
  5. 业务处理后,需要从队列中删除消息

安装

安装完 think-queue 后会在 config 目录中生成 queue.php,这个文件是队列的配置文件。

composer require topthink/think-queue

配置

配置文件位于 config/queue.php

  return ['connector'  => 'Redis',       // Redis 驱动'expire'     => 60,        // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null 'default'    => 'default',      // 默认的队列名称'host'       => '127.0.0.1',  // redis 主机ip'port'       => 6379,        // redis 端口'password'   => '',      // redis 密码'select'     => 0,     // 使用哪一个 db,默认为 db0'timeout'    => 0,      // redis连接的超时时间'persistent' => false,     // 是否是长连接//    'connector' => 'Database',   // 数据库驱动//    'expire'    => 60,           // 任务的过期时间,默认为60秒; 若要禁用,则设置为 null//    'default'   => 'default',    // 默认的队列名称//    'table'     => 'jobs',       // 存储消息的表名,不带前缀//    'dsn'       => [],//    'connector'   => 'Topthink',  // ThinkPHP内部的队列通知服务平台 ,本文不作介绍//    'token'       => '', //    'project_id'  => '',//    'protocol'    => 'https',//    'host'        => 'qns.topthink.com',//    'port'        => 443,//    'api_version' => 1,//    'max_retries' => 3,//    'default'     => 'default',//    'connector'   => 'Sync',       // Sync 驱动,该驱动的实际作用是取消消息队列,还原为同步执行];

如果使用数据库的话

CREATE TABLE `prefix_jobs` (`id` int(11) NOT NULL AUTO_INCREMENT,`queue` varchar(255) NOT NULL,`payload` longtext NOT NULL,`attempts` tinyint(3) unsigned NOT NULL,`reserved` tinyint(3) unsigned NOT NULL,`reserved_at` int(10) unsigned DEFAULT NULL,`available_at` int(10) unsigned NOT NULL,`created_at` int(10) unsigned NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

创建任务类

namespace app\job;use think\queue\Job;class Job1{public function fire(Job $job, $data){//....这里执行具体的任务 if ($job->attempts() > 3) {//通过这个方法可以检查这个任务已经重试了几次了}//如果任务执行成功后 记得删除任务,不然这个任务会重复执行,直到达到最大重试次数后失败后,执行failed方法$job->delete();// 也可以重新发布这个任务$job->release($delay); //$delay为延迟时间}public function failed($data){// ...任务达到最大重试次数后,失败了}}

执行

  1. think\facade\Queue::push($job任务名(类名) , $data = ‘参数’, $queue = 队列名)
  2. think\facade\Queue::later($delay延时时间, $job任务名(类名@+方法名), $data = ‘参数’, $queue = 队列名)
use think\facade\Queue;
// 普通队列生成调用方式
Queue::push($job, $data, $queueName);
// 例:
Queue::push(Test::class, $data, $queueName);
// 延时队列生成调用方式
Queue::later($delay, $job, $data, $queueName);
// 例如使用延时队列 10 秒后执行:
Queue::later(10 , Test::class, $data, $queueName);

前者是立即执行,后者是在$delay秒后执行

监听任务并执行

queue:work 默认只执行一次队列请求,当请求执行完成后就终止;这里可以看出,要是延迟队列,就不能使用该命令喽
queue:work --daemon 同listen 一样,只要运行着,就能一直接受请求,不一样的地方是在这个运行模式下,当新的请求到来的时候,**不重新加载整个框架 **, 而是直接 fire 动作。所以若是更改的代码,需要停止,然后重新启动。(该命令是在laravel4.2以后才加入的)

&> php think queue:work

queue:listen 监听队列请求,只要运行着,就能一直接受请求,除非手动终止

&> php think queue:listen

think-queue tp自带的消息队列类库相关推荐

  1. Microsoft Message Queue(MSMQ:微软消息队列)简介

    一.前言 最近在安装公司的一个产品时,接触到了MSMQ,在此对MSMQ做一个简单的介绍,以便各位能对它有一个快速.直观的认识.本文针对于Microsoft Message Queue,以下提到的消息队 ...

  2. linux c++ queue 多线程,C++多线程,消息队列用法

    进程是没有活力的,它只是一个静态的概念.为了让进程完成一些工作,进程必须至少占有一个线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码.实际上,单个进程可以包含几个线程, ...

  3. tp5 queue.php,tp5(think-queue)消息队列+supervisor进程管理实现队列常驻进程

    前言 传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题.在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费 ...

  4. think queue 消息队列初体验

    使用的是tp5  自带的消息队列 thinkphp top里的 消息队列框架 think-queue 这是thinkphp官方团队开发的一个专门支持队列服务的扩展包 消息队列应用场景: 消息队列适用于 ...

  5. python消息队列模块_day43-python消息队列二-queue模块

    Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...

  6. redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池

    参考资料 :分布式中间件实战:java版 (书籍), 多线程视频教程(视频)- 项目启动环境 导入依赖 <parent><groupId>org.springframework ...

  7. python 消息队列 get是从队首还是队尾取东西_Python -- queue队列模块

    import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的 ...

  8. Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结

    Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...

  9. [阶段4 企业开发进阶] 3. 消息队列--RabbitMQ

    文章目录 1 消息队列 1.1 MQ的概念 基本介绍 使用原因 MQ分类 如何选择 1.2 RabbitMQ RabbitMQ核心 工作原理 安装教程 2 Hello World 2.1 依赖 2.2 ...

最新文章

  1. python 字典
  2. Swift - 文本输入框(UITextField)的用法
  3. 元宇宙大比拼:苹果Apple, Facebook,微软,英伟达,iwemeta
  4. c++ extern “C”
  5. 更改printk打印级别【转】
  6. java 去掉 t_java中的“\t”
  7. VerbalExpressions
  8. 【多线程系列】之生产者消费者问题
  9. 北京治堵新方案出台了!
  10. list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库
  11. 16.4 多模态情感识别
  12. 驱动研究日记-内核同步
  13. django uWSGI nginx搭建一个web服务器 确定可用
  14. 欧阳娜娜从阿里跳槽网易:阿里P8堪称教科书级别的面试现场!最后一个问题亮了...
  15. Hulu推荐 | 《破产姐妹》Max演员新剧《娃娃脸》
  16. 计算机软件服务费分录,财务软件服务费会计分录是什么?
  17. DeepFlow: Deep Learning-Based Malware Detection by Mining Android Application
  18. Parallels Desktop 16 网络初始化失败和不能连接USB设备解决方法
  19. spark task 任务状态管理
  20. Cloud Exchange已上线 Collis的公告

热门文章

  1. udp和tcp的应用
  2. c# mysql 连接串_C#数据库连接字符串
  3. 裸睡的猪之爬虫小王子
  4. 【Word宏】根据除法的横式写竖式
  5. 日志系统的介绍和使用
  6. 一篇文章说清楚如何提升大数据质量-InfoQ
  7. PHP 7 vs HHVM性能对比 – 运维生存时间
  8. 全球手机安全软件横评报告:腾讯手机管家排第一,你用的哪款?
  9. 分享一个nmon脚本
  10. 最全的SQL注入总结