Méthode d'utilisation du verrouillage pour implémenter la fonction de capture de code sous concurrence basée sur PHP

墨辰丷
Libérer: 2023-03-29 09:02:02
original
1322 Les gens l'ont consulté

Cet article est basé sur le langage PHP et utilise le verrouillage pour implémenter la fonction de saisie de code dans des conditions concurrentes. La saisie de code est ouverte pendant une période de temps spécifique et ne permet pas de répéter le code ouvert. L'article est très détaillé. Les amis qui en ont besoin peuvent s'y référer

Exigences : Fonction de saisie de code

Exigences :

1. ;

2. Les codes publiés dans chaque période sont limités

3. Chaque code ne peut pas être répété

Mise en œuvre :

1. Mise en œuvre sans tenir compte de la concurrence :

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 (&#39;$code&#39;,".time().")") );
}
Copier après la connexion

Les valeurs par défaut du code ci-dessus satisfont aux heures d'ouverture actuelles et les codes ne sont pas répétés

Traiter sans tenir compte de la concurrence :

1) Sélectionnez pour interroger le nombre de codes de vérification émis par la base de données actuelle ;

2) S'il reste des places, générez un code de vérification, insérez-le dans la base de données et renvoyez le code de vérification au client ;

3) S'il est plein ; renvoie un message indiquant qu'il n'y a pas de places

2. Mise en œuvre dans des conditions concurrentes :

Jetez ensuite un œil aux résultats obtenus par le code ci-dessus dans des conditions concurrentes :

Pour tester la concurrence, vous pouvez utiliser Apache Benchmark pour tester. Apache Benchmark est un serveur HTTP sous APACHE. Pour l'outil d'évaluation des performances, entrez le répertoire bin d'Apche via cmd et appelez. via la commande ab, telle que : ab -c nombre de concurrence -n url total des visites

Le code est le suivant :


cb -c 100 -n 100 http : //localhost/php_mulit.php

De cette façon, 100 utilisateurs et collègues se disputent 1 quota. Lors de l'interrogation, chaque utilisateur constatera qu'il y a encore un quota, le code de vérification sera généré, inséré dans. la base de données et le code de vérification sera renvoyé ; cela entraînera l'envoi d'un trop grand nombre de codes de vérification. En fait, après avoir exécuté cette commande, la base de données contient 13 enregistrements supplémentaires au lieu d'un.

Comment éviter que cela se produise ?

Vous pouvez verrouiller le processus du jugement à l'insertion en ajoutant un verrou exclusif pour garantir qu'un seul processus est en cours d'exécution dans ce processus de jugement à tout moment. La mise en œuvre est la suivante :

//生成码
function get_code($len){
$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;);
$CHAR_ARR_LEN = count($CHAR_ARR) - 1;
$code = &#39;&#39;;
while(--$len > 0){ $code .= $CHAR_ARR[rand(0,$CHAR_ARR_LEN)]; }
return $code;
}
$pdo = new PDO(&#39;mysql:host=localhost;dbname=ci_test&#39;,&#39;root&#39;,&#39;root&#39;);
$fp = fopen(&#39;lock.txt&#39;,&#39;r&#39;);
//通过排他锁 锁定该过程
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[&#39;sum&#39;];
if($code_num < 1){
sleep(2);
$code = get_code(6);
var_dump( $pdo->query("INSERT INTO code_test (code,create_time) VALUES (&#39;$code&#39;,".time().")") );
}
flock($fp,LOCK_UN);
fclose($fp);
}
Copier après la connexion

Verrouillez le processus via la fonction flock.

Pour plus d'informations sur le flock, veuillez vous référer au manuel php : http://php.net/manual/zh/function.flock.php

Exécuter à nouveau

Le le code est le suivant :


cb -c 100 -n 100 http://localhost/php_mulit.php

Un seul enregistrement est ajouté à la base de données, garantissant l'exactitude des données sous concurrence.

Résumé : Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.

Recommandations associées :

php Exemples détaillés de la différence entre die() et exit()

phpmailer implémente la méthode de liaison de la boîte aux lettres

phpUtilisation de la fonction de traitement d'image imagecopyresampled

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal