全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

PHP实现电商订单自动确认收货redis队列

一、场景

之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的x天自动确认收货。所谓的订单自动确认收货,就是在在特定的时间,执行一条update语句,改变订单的状态。

二、思路

最笨重的做法,通过linux后台定时任务,查询符合条件的订单,然后update。最理想情况下,如果每分钟都有需要update的订单,这种方式也还行。奈何平台太小,以及卖家发货时间大部分也是密集的,不会分散在24小时的每分钟。那么,定时任务的话,查询过多,不适合。这里可以先把将要自动确认收货的订单信息存储到其他介质上,比如redis,memcache,rabbitmq,然后执行的脚本从前面的介质获取到订单信息来判断,这里可以大大的减少数据库的查询压力。

redis队列的生产者

对此,我们选择每天在凌晨两点的时候,通过linux的定时任务把即将要确认收货的订单信息查询出来,然后存储在redis上,redis上我们选择的队列,队列处理的特点就是先进先出,前面的数据在查询订单时,通过发货时间排序,所以最先出队列的肯定是距离规定的自动收货时间最近的订单。代码如下

$successCount=0;
$failCount=0;
$screen_time = 3600*24*9;//设置筛选天数
$data = array();
$now_time = time();
//查询符合要求的数据
$sql="select id,send_time as deliver_time from `order` where is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time>0 and send_time + {$screen_time} < $now_time
order by send_time asc";
$res = $con->query($sql);
//当队列还有数据时将数据记录并清除
while($redis->LLEN('auto_recevice_order')){
$txt = '执行时间:'.date('Y-m-d H:i:s').',信息:'.$redis->RPOP('auto_recevice_order');
file_put_contents('./autoToken/fail_log.txt',$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
}
//重新填充数据进队列
while ($row = $res->fetch_assoc()) {
 $successCount++;
 $redis->LPUSH('auto_recevice_order',json_encode($row1));
}
 $con->close();
 $success=date('Y-m-d H:i:s').':[推送成功]:本次成功推送数据:'.$successCount.'条;记录上次处理失败数据:'.$failCount."条\r\n";
 file_put_contents('./success_log.txt',$success."\r\n".PHP_EOL,FILE_APPEND);

redis队列的消费者

队列的消费者没有通过linux的定时任务去做,用linux的screen+php cli模式执行php脚本,消费者只需要不断的从队列中读取订单信息,然后判断订单信息中的发货时间,如果达到自动收货的要求,就执行update语句。同时如果没有达到收货的时间,而且与收货时间间距比较大的时候,可以让php脚本休眠sleep一定的时间数,这个时间数自己调节设计,获取出来的未达到时间要求的订单,需要重新推送到redis队列中去,而且还是队列的顶端。以便下次获取。代码如下:

$set_time = 3600*24*10;//设置几天后自动收货
while(true){
if($i%30==0){
usleep(10);//防止while 循环使CPU使用率过高
}
if($redis->LLEN('auto_recevice_order')){
$data = json_decode($redis->RPOP('auto_recevice_order'));
$id = (int)$data->id;//将数据转化为整形
$deliver_time = (int)$data->deliver_time;//将数据转化为整形
$res1 = $res2 =false;
$now_time = time();
if(($deliver_time+$set_time)<$now_time){
 $sql1 = "update `order` set `is_token`='1',`token_time` = $now_time where id=$id and is_send=1 and is_del=0 and is_cancel=0 and is_token=0 and send_time + {$set_time} < $now_time";
 $res1 = $con->query($sql1);//更新数据
$rows = mysqli_affected_rows($con);
if($rows){
 $ip = $this->getIp();
 $sql2 = "insert into `order_log`(`order_id`,`log_msg`,`log_ip`,`log_role`,`log_user`,`log_order_state`,`log_time`) VALUES($id,'系统自动收货','$ip','系统','服务器','收货',$now_time)";//写入订单日志
 $res2 = $con->query($sql2);//添加日志数据
 }
 }
 if($res1==false){//将没达到条件的数据重新插入队列中
  $redis->RPUSH('auto_recevice_order',json_encode(array('id'=>$id,'deliver_time'=>$deliver_time)));
 }
}
 $i++;
}

这里执行php脚本,需要用到linux的screen或者supervisor、nohup守护进程。具体用法可自行百度.同样脚本里面最好有必须的日志记录。

三、思考

随着业务的增长,在队列中同一秒内,存在的多个需要处理的订单,而一次只能从队列中取出一个相关订单信息的时候,可以采用一个生产者多个消费者的模式,这种情况下,可以用到锁机制,保证一条消息只能到达一个消费者。当redis数据达到一定的量之后,也可以适当的调整生产者的执行频率和对应的条件。

以上这篇PHP实现电商订单自动确认收货redis队列就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。


# php  # redis  # 队列  # 详解PHP多个进程配合redis的有序集合实现大文件去重  # redis 队列操作的例子(php)  # php中使用redis队列操作实例代码  # PHP使用php-resque库配合Redis实现MQ消息队列的教程  # php+redis消息队列实现抢购功能  # phpredis提高消息队列的实时性方法(推荐)  # php基于Redis消息队列实现的消息推送的方法  # PHP基于Redis消息队列实现发布微博的方法  # PHP+Redis 消息队列 实现高并发下注册人数统计的实例  # PHP使用redis消息队列发布微博的方法示例  # PHP实现基于Redis的MessageQueue队列封装操作示例  # php使用redis的有序集合zset实现延迟队列应用示例  # 收货  # 多个  # 给大家  # 转化为  # 每分钟  # 情况下  # 都有  # 执行时间  # 希望能  # 要做  # 去做  # 如果没有  # 卖家  # 只需要  # 大大的  # 不适合  # 这篇  # 中去  # 比较大  # 过高 


相关文章: 青浦网站制作公司有哪些,苹果官网发货地是哪里?  网站图片在线制作软件,怎么在图片上做链接?  如何在云虚拟主机上快速搭建个人网站?  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  广州美橙建站如何快速搭建多端合一网站?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  浅析上传头像示例及其注意事项  如何在阿里云高效完成企业建站全流程?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  jQuery 常见小例汇总  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何选择可靠的免备案建站服务器?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  如何选择香港主机高效搭建外贸独立站?  如何快速辨别茅台真假?关键步骤解析  无锡营销型网站制作公司,无锡网选车牌流程?  ,sp开头的版面叫什么?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何在云服务器上快速搭建个人网站?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  如何快速配置高效服务器建站软件?  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?  广州建站公司哪家好?十大优质服务商推荐  威客平台建站流程解析:高效搭建教程与设计优化方案  专业公司网站制作公司,用什么语言做企业网站比较好?  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  网站制作的步骤包括,正确网址格式怎么写?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  网页设计与网站制作内容,怎样注册网站?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  网站按钮制作软件,如何实现网页中按钮的自动点击?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站之星安装需要哪些步骤及注意事项?  ,柠檬视频怎样兑换vip?  高防服务器如何保障网站安全无虞?  如何用搬瓦工VPS快速搭建个人网站?  如何通过WDCP绑定主域名及创建子域名站点?  制作门户网站的参考文献在哪,小说网站怎么建立?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  如何通过智能用户系统一键生成高效建站方案?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  微信小程序 input输入框控件详解及实例(多种示例)  网站设计制作企业有哪些,抖音官网主页怎么设置?  广州网站制作的公司,现在专门做网站的公司有没有哪几家是比较好的,性价比高,模板也多的? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。