Queue消息队列:
Thinkphp官方团队开发的一个专门支持队列服务的扩展包,使用composer管理,使用起来非常方便
优点:
1. Queue内置了 Redis,Database,Topthink ,Sync这四种驱动,本文使用Redis驱动
2. Queue消息队列适用于大并发或者返回结果 时间有点长并需要批量操作的第三方接口,可用于短信发送、邮件发送、APP推送
3. Queue消息消息可进行发布,获取,执行,删除,重发,失败处理,延迟执行,超时控制等操作
缺点:
1. 一旦需处理数据加入到任务内就不能删除
官方文档地址:
https://packagist.org/packages/topthink/think-queue
安装与配置:
1. 是用Composer进行安装,命令:composer require topthink/think-queue
2. 配置文件位于 application/extra/queue.php
3. 本文使用类型是Redis,假如你的当前环境没有Redis,则自行安装
4. 配置文件如下
注意:
4.1 Select是当前Redis库,Redis默认16个数据库
5. 默认配置参数与源代码存放到ThinkPHP vendoer文件夹下
附上代码:
创建任务
//创建任务: 项目命名空间\模块\文件夹\控制器@方法$job = "app\message\job\usermessage@smspush";//$job = 任务名称//$last_info = 插入参数//null 指定任务名称,没有则使用默认\think\Queue::push($job,$last_info, null);
处理任务代码
代码有删减过,只需知道如何使用消息队列即可
public function smspush(Job $job,$msm_info) { //数据格式不符合则删除任务 if(empty($msm_info) || !is_array($msm_info)){ echo "待处理数据格式错误,删除\n"; $job->delete(); } //任务执行超过1次,则删除任务 if ($job->attempts() > 0) { $job->delete(); } //获取用户列表 $user_model = new Userss(); $user_list = $user_model->select(); //没有用户列表,删除任务 if(empty($user_list)){ echo "没有用户列表\n"; $job->delete(); return false; } $user_msm_model = new UserssMsm(); $user_rec_msm_model = new UserRecipiMsm(); //修改msm数据后,发短信并写入数据表记录 if(!empty($res)){ foreach($user_list as $k=>$v){ //发送短信 sends_msgs($v['mobile'],$msm_info['content']); } } //执行完任务后必须删除任务 $job->delete(); }//$job->delete(); 删除任务//$job->attempts(); 查看任务执行次数// 注意:执行完任务后必须删除任务
监听任务并执行
php think queue:listen
php think queue:work --daemon(不加--daemon为执行单个任务)
两种,具体的可选参数可以输入命令加 --help 查看
可配合supervisor使用,保证进程常驻