Heim > Artikel > Backend-Entwicklung > PHP realisiert die Code-Grabbing-Funktion unter Parallelität durch das Beispiel von lock_php
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;
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().")") ); }
Prozess ohne Berücksichtigung der Parallelität:
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
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); }