Maison  >  Article  >  développement back-end  >  Comment obtenir une réception automatique des marchandises en php

Comment obtenir une réception automatique des marchandises en php

藏色散人
藏色散人original
2021-09-10 10:18:441872parcourir

Comment implémenter la réception automatique des marchandises en PHP : 1. Interrogez les informations de commande sur le point d'être confirmées pour la livraison via des tâches planifiées Linux ; 2. Stockez les informations de commande sur redis ;

Comment obtenir une réception automatique des marchandises en php

L'environnement d'exploitation de cet article : système linux5.9.8, version PHP7.1, ordinateur DELL G3

Comment php réalise-t-il la réception automatique ?

PHP réalise une confirmation automatique de la réception des commandes e-commerce redis file d'attente

1. Scénario

Dans la plateforme de commerce électronique que nous avons construite auparavant, la plupart des utilisateurs ne prendront pas l'initiative après avoir reçu les marchandises. Cliquer pour confirmer la réception a provoqué diverses plaintes de la part du commerçant lors du paiement du commerçant. 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ée

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.

Redis Queue Producer

À cet égard, nous choisissons d'interroger les informations de commande sur le point d'être confirmées pour réception via la tâche planifiée Linux à deux heures du matin chaque jour, puis de les stocker sur redis , redis Dans la file d'attente que nous avons sélectionnée, la caractéristique du traitement de la file d'attente est la suivante : lors de l'interrogation des commandes, les données précédentes sont triées par délai de livraison, donc la première commande sortie de la file d'attente doit être la commande la plus proche de la commande automatique spécifiée. délai de réception. 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);

Consumateur de file d'attente Redis

Le consommateur de la file d'attente ne se fait pas via les tâches planifiées Linux. Utilisez le mode cli screen+php de Linux pour exécuter le script php. lire en continu dans la file d'attente. Lisez les informations de commande, puis déterminez le délai de livraison dans les informations de commande. Si les conditions de réception automatique sont remplies, exécutez l'instruction de mise à jour. Dans le même temps, si le délai de livraison n'est pas 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é par vous-même. .Les commandes obtenues qui ne répondent pas aux exigences de temps doivent être réinitialisées vers 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 Linux ou le superviseur 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

À mesure que l'entreprise se développe, 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 retirée de la file d'attente à la fois. , vous pouvez utiliser un modèle avec un producteur et plusieurs consommateurs. 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.

Apprentissage recommandé : "Tutoriel vidéo 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