Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert die gleichzeitige Snap-Up-Funktion durch Sperren

PHP implementiert die gleichzeitige Snap-Up-Funktion durch Sperren

*文
*文Original
2017-12-29 18:09:042350Durchsuche

Dieser Artikel basiert auf der PHP-Sprache und verwendet Sperren, um die Eilkauffunktion unter gleichzeitigen Umständen zu implementieren. Der Eilkauf ist während eines bestimmten Zeitraums geöffnet und erlaubt keine Vervielfältigung offener Codes. Dieser Artikel ist sehr ausführlich. Bitte lesen Sie ihn bei Bedarf nach. Ich hoffe, es hilft allen.

Anforderungen: Code-Grabbing-Funktion

Anforderungen:

1. Code-Grabbing ist nur während eines bestimmten Zeitraums möglich;
2. Die in jedem Zeitraum veröffentlichten Codes sind begrenzt;


3 Jeder Code darf nicht wiederholt werden


Realisierung:


1. Ohne Berücksichtigung der Parallelität implementiert:

Der obige Code erfüllt standardmäßig die aktuelle Öffnungszeit und der Code wird nicht wiederholt
<p style="margin-top: 5px; margin-bottom: 5px;">function get_code($len){<br/>$CHAR_ARR = array(&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&#39;9&#39;,&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,&#39;I&#39;,&#39;J&#39;,&#39;K&#39;,&#39;L&#39;,&#39;M&#39;,&#39;N&#39;,&#39;O&#39;,&#39;P&#39;,&#39;Q&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;,&#39;W&#39;,&#39;S&#39;,&#39;R&#39;,&#39;T&#39;);<br/>$CHAR_ARR_LEN = count($CHAR_ARR) - 1;<br/>$code = &#39;&#39;;<br/>while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }<br/>return $code;<br/>}<br/>$pdo = new PDO(&#39;mysql:host=localhost;dbname=ci_test&#39;,&#39;root&#39;,&#39;root&#39;);<br/>//查询当前时间已发放验证码数量<br/>$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");<br/>$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);<br/>$code_num = $code_num_arr[&#39;sum&#39;];<br/>if($code_num < 1){<br>   sleep(2); //暂停2秒<br/>$code = get_code(6);<br/>var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES (&#39;$code&#39;,".time().")") );<br/>}<br/></p>

Ohne Berücksichtigung der Parallelität Prozess:


1) Wählen Sie die Anzahl der von der aktuellen Datenbank ausgegebenen Verifizierungscodes aus und fragen Sie sie ab


2) Wenn noch Plätze vorhanden sind, generieren Sie den Verifizierungscode und fügen Sie ihn ein die Datenbank und geben Sie den Bestätigungscode an den Client zurück; in gleichzeitigen Situationen:


Schauen Sie sich dann die Ergebnisse an, die der obige Code im Fall der Parallelität erzielt:


Um die Parallelität zu testen, können Sie den Apache-Benchmark verwenden test. Apache Benchmark ist das Leistungsbewertungstool von HTTP SERVER unter APACHE. Geben Sie über cmd das bin-Verzeichnis von apche ein und rufen Sie es über den Befehl ab auf, z

Auf diese Weise erhalten 100 Benutzer und Kollegen 1 Kontingent. Wenn zu diesem Zeitpunkt jeder Benutzer feststellt, dass noch ein Kontingent vorhanden ist, wird der Bestätigungscode generiert, in die Datenbank eingefügt und der Bestätigungscode eingegeben wird zurückgegeben; dies führt dazu, dass zu viele Bestätigungscodes gesendet werden. Tatsächlich verfügt die Datenbank nach der Ausführung dieses Befehls über 13 weitere Datensätze statt einem.


Wie kann man das verhindern?


Sie können den Prozess von der Beurteilung bis zur Einfügung sperren, indem Sie eine exklusive Sperre hinzufügen, um sicherzustellen, dass in diesem Beurteilungsprozess immer nur ein Prozess ausgeführt wird. Die Implementierung ist wie folgt:

Sperren Sie den Prozess durch die Flock-Funktion.
<p style="margin-top: 5px; margin-bottom: 5px;">cb -c 100 -n 100 http://localhost/php_mulit.php<br/></p>

Erneut ausführen

Der Datenbank wird nur ein Datensatz hinzugefügt, um sicherzustellen, dass die Daten bei Parallelität korrekt sind.

<p style="margin-top: 5px; margin-bottom: 5px;">//生成码<br/>function get_code($len){<br/>$CHAR_ARR = array(&#39;1&#39;,&#39;2&#39;,&#39;3&#39;,&#39;4&#39;,&#39;5&#39;,&#39;6&#39;,&#39;7&#39;,&#39;8&#39;,&#39;9&#39;,&#39;A&#39;,&#39;B&#39;,&#39;C&#39;,&#39;D&#39;,&#39;E&#39;,&#39;F&#39;,&#39;G&#39;,&#39;H&#39;,&#39;I&#39;,&#39;J&#39;,&#39;K&#39;,&#39;L&#39;,&#39;M&#39;,&#39;N&#39;,&#39;O&#39;,&#39;P&#39;,&#39;Q&#39;,&#39;X&#39;,&#39;Y&#39;,&#39;Z&#39;,&#39;W&#39;,&#39;S&#39;,&#39;R&#39;,&#39;T&#39;);<br/>$CHAR_ARR_LEN = count($CHAR_ARR) - 1;<br/>$code = &#39;&#39;;<br/>while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }<br/>return $code;<br/>}<br/>$pdo = new PDO(&#39;mysql:host=localhost;dbname=ci_test&#39;,&#39;root&#39;,&#39;root&#39;);<br/>$fp = fopen(&#39;lock.txt&#39;,&#39;r&#39;);<br/>//通过排他锁 锁定该过程<br/>if(flock($fp,LOCK_EX)){<br/>//查询当前时间已发放验证码数量<br/>$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");<br/>$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);<br/>$code_num = $code_num_arr[&#39;sum&#39;];<br/>if($code_num < 1){<br/>sleep(2);<br/>$code = get_code(6);<br/>var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES (&#39;$code&#39;,".time().")") );<br/>}<br/>flock($fp,LOCK_UN);<br/>fclose($fp);<br/>}<br/></p>
Verwandte Empfehlungen:

<p style="margin-top: 5px; margin-bottom: 5px;">cb -c 100 -n 100 http://localhost/php_mulit.php<br/></p>
Eingehende Untersuchung, ob PHP nach dem Beenden des Browsers weiterhin ausgeführt wird


Beispiel, wie PHP ein Online-Adressbuch implementiert

Vergleich von Beispielen, wie PHP große Dateien effizient lesen kann

Das obige ist der detaillierte Inhalt vonPHP implementiert die gleichzeitige Snap-Up-Funktion durch Sperren. 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