首页 » PHP教程 » php表格定单技巧_PHP结合redis队列实现电商订单自动确认收货

php表格定单技巧_PHP结合redis队列实现电商订单自动确认收货

duote123 2024-11-22 0

扫一扫用手机浏览

文章目录 [+]

思路

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

php表格定单技巧_PHP结合redis队列实现电商订单自动确认收货

产生行列步队

php表格定单技巧_PHP结合redis队列实现电商订单自动确认收货
(图片来自网络侵删)

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

$successCount=0;​$failCount=0;​$screen_time = 3600249;//设置筛选天数​$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 = 36002410;//设置几天后自动收货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数据达到一定的量之后,也可以适当的调度生产者的实行频率和对应的条件。

本日的文章就到这里啦,关注本头条号,一起学习更多关于python、Java等技能、干货~

标签:

相关文章

Bisc语言,引领未来编程新潮流

随着信息技术的飞速发展,编程语言在各个领域发挥着越来越重要的作用。在这个日新月异的时代,一种名为Bisc的编程语言应运而生,它凭借...

PHP教程 2024-12-26 阅读0 评论0

Android系统语言,融合与创新的力量源泉

随着科技的飞速发展,智能手机已成为我们日常生活中不可或缺的伙伴。而在这其中,Android系统作为全球最受欢迎的移动操作系统,凭借...

PHP教程 2024-12-26 阅读0 评论0

IT挑战系列,探索信息技术领域的无限可能

在21世纪的今天,信息技术(IT)已经成为推动社会发展的核心力量。随着人工智能、大数据、云计算等技术的飞速发展,IT领域正面临着前...

PHP教程 2024-12-26 阅读0 评论0

6502,介绍计算机发展史上的经典处理器

6502处理器作为计算机发展史上的一款经典处理器,自从1975年由西方电子公司(WDC)推出以来,便在个人电脑、游戏机和嵌入式系统...

PHP教程 2024-12-26 阅读0 评论0

IT方法在数字化时代的重要性与实施步骤

随着互联网、大数据、云计算等技术的快速发展,数字化时代已经来临。在这个时代背景下,企业要想在激烈的市场竞争中立于不败之地,就必须充...

PHP教程 2024-12-26 阅读0 评论0