PHP实现电商订单自动确认收货redis队列
发布时间 - 2026-01-11 01:08:52 点击率:次一、场景

之前做的电商平台,用户在收到货之后,大部分都不会主动的点击确认收货,导致给商家结款的时候,商家各种投诉,于是就根据需求,要做一个订单在发货之后的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实现延迟队列应用示例
# 收货
# 多个
# 给大家
# 转化为
# 每分钟
# 情况下
# 都有
# 执行时间
# 希望能
# 要做
# 去做
# 如果没有
# 卖家
# 只需要
# 大大的
# 不适合
# 这篇
# 中去
# 比较大
# 过高
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
详解CentOS6.5 安装 MySQL5.1.71的方法
node.js报错:Cannot find module 'ejs'的解决办法
Laravel如何使用Telescope进行调试?(安装和使用教程)
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
Laravel如何实现多对多模型关联?(Eloquent教程)
Laravel如何使用Blade组件和插槽?(Component代码示例)
如何快速生成凡客建站的专业级图册?
QQ浏览器网页版登录入口 个人中心在线进入
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
如何快速搭建虚拟主机网站?新手必看指南
如何在阿里云通过域名搭建网站?
如何确认建站备案号应放置的具体位置?
网站制作大概多少钱一个,做一个平台网站大概多少钱?
家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel如何与Inertia.js和Vue/React构建现代单页应用
网站优化排名时,需要考虑哪些问题呢?
如何正确下载安装西数主机建站助手?
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
Laravel如何使用Sanctum进行API认证?(SPA实战)
长沙企业网站制作哪家好,长沙水业集团官方网站?
googleplay官方入口在哪里_Google Play官方商店快速入口指南
iOS发送验证码倒计时应用
Laravel如何使用Scope本地作用域_Laravel模型常用查询逻辑封装技巧【手册】
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
如何在IIS7上新建站点并设置安全权限?
Laravel如何创建自定义Artisan命令?(代码示例)
Laravel如何创建自定义中间件?(Middleware代码示例)
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
Java垃圾回收器的方法和原理总结
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Android GridView 滑动条设置一直显示状态(推荐)
历史网站制作软件,华为如何找回被删除的网站?
如何在IIS7中新建站点?详细步骤解析
教你用AI将一段旋律扩展成一首完整的曲子
如何在橙子建站中快速调整背景颜色?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
如何快速搭建高效WAP手机网站?
如何在阿里云部署织梦网站?
如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)
Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康
Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?

