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使用,保证进程常驻