Maison  >  Article  >  développement back-end  >  Explication détaillée de PHP utilisant la file d'attente Redis pour réaliser une confirmation automatique de la réception des commandes de commerce électronique

Explication détaillée de PHP utilisant la file d'attente Redis pour réaliser une confirmation automatique de la réception des commandes de commerce électronique

*文
*文original
2018-01-03 11:54:422149parcourir

Comment PHP réalise-t-il la confirmation automatique de la réception des commandes e-commerce ? Aujourd'hui, l'éditeur vous apportera la connaissance de PHP en utilisant la file d'attente redis pour confirmer automatiquement la réception des commandes e-commerce. L'éditeur le trouve plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence pour tout le monde. Suivons l'éditeur pour y jeter un œil, j'espère que cela sera utile à tout le monde.

1. Scénario

Dans la plateforme de commerce électronique que nous avons construite auparavant, après avoir reçu les marchandises, la plupart des utilisateurs ne cliquent pas activement pour confirmer La réception des marchandises a provoqué diverses plaintes de la part des commerçants lors du paiement des commerçants. Ainsi, en fonction de la demande, une commande a été passée pour confirmer automatiquement la réception x jours après la livraison. La confirmation dite automatique de réception des commandes consiste à exécuter une déclaration de mise à jour à un moment précis pour modifier le statut de la commande.

2. Idées

La méthode la plus lourde consiste à interroger les commandes qualifiées via des tâches planifiées en arrière-plan Linux, puis à les mettre à jour. Idéalement, cette approche fonctionnerait si certaines commandes doivent être mises à jour toutes les minutes. Cependant, la plate-forme est trop petite et la plupart des délais de livraison du vendeur sont intensifs et ne seront pas dispersés toutes les minutes des 24 heures. Ensuite, pour les tâches planifiées, il y a trop de requêtes et ce n'est pas adapté. Ici, vous pouvez d'abord stocker les informations de commande qui confirmeront automatiquement la réception sur d'autres supports, tels que Redis, Memcache, Rabbitmq, puis exécuter le script pour obtenir les informations de commande du support précédent à des fins de jugement. Cela peut réduire considérablement la requête. pression sur la base de données.

Producteur de la file d'attente redis

À cet égard, nous choisissons d'utiliser les tâches planifiées Linux à deux heures du matin tous les jours Les informations de commande pour confirmer la réception sont interrogées puis stockées dans redis. La file d'attente que nous avons sélectionnée sur redis est caractérisée par le premier entré, premier sorti. Lors de l'interrogation de la commande, les données précédentes sont triées par délai de livraison, donc. est la première à être retirée de la file d'attente et doit être la commande la plus proche de l'heure de réception automatique spécifiée. Le code est le suivant

$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(&#39;auto_recevice_order&#39;)){
$txt = &#39;执行时间:&#39;.date(&#39;Y-m-d H:i:s&#39;).&#39;,信息:&#39;.$redis->RPOP(&#39;auto_recevice_order&#39;);
file_put_contents(&#39;./autoToken/fail_log.txt&#39;,$txt."\r\n".PHP_EOL,FILE_APPEND);
$failCount++;
}
//重新填充数据进队列
while ($row = $res->fetch_assoc()) {
 $successCount++;
 $redis->LPUSH(&#39;auto_recevice_order&#39;,json_encode($row1));
}
 $con->close();
 $success=date(&#39;Y-m-d H:i:s&#39;).&#39;:[推送成功]:本次成功推送数据:&#39;.$successCount.&#39;条;记录上次处理失败数据:&#39;.$failCount."条\r\n";
 file_put_contents(&#39;./success_log.txt&#39;,$success."\r\n".PHP_EOL,FILE_APPEND);

Consommateur de file d'attente Redis

Le consommateur de file d'attente n'est pas effectué via des tâches planifiées Linux, mais utilise Linux screen+php Le Le mode cli exécute le script php. Le consommateur n'a qu'à lire en continu les informations de commande dans la file d'attente, puis à déterminer le délai de livraison dans les informations de commande. Si les conditions de réception automatique sont remplies, l'instruction de mise à jour est exécutée. Dans le même temps, si le délai de livraison n'a pas été atteint et que l'écart entre le délai de livraison et le délai de livraison est relativement important, vous pouvez laisser le script php dormir un certain nombre de fois. Ce nombre de temps peut être ajusté. Vous-même. Les commandes obtenues qui ne répondent pas aux exigences de temps doivent être réinitialisées dans la file d'attente Redis, et elles sont également en haut de la file d'attente. Pour que vous puissiez l'obtenir la prochaine fois. Le code est le suivant :

$set_time = 3600*24*10;//设置几天后自动收货
while(true){
if($i%30==0){
usleep(10);//防止while 循环使CPU使用率过高
}
if($redis->LLEN(&#39;auto_recevice_order&#39;)){
$data = json_decode($redis->RPOP(&#39;auto_recevice_order&#39;));
$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`=&#39;1&#39;,`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,&#39;系统自动收货&#39;,&#39;$ip&#39;,&#39;系统&#39;,&#39;服务器&#39;,&#39;收货&#39;,$now_time)";//写入订单日志
 $res2 = $con->query($sql2);//添加日志数据
 }
 }
 if($res1==false){//将没达到条件的数据重新插入队列中
  $redis->RPUSH(&#39;auto_recevice_order&#39;,json_encode(array(&#39;id&#39;=>$id,&#39;deliver_time&#39;=>$deliver_time)));
 }
}
 $i++;
}

Pour exécuter le script php ici, vous devez utiliser l'écran ou le superviseur Linux ou le démon nohup. Vous pouvez vous référer à Baidu pour une utilisation spécifique. Il est préférable d'avoir les enregistrements de journaux nécessaires dans le même script.

3. Réflexion

Avec la croissance de l'activité, plusieurs files d'attente doivent être traitées dans la même seconde. Commandes, et lorsqu'une seule information de commande pertinente peut être retirée de la file d'attente à la fois, le modèle d'un producteur et de plusieurs consommateurs peut être adopté. Dans ce cas, un mécanisme de verrouillage peut être utilisé pour garantir qu'un message ne peut être atteint. un consommateur. Lorsque les données Redis atteignent un certain montant, la fréquence d'exécution du producteur et les conditions correspondantes peuvent être ajustées de manière appropriée.

Recommandations associées :

Explication détaillée de la façon dont php7 implémente la requête floue MongoDB

Explication détaillée de la façon dont PHP implémente une fonction d'invite automatique de champ de recherche simple

Méthodes de configuration $argv et $argc dans les scripts php

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn