How does PHP realize automatic confirmation of receipt of e-commerce orders? Today, the editor will bring you the knowledge of PHP using redis queue to automatically confirm the receipt of e-commerce orders. The editor thinks it’s pretty good, so I’ll share it with you now and give it as a reference. Let’s follow the editor to have a look, I hope it will be helpful to everyone.
1. Scenario
#For the e-commerce platform we built before, most users would not take the initiative to click to confirm after receiving the goods. Receiving the goods caused various complaints from the merchants when paying the merchants, so based on demand, an order was made to automatically confirm receipt x days after delivery. The so-called automatic confirmation of receipt of orders means executing an update statement at a specific time to change the status of the order.
2. Ideas
The most cumbersome method is to query qualified orders through Linux background scheduled tasks, and then update. Ideally, this approach would work if there are orders that need to be updated every minute. However, the platform is too small, and most of the seller's delivery time is intensive and will not be scattered every minute of the 24 hours. Then, for scheduled tasks, there are too many queries and it is not suitable. Here, you can first store the order information that will automatically confirm the receipt in other media, such as redis, memcache, rabbitmq, and then execute the script to obtain the order information from the previous media for judgment. This can greatly reduce the query pressure on the database.
Redis Queue Producer
In this regard, we choose to use Linux scheduled tasks at two o'clock in the morning every day to process the upcoming tasks. The order information to confirm the receipt is queried and then stored in redis. The queue we selected on redis is characterized by first-in-first-out. When querying the order, the previous data is sorted by the delivery time, so it is the first to be dequeued. must be the order closest to the specified automatic receipt time. The code is as follows
$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);
Consumer of the redis queue
The consumer of the queue is not done through the Linux scheduled task, but uses the Linux screen+php cli mode When executing the PHP script, the consumer only needs to continuously read the order information from the queue, and then determine the delivery time in the order information. If the requirements for automatic receipt are met, the update statement is executed. At the same time, if the delivery time has not been reached and the gap between the delivery time and the delivery time is relatively large, you can let the php script sleep for a certain number of times. This time number can be adjusted by yourself. The obtained orders that do not meet the time requirements need to be reset. Push it to the redis queue, and it is also the top of the queue. So that you can get it next time. The code is as follows:
$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++; }
To execute the php script here, you need to use the Linux screen or supervisor or nohup daemon. The specific usage can be found on Baidu. It is best to have necessary log records in the same script.
3. Thoughts
# As the business grows, there are multiple queues that need to be processed in the same second. Orders, and when only one relevant order information can be taken out from the queue at a time, a model of one producer and multiple consumers can be adopted. In this case, a lock mechanism can be used to ensure that a message can only reach one consumer. When redis data reaches a certain amount, the producer's execution frequency and corresponding conditions can be appropriately adjusted.
Related recommendations:
Detailed explanation of how to implement MongoDB fuzzy query in php7
Detailed explanation of how PHP implements a simple search box automatic prompt function
$argv and $argc configuration methods in PHP scripts
The above is the detailed content of Detailed explanation of PHP using redis queue to automatically confirm receipt of e-commerce orders. For more information, please follow other related articles on the PHP Chinese website!