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队列就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

时间: 2024-09-20 10:35:20

PHP实现电商订单自动确认收货redis队列的相关文章

有人做过像淘宝那种实物超时自动确认收货的功能吗?

问题描述 有人做过像淘宝那种实物超时自动确认收货的功能吗? 有人做过像淘宝那种实物超时自动确认收货的功能吗? 解决方案 一般都会在确认收货的时候,保存一个时间,这样写个定时器,时间到了就执行以后操作. 解决方案二: 写一个系统服务自启动类型的,不停轮训服务器获取超时订单进行操作

解决修正Ecshop的recieve.php邮件自动确认收货问题

将之前的ecshop确认收货页面改成如下格式: //确认页面 $act = !empty($_REQUEST['act']) ? rawurldecode(trim($_REQUEST['ver'])) : 'confirm'; // 验证码 if($act == 'confirm') { $msg = $order['order_sn']."确认收货?<button onclick=\"location.href='receive.php?act=receive&id=

SAP PP 为工单确认时自动做收货的设置

SAP PP 为工单确认时自动做收货的设置   TCode: OP67         Micro Message: JINYULIN_SH_

淘点点确认收货在哪 淘点点确认收货的教程

其实这个只要资深点的淘宝玩家就可能不需要查此教程了,淘宝做法都是一样的所以淘点点也很简单,具体如下. 1.在手机中打开淘点点,之后我们找到[我的]打开进入,细节如下 2.之后我们再找到[外卖订单]打开它进入,细节如下 3.然后我们再找到[确认收货]然后打开它进入,细节如下 4.输入支付宝的支付密码,点击[确认] 5.即刻完成确认收货操作,卖家就会收到你的款啦 好了到了这里关于淘点点收货确认也就介绍完了,如果各位朋友不知道现在可以去试一下了.

手机淘宝确认收货功能在哪?手机淘宝确认收货的方法

第一步 不管你是android还是ios机我们都在手机打开手机淘宝点击打开界面中的[我的淘宝]进入 第二步 之后在打开界面中我们点击[全部订单]或者[待收货]如下图所示 第三步 之后我们打开我的订单界面找到要[确认收货]商品点击收货即可. 第四步 在确认收货我们需要输入支付宝的支付密码,点击[确定]就可以了(如果没收到货不要确认,否则可能收不到货哦) 第五步 给出"收货成功"的提示,并可查看订单详情 好了到了这里关于确认收货的功能就介绍完了,如果你对于手机淘宝有其它不懂的可以参考本站其

闲鱼买家不确认收货或卖家不发货怎么办?

闲鱼买家不确认收货怎么办? 这个不用担心和淘宝一样只要买家不申请退款,系统会自动在一个星期后淘宝会把钱打到你的支付宝 当然如果你有空我们可以联系买家,让他确认收货. 闲鱼卖家不发货怎么办? 第一,闲鱼有提醒发货功能了,我们只要在闲鱼商品购买到界面点击提醒发货即可. 第二,申请退款,这时卖家还是可以点发货,他点了发货以后你再申请退款的话就会要求你退回货物了.所以最好在退款前先收集下对方没有发货的证据,交易状态截图.聊天记录截图等(注意聊天记录截图方法,要在记录管理器里,左边看到聊天对方的名字一起截

手机淘宝怎么确认收货?手机淘宝在哪确认收货?

1)我们在手机打开淘宝之后我们点击右上角的[我的淘宝]->[我的淘宝]->[代收货]      2)然后进入之后我们点击[代收货订单]界面里选择你已经收到商品的订单,然后点击订单后面的[确认收货]按钮,输入[支付密码]后就可以确认收货了.   友情提示 在手机淘宝确认收货之后与在电脑中是一样的,不过在手机中找开淘宝如果你使用3g我们会需要很大的流量哦,所以在手机中玩淘宝还是使用wifi来操作吧.

php版微信自动获取收货地址api用法示例_php实例

本文实例讲述了php版微信自动获取收货地址api用法.分享给大家供大家参考,具体如下: 微信公众平台现在是越来越强大了,我们可以通过各种api接口来与平台对接获取对应的数据了,下面来看一个由php实现的微信自动获取收货地址api程序,具体如下. 关于接口的说明我就不介绍了,在官方可以看到下面只看处理程序. public function get_address_api() { $APPID=C('APPID'); $SCRETID=C('SCRETID'); if (!isset($_GET['

没有确认收货20万已被转走

一名"90后",在网上发布大量虚假名牌箱包信息,诱骗买家将大额购包款转入支付平台,再盗取买家用户名密码"确认收货",非法谋取近20万.近日,松江区法院公开开庭审理了这起案件. 法官提醒:随着网络购物的流行和发展壮大,不法分子利用计算机网络技术入侵用户账号窃取密码的手段日益高明,反侦查的意识和能力也超乎想象,广大百姓需要加强防范意识,防止被骗. 没有确认收货20万已被转走 秦女士家住新桥镇明中路,是一名网购忠实客户. 2011年7月15日晚,她在家中登录平时购物的网站