Maison >développement back-end >tutoriel php >Explication détaillée d'exemples de solutions d'achat urgent sous trafic important utilisant PHP
Cet article présente principalement une brève discussion sur le plan de PHP pour réaliser des achats précipités sous un trafic important. L'éditeur pense que c'est plutôt bien. Maintenant, je vais le partager avec vous et vous donner une référence. Suivons l'éditeur pour y jeter un œil, j'espère que cela pourra aider tout le monde.
Il est obligatoire d'afficher un compte à rebours en temps réel des heures, minutes et secondes. La modification de la date et de l'heure côté client n'affectera pas l'affichage normal du compte à rebours (c'est-à-dire basé sur l'heure du serveur). ).
En fait, il s'agit de la même exigence que la fonction de limitation de temps de nombreux systèmes d'examen et autres.
Vous ne pouvez pas utiliser ajax pour obtenir l'heure du serveur toutes les secondes, le compte à rebours en temps réel doit donc être implémenté avec javascript. C'est très simple, il existe de nombreux exemples sur Internet.
Le problème actuel est de résoudre l'impact de la date et de l'heure modifiées côté utilisateur sur notre affichage.
La solution est de calculer le décalage horaire entre l'heure du client et l'heure du serveur, afin que le problème soit résolu.
De cette façon, vous n'avez besoin d'exécuter php qu'une seule fois, et le compte à rebours en temps réel sera synchronisé avec l'heure du serveur.
La théorie est la synchronisation, mais il y aura une erreur de 1 seconde lors des tests réels. (La raison spécifique est liée à la vitesse d'Internet. Plus la vitesse d'Internet est rapide, plus l'erreur est faible.) Mais cela n'affectera jamais nos exigences ci-dessus.
Remarque : l'heure de la vente flash est du matin à 22h.
Le code est le suivant :
<?php //php的时间是以秒算。js的时间以毫秒算 date_default_timezone_set('PRC'); //date_default_timezone_set("Asia/Hong_Kong");//地区 //配置每天的活动时间段 $starttimestr = "08:00:00"; $endtimestr = "22:00:00"; $starttime = strtotime($starttimestr); $endtime = strtotime($endtimestr); $nowtime = time(); if ($nowtime<$starttime){ die("活动还没开始,活动时间是:{$starttimestr}至{$endtimestr}"); } $lefttime = $endtime-$nowtime; //实际剩下的时间(秒) ?> <script language="JavaScript"> </script> <h4><strong id="RemainH">XX</strong>:<strong id="RemainM">XX</strong>:<strong id="RemainS">XX</strong></h4>
Il ne semble y avoir aucun problème avec ce qui précède, mais en cas de trafic, il y aura des problèmes avec la mauvaise quantité, comme un stockage simultané à trafic important. Le problème de l'inventaire négatif causé par
Nous savons que la base de données traite SQL un par un. Supposons que le processus d'achat de marchandises soit comme ceci :
sql1 : interroger l'inventaire des produits
if(库存数量 > 0) { //生成订单… sql2:库存-1 }
Quand il n'y a pas de concurrence, le processus ci-dessus semble si parfait Supposons que deux personnes passent des commandes en même temps, et là. n'est qu'un inventaire. Au stade sql1, l'inventaire interrogé par les deux personnes est >0, donc sql2 a finalement été exécuté et l'inventaire est finalement devenu -1, indiquant qu'il était survendu ou qu'il attend les plaintes des utilisateurs. .
Les idées les plus populaires pour résoudre ce problème :
1. Utilisez un processus unique supplémentaire pour traiter une file d'attente, placez les demandes de commande dans la file d'attente et traitez-les une par une, donc là il n'y aura pas de problèmes de concurrence Oui, mais les processus d'arrière-plan supplémentaires et les problèmes de latence ne seront pas pris en compte.
2. Verrouillage optimiste de la base de données, ce qui signifie en gros interroger d'abord l'inventaire, puis ajouter immédiatement 1 à l'inventaire, puis une fois la commande générée, interroger à nouveau l'inventaire avant de mettre à jour l'inventaire pour voir si l'inventaire attendu la quantité est maintenue. Si elle est cohérente, si elle est incohérente, elle sera annulée et l'utilisateur sera informé que l'inventaire est insuffisant.
3. En jugeant sur la base du résultat de la mise à jour, nous pouvons ajouter une mise à jour de la condition de jugement... où inventaire>0 dans sql2 Si false est renvoyé, cela signifie que l'inventaire est insuffisant et la transaction est annulée. .
4. À l'aide du verrouillage exclusif de fichier, lors du traitement de la demande de commande, utilisez flock pour verrouiller un fichier. Si le verrouillage échoue, cela signifie que d'autres commandes sont en cours de traitement. demander directement à l'utilisateur "serveur occupé"
Cet article va parler de la quatrième solution. Le code approximatif est le suivant :
Mode de blocage (en attente)<.>
<?php $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_EX)) { //..处理订单 flock($fp,LOCK_UN); } fclose($fp); ?>
Mode non bloquant
<?php $fp = fopen("lock.txt", "w+"); if(flock($fp,LOCK_EX | LOCK_NB)) { //..处理订单 flock($fp,LOCK_UN); } else { echo "系统繁忙,请稍后再试"; } fclose($fp); ?>Recommandations associées :
Comment résoudre le site Web avec PHP Trafic important et concurrence élevée
Optimisation du trafic PHP important ?
Mise en place du timing de vente flash de produits PHP (solution au trafic important)
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!