Heim  >  Artikel  >  Backend-Entwicklung  >  PHP realisiert die Code-Grabbing-Funktion unter Parallelität durch das Beispiel von lock_php

PHP realisiert die Code-Grabbing-Funktion unter Parallelität durch das Beispiel von lock_php

WBOY
WBOYOriginal
2016-08-17 13:02:34964Durchsuche

Anforderung: 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


Implementierung:


1. Implementieren Sie ohne Berücksichtigung der Parallelität:

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

Prozess ohne Berücksichtigung der Parallelität:


1) Wählen Sie diese Option, um die Anzahl der von der aktuellen Datenbank ausgegebenen Bestätigungscodes abzufragen


 2) Wenn noch Plätze vorhanden sind, generieren Sie einen Bestätigungscode, fügen Sie ihn in die Datenbank ein und geben Sie den Bestätigungscode an den Kunden zurück

3) Wenn es voll ist, wird eine Meldung angezeigt, dass keine Plätze mehr vorhanden sind

2. Umsetzung unter gleichzeitigen Bedingungen:


Sehen Sie sich dann die Ergebnisse an, die der obige Code in einer gleichzeitigen Situation erzielt:


Um die Parallelität zu testen, können Sie Apache Benchmark verwenden, um das Leistungsbewertungstool für HTTP SERVER unter APACHE zu testen. Geben Sie das bin-Verzeichnis von apche über cmd ein und rufen Sie es über den Befehl ab auf gleichzeitige Anzahl -n Gesamtbesuche-URL



Code kopieren

Der Code lautet wie folgt: cb -c 100 -n 100 http://localhost/php_mulit.php


Auf diese Weise versuchen 100 Benutzer und Kollegen, 1 Kontingent zu ergattern. Wenn jeder Benutzer bei der Abfrage feststellt, dass noch ein Kontingent vorhanden ist, wird der Bestätigungscode generiert, in die Datenbank eingefügt und der Bestätigungscode wird angezeigt zurückgegeben; dadurch Überprüfung verursacht. Es werden zu viele Codes ausgegeben. 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.
//生成码
function get_code($len){
$CHAR_ARR = array('1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','X','Y','Z','W','S','R','T');
$CHAR_ARR_LEN = count($CHAR_ARR) - 1;
$code = '';
while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }
return $code;
}
$pdo = new PDO('mysql:host=localhost;dbname=ci_test','root','root');
$fp = fopen('lock.txt','r');
//通过排他锁 锁定该过程
if(flock($fp,LOCK_EX)){
//查询当前时间已发放验证码数量
$code_num_rs = $pdo->query("SELECT COUNT(*) as sum FROM code_test");
$code_num_arr = $code_num_rs->fetch(PDO::FETCH_ASSOC);
$code_num = $code_num_arr['sum'];
if($code_num < 1){
sleep(2);
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES ('$code',".time().")") );
}
flock($fp,LOCK_UN);
fclose($fp);
} 
Weitere Informationen zur Herde finden Sie im PHP-Handbuch: http://php.net/manual/zh/function.flock.php


Erneut ausführen



Code kopieren

Der Code lautet wie folgt: cb -c 100 -n 100 http://localhost/php_mulit.php

Der Datenbank wird nur ein Datensatz hinzugefügt, um die Richtigkeit der Daten unter gleichzeitigen Bedingungen sicherzustellen.
Das Obige ist die Einführung des Herausgebers in die Code-Grabbing-Funktion von PHP unter Parallelität durch Sperren. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Herausgeber wird Ihnen rechtzeitig antworten. Ich möchte mich auch bei Ihnen allen für Ihre Unterstützung der Script House-Website bedanken!

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