Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erläuterung von Beispielen für Eilkauflösungen bei großem Datenverkehr mit PHP

Ausführliche Erläuterung von Beispielen für Eilkauflösungen bei großem Datenverkehr mit PHP

小云云
小云云Original
2017-12-18 10:17:211322Durchsuche

Dieser Artikel stellt hauptsächlich eine kurze Diskussion über den Plan von PHP dar, Eilkäufe bei großem Datenverkehr zu realisieren. Jetzt werde ich ihn mit Ihnen teilen und Ihnen eine Referenz geben. Folgen wir dem Herausgeber und schauen wir uns das an. Ich hoffe, es kann allen helfen.

Es ist erforderlich, einen Echtzeit-Countdown von Stunden, Minuten und Sekunden anzuzeigen. Das Ändern von Datum und Uhrzeit auf der Clientseite hat keinen Einfluss auf die normale Anzeige des Countdowns (d. h. basierend auf der Serverzeit). ).

Tatsächlich ist dies die gleiche Anforderung wie die Zeitbegrenzungsfunktion vieler Prüfungs- und anderer Systeme.

Sie können Ajax nicht verwenden, um die Serverzeit jede Sekunde abzurufen, daher muss der Echtzeit-Countdown mit Javascript implementiert werden. Das ist ganz einfach, es gibt viele Beispiele im Internet.

Das aktuelle Problem besteht darin, die Auswirkungen des benutzerseitig geänderten Datums und der geänderten Uhrzeit auf unsere Anzeige zu beheben.

Die Lösung besteht darin, den Zeitunterschied zwischen der Clientzeit und der Serverzeit zu berechnen, damit das Problem gelöst wird.

Auf diese Weise müssen Sie PHP nur einmal ausführen und die Echtzeit-Countdown-Zeit wird mit der Serverzeit synchronisiert.

Theorie ist Synchronisation, aber beim tatsächlichen Test wird ein Fehler von 1 Sekunde auftreten. (Der spezifische Grund hängt mit der Internetgeschwindigkeit zusammen. Je schneller die Internetgeschwindigkeit, desto kleiner ist der Fehler.) Dies wird jedoch niemals Auswirkungen auf unsere oben genannten Anforderungen haben.

Hinweis: Der Flash-Sale dauert von morgens bis 22 Uhr.

Der Code lautet wie folgt:


<?php
//php的时间是以秒算。js的时间以毫秒算
date_default_timezone_set(&#39;PRC&#39;); 
//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>

Es scheint kein Problem mit dem oben Gesagten zu geben, aber wenn man auf Verkehr stößt, wird es einige Probleme geben Falsche Mengen, wie z. B. die gleichzeitige Protokollierung großer Verkehrsmengen, verursacht durch

Wir wissen, dass die Datenbank SQL einzeln verarbeitet. Gehen Sie davon aus, dass der Prozess des Wareneinkaufs wie folgt abläuft: >

sql1: Produktbestand abfragen


if(库存数量 > 0) 
{ 
//生成订单… 
sql2:库存-1 
}
Wenn keine Parallelität besteht, sieht der obige Prozess so perfekt aus, dass zwei Personen gleichzeitig Bestellungen aufgeben. und es gibt nur 1 Inventar. Der von beiden Personen abgefragte Bestand ist >0, sodass sql2 schließlich ausgeführt wurde und der Bestand schließlich -1 wurde, was darauf hinweist, dass er überverkauft war Benutzerbeschwerden.

Die beliebtesten Ideen zur Lösung dieses Problems:

1. Verwenden Sie einen zusätzlichen Einzelprozess, um eine Warteschlange zu verarbeiten, die Bestellanfragen in die Warteschlange zu stellen und sie einzeln zu verarbeiten, also dort Es wird keine Parallelitätsprobleme geben. Ja, aber die zusätzlichen Hintergrundprozesse und Latenzprobleme werden nicht berücksichtigt.

2. Optimistische Datenbanksperre, was ungefähr bedeutet, dass zuerst der Bestand abgefragt wird, dann sofort 1 zum Bestand hinzugefügt wird und dann, nachdem die Bestellung generiert wurde, der Bestand erneut abgefragt wird, bevor der Bestand aktualisiert wird, um zu sehen, ob der erwartete Bestand vorliegt Wenn die Menge konsistent ist, wird sie zurückgesetzt und der Benutzer wird darauf hingewiesen, dass der Bestand nicht ausreicht.

3. Basierend auf dem Aktualisierungsergebnis können wir eine Aktualisierung der Beurteilungsbedingung hinzufügen...wobei der Bestand>0 in sql2 ist, bedeutet dies, dass der Bestand nicht ausreicht und die Transaktion zurückgesetzt wird .

4. Verwenden Sie bei der Verarbeitung der Bestellanforderung Flock, um eine Datei zu sperren. Wenn die Sperre fehlschlägt, bedeutet dies, dass zu diesem Zeitpunkt andere Bestellungen verarbeitet werden Melden Sie dem Benutzer direkt „Server beschäftigt“

In diesem Artikel geht es um die vierte Lösung. Der ungefähre Code lautet wie folgt:

Blockierungs-(Warte-)Modus


<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX))
{
 //..处理订单
 flock($fp,LOCK_UN);
}
fclose($fp);
?>

Nicht blockierender Modus


<?php
$fp = fopen("lock.txt", "w+");
if(flock($fp,LOCK_EX | LOCK_NB))
{
 //..处理订单
 flock($fp,LOCK_UN);
}
else
{
 echo "系统繁忙,请稍后再试";
}
fclose($fp);
?>
Verwandte Empfehlungen:


Wie löse ich die Website mit PHP? Großer Datenverkehr und hohe Parallelität

PHP-Optimierung für großen Datenverkehr?

PHP-Produkt-Flash-Sale-Timing-Implementierung (Lösung für großen Datenverkehr)

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für Eilkauflösungen bei großem Datenverkehr mit PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn