如何在PHP中实现一个订单自动确认收货的复述,队列

  介绍

本篇文章为大家展示了如何在PHP中实现一个订单自动确认收货的复述,队列,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

<强>一、场景

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

<强>二、思路

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

<强>复述队列的生产者

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

$ successCount=0;   美元failCount=0;   时间=screen_time 美元;3600 * 24 * 9;//设置筛选天数   数组$ data =, ();=美元now_time 拖延时间();//查询符合要求的数据   $ sql=皊elect  id, send_time  as  deliver_time 得到“秩序”,where  is_send=1,以及is_del=0,以及is_cancel=0,以及is_token=0,以及send_time> 0,以及send_time  +, {$ screen_time}, & lt; now_time美元   order  by  send_time  asc";   美元$ res =,反对→查询($ sql);//当队列还有数据时将数据记录并清除   而(复述→美元LLEN (& # 39; auto_recevice_order& # 39;)) {=$ txt  & # 39;执行时间:& # 39;.date (& # 39; Y-m-d  H:我:& # 39;)# 39;公司、信息:& # 39;。美元复述→RPOP (& # 39; auto_recevice_order& # 39;);   写入& # 39;。/autoToken fail_log.txt& # 39;, txt美元霸主地位;\ r \ n" .PHP_EOL, FILE_APPEND);   美元failCount + +;   }//重新填充数据进队列   while  (row 美元;=,res→美元fetch_assoc ()), {   美元,successCount + +;   美元,复述,→LPUSH (& # 39; auto_recevice_order& # 39;, json_encode(第一行)美元);   }   ,反对美元→close ();   美元,成功=日期(& # 39;Y-m-d  H:我:& # 39;)# 39;公司:[推送成功):本次成功推送数据:& # 39;。美元successCount强生# 39;条;记录上次处理失败数据:& # 39;。美元failCount !”条\ r \ n";   ,写入(& # 39;。/success_log.txt& # 39;,美元成功的管理者;\ r \ n" .PHP_EOL, FILE_APPEND);

<强>复述队列的消费者

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

set_time 美元;=,3600 * 24 * 10;//设置几天后自动收的货   而(真){   如果我($ % 30==0){   usleep(10);//防止while 循环使CPU使用率过高   }   如果(复述→美元LLEN (& # 39; auto_recevice_order& # 39;)) {   美元$ data =, json_decode(复述→RPOP (& # 39; auto_recevice_order& # 39;));   $ id =, (int)美元数据→id;//将数据转化为整形   $ deliver_time =, (int)美元数据→deliver_time;//将数据转化为整形   $ res1 =, res2 美元;=false;=美元now_time 拖延时间();   如果((deliver_time + set_time美元)& lt; now_time美元){=,美元sql1 “update “秩序”,set “is_token”=& # 39; 1 & # 39;“token_time”,=, now_time 美元;where  id=$ id 以及is_send=1,以及is_del=0,以及is_cancel=0,以及is_token=0,以及send_time  +, {$ set_time}, & lt;, now_time"美元;;   美元,美元res1 =,反对→查询(sql1美元);//更新数据   $ rows =, mysqli_affected_rows (con);   如果美元(行){   美元,美元ip =,这→getIp ();   ,sql2 美元;=,“insert  into ‘order_log’(‘order_id’,‘log_msg’,‘log_ip’,‘log_role’,‘log_user’,‘log_order_state’,‘log_time’),值($ id, & # 39;系统自动收货& # 39;,& # 39;ip # 39;美元,& # 39;系统& # 39;,& # 39;服务器& # 39;,& # 39;收货& # 39;,now_time美元)“;//写入订单日志   美元,美元res2 =,反对→查询(sql2美元);//添加日志数据   ,}   ,}   ,如果(res1美元==false){//将没达到条件的数据重新插入队列中   复述→美元才能RPUSH (& # 39; auto_recevice_order& # 39;, json_encode(数组(& # 39;id # 39;=祝辞;$ id, & # 39; deliver_time& # 39;=祝辞deliver_time美元)));   ,}   }   美元,我+ +;   }

如何在PHP中实现一个订单自动确认收货的复述,队列