Maison  >  Article  >  développement back-end  >  Méthode PHP pour implémenter la confirmation automatique de la file d'attente Redis de livraison pour les commandes de commerce électronique

Méthode PHP pour implémenter la confirmation automatique de la file d'attente Redis de livraison pour les commandes de commerce électronique

墨辰丷
墨辰丷original
2018-05-22 15:03:041525parcourir

Cet article présente principalement la méthode de confirmation automatique de la file d'attente redis des commandes de commerce électronique en PHP. Les amis intéressés peuvent s'y référer. J'espère qu'il 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 les utilisateurs ne cliqueront pas activement pour confirmer la réception des marchandises, ce qui entraînera diverses plaintes de la part des commerçants lors du règlement du paiement. Par conséquent, en fonction de la demande, une commande sera 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 à 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

Consommateur de file d'attente Au lieu d'utiliser des tâches planifiées Linux, utilisez le mode Linux screen+php cli pour exécuter des scripts PHP. Les consommateurs n'ont besoin que de lire en continu les informations de commande dans la file d'attente, puis de déterminer le délai de livraison dans les informations de commande s'il atteint la réception automatique. requis, exécutez l’instruction update. 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. L'utilisation spécifique peut être trouvée sur Baidu. 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 commandes doivent être traitées dans la file d'attente à la même seconde, et Lorsqu'une seule information de commande pertinente peut être extraite 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 atteindre qu'un seul 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.

L'article ci-dessus sur PHP pour réaliser une confirmation automatique de livraison des commandes de commerce électronique à l'aide de la file d'attente redis est tout le contenu partagé par l'éditeur. J'espère qu'il pourra vous donner une référence, et j'espère aussi que tout le monde le fera. prend en charge Script Accueil.

Recommandations associées :

Comment un site Web de commerce électronique confirme-t-il automatiquement la réception

Méthode PHP pour obtenir des nombres aléatoires à 6 chiffres qui n'existent pas dans redis

implémentations PHP redis file d'attente des messages Comment publier sur Weibo

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