Maison  >  Article  >  développement back-end  >  Méthode d'utilisation du verrouillage pour implémenter la fonction de capture de code sous concurrence basée sur PHP

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

墨辰丷
墨辰丷original
2018-06-01 15:44:181275parcourir

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().")") );
}

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);
}

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!

Déclaration:
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