Dieser Artikel basiert auf der PHP-Sprache und verwendet Sperren, um die Code-Grabbing-Funktion unter gleichzeitigen Bedingungen zu implementieren. Das Code-Grabbing ist während eines bestimmten Zeitraums geöffnet und erlaubt keine Wiederholung des geöffneten Codes Der Artikel ist sehr detailliert. Freunde, die ihn benötigen, können darauf verweisen.
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.
Jeder Code darf nicht wiederholt werden 1. Implementierung 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 erfüllt standardmäßig die aktuelle Situation. Es ist die Öffnungszeit und die Codes werden nicht wiederholt;
Der 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 zurück an den Kunden;
3) Wenn es voll ist, geben Sie eine Meldung zurück, dass keine Plätze vorhanden sind:
Dann werfen Sie einen Blick auf Die mit dem obigen Code unter gleichzeitigen Bedingungen erhaltenen Ergebnisse:
Um die Parallelität zu testen, können Sie den Apache-Benchmark zum Testen verwenden. Der Apache-Benchmark ist die Leistung des HTTP-SERVERS unter Apache. Geben Sie für das Bewertungstool das Bin-Verzeichnis von ein apche durch cmd und rufen Sie es über den Befehl ab auf, z. B.: ab -c Anzahl der Parallelität -n Gesamtzahl der Besuche URL
Der Code lautet wie folgt:
cb -c 100 -n 100 http://localhost/php_mulit.php Auf diese Weise konkurrieren 100 Benutzer und Kollegen um 1 Kontingent. Bei der Abfrage stellt jeder Benutzer fest, dass noch ein Kontingent vorhanden ist, und generiert dann eine Bestätigung Geben Sie den Code ein, fügen Sie ihn in die Datenbank ein und geben Sie den Bestätigungscode zurück. 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:
//生成码 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); }
Sperren Sie den Prozess durch die Flock-Funktion.
Weitere Informationen zur Herde finden Sie im PHP-Handbuch: http://php.net/manual/zh/function.flock.php
Erneut ausführen
Die Der Code lautet wie folgt:
cb -c 100 -n 100 http://localhost/php_mulit.phpDer Datenbank wird nur ein Datensatz hinzugefügt, um die Richtigkeit der Daten sicherzustellen unter Parallelität. Zusammenfassung: Das Obige ist der gesamte Inhalt dieses Artikels, ich hoffe, dass er für das Studium aller hilfreich sein wird.
Verwandte Empfehlungen:
php
Detaillierte Beispiele für den Unterschied zwischen die() und exit()phpMailer implementiert die Methode zum Binden von Postfächern
phpNutzung der Bildverarbeitungsfunktion imagecopyresampled
Das obige ist der detaillierte Inhalt vonMethode zur Verwendung von Sperren zur Realisierung der Code-Grabbing-Funktion unter Parallelität basierend auf PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!