think-queue tp自带的消息队列类库
简介
其中主要介绍了关于使用think-queue来实现普通队列和延迟队列的相关内容,think-queue是thinkphp官方提供的一个消息队列服务
基本特性:
消息的发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等
队列的多队列, 内存限制 ,启动,停止,守护等
消息队列可降级为同步执行
消息队列实现过程
- 通过生产者推送消息到消息队列服务中
- 消息队列服务将收到的消息存入redis队列中(zset)
- 消费者进行监听队列,当监听到队列有新的消息时,获取队列第一条
- 处理获取下来的消息调用业务类进行处理相关业务
- 业务处理后,需要从队列中删除消息
安装
安装完 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){// ...任务达到最大重试次数后,失败了}}
执行
- think\facade\Queue::push($job任务名(类名) , $data = ‘参数’, $queue = 队列名)
- 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自带的消息队列类库相关推荐
- Microsoft Message Queue(MSMQ:微软消息队列)简介
一.前言 最近在安装公司的一个产品时,接触到了MSMQ,在此对MSMQ做一个简单的介绍,以便各位能对它有一个快速.直观的认识.本文针对于Microsoft Message Queue,以下提到的消息队 ...
- linux c++ queue 多线程,C++多线程,消息队列用法
进程是没有活力的,它只是一个静态的概念.为了让进程完成一些工作,进程必须至少占有一个线程,所以线程是描述进程内的执行,正是线程负责执行包含在进程的地址空间中的代码.实际上,单个进程可以包含几个线程, ...
- tp5 queue.php,tp5(think-queue)消息队列+supervisor进程管理实现队列常驻进程
前言 传统的程序执行流程一般是 即时|同步|串行的,在某些场景下,会存在并发低,吞吐量低,响应时间长等问题.在大型系统中,一般会引入消息队列的组件,将流程中部分任务抽离出来放入消息队列,并由专门的消费 ...
- think queue 消息队列初体验
使用的是tp5 自带的消息队列 thinkphp top里的 消息队列框架 think-queue 这是thinkphp官方团队开发的一个专门支持队列服务的扩展包 消息队列应用场景: 消息队列适用于 ...
- python消息队列模块_day43-python消息队列二-queue模块
Python提供了Queue模块来专门实现消息队列Queue对象 Queue对象实现一个fifo队列(其他的还有lifo.priority队列,这里不再介绍).queue只有maxsize一个构造参数 ...
- redisson究极爽文-手把手带你实现redisson的发布订阅,消息队列,延迟队列(死信队列),(模仿)分布式线程池
参考资料 :分布式中间件实战:java版 (书籍), 多线程视频教程(视频)- 项目启动环境 导入依赖 <parent><groupId>org.springframework ...
- python 消息队列 get是从队首还是队尾取东西_Python -- queue队列模块
import Queue myqueue = Queue.Queue(maxsize = 10) Queue.Queue类即是一个队列的同步实现.队列长度可为无限或者有限.可通过Queue的构造函数的 ...
- Linux进程通信的四种方式——共享内存、信号量、无名管道、消息队列|实验、代码、分析、总结
Linux进程通信的四种方式--共享内存.信号量.无名管道.消息队列|实验.代码.分析.总结 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须 ...
- [阶段4 企业开发进阶] 3. 消息队列--RabbitMQ
文章目录 1 消息队列 1.1 MQ的概念 基本介绍 使用原因 MQ分类 如何选择 1.2 RabbitMQ RabbitMQ核心 工作原理 安装教程 2 Hello World 2.1 依赖 2.2 ...
最新文章
- python 字典
- Swift - 文本输入框(UITextField)的用法
- 元宇宙大比拼:苹果Apple, Facebook,微软,英伟达,iwemeta
- c++ extern “C”
- 更改printk打印级别【转】
- java 去掉 t_java中的“\t”
- VerbalExpressions
- 【多线程系列】之生产者消费者问题
- 北京治堵新方案出台了!
- list转datatable,SqlBulkCopy将DataTable中的数据批量插入数据库
- 16.4 多模态情感识别
- 驱动研究日记-内核同步
- django uWSGI nginx搭建一个web服务器 确定可用
- 欧阳娜娜从阿里跳槽网易:阿里P8堪称教科书级别的面试现场!最后一个问题亮了...
- Hulu推荐 | 《破产姐妹》Max演员新剧《娃娃脸》
- 计算机软件服务费分录,财务软件服务费会计分录是什么?
- DeepFlow: Deep Learning-Based Malware Detection by Mining Android Application
- Parallels Desktop 16 网络初始化失败和不能连接USB设备解决方法
- spark task 任务状态管理
- Cloud Exchange已上线 Collis的公告