Maison > Applet WeChat > Développement de mini-programmes > Comment PHP utilise les verrous de fichiers pour résoudre les problèmes de concurrence élevée

Comment PHP utilise les verrous de fichiers pour résoudre les problèmes de concurrence élevée

小云云
Libérer: 2018-03-30 10:16:01
original
2342 Les gens l'ont consulté

Cet article présente principalement l'utilisation des verrous de fichiers en PHP pour résoudre les problèmes de haute concurrence. Il analyse les compétences d'utilisation associées du mode de blocage PHP et des verrous de fichiers en mode non bloquant pour résoudre les problèmes de haute concurrence sous forme d'exemples. j'en ai besoin, je peux y faire référence. J'espère que cela pourra aider tout le monde.

Créez un nouveau fichier .txt sans rien écrire dans le fichier.

【1】. Mode blocage (attente)  : (Tant que d'autres processus ont verrouillé le fichier, le processus en cours attendra d'autres processus pour déverrouiller le fichier )


<?php
//连接数据库
$con=mysqli_connect("192.168.2.186","root","root","test");
//查询商品数量是否大于0,大于0才能下单,并减少库存
$fp = fopen("lock.txt", "r");
//加锁
if(flock($fp,LOCK_EX))
{
  $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));
  if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1 WHERE id=1&#39;);}
  //执行完成解锁
  flock($fp,LOCK_UN);
}
//关闭文件
fclose($fp);
unset($res);
mysqli_close($con);
?>
Copier après la connexion

[2] Mode non bloquant (en attente)  : (Tant qu'il y a d'autres processus qui ont verrouillé le fichier. Le processus actuel n'attendra pas que d'autres processus débloquent le fichier et reviennent directement )


<?php
//连接数据库
$con=mysqli_connect("192.168.2.186","root","root","test");
//查询商品数量是否大于0,大于0才能下单,并减少库存
$fp = fopen("lock.txt", "r");
//加锁
if(flock($fp,LOCK_EX | LOCK_NB))
{
  $res=mysqli_fetch_assoc(mysqli_query($con,&#39;SELECT total FROM shop WHERE id=1 LIMIT 1&#39;));
  if($res[&#39;total&#39;]>0){mysqli_query($con,&#39;UPDATE shop SET total=total-1 WHERE id=1&#39;);}
  //执行完成解锁
  flock($fp,LOCK_UN);
}
//关闭文件
fclose($fp);
unset($res);
mysqli_close($con);
?>
Copier après la connexion

Si la connexion à la base de données prend du temps, voici une petite démo simple qui peut être comprise de manière plus intuitive.

demo.php


<?php
$fp = fopen("file_lock.txt", "r");
// 加锁
if(flock($fp, LOCK_EX))
{
  sleep(10);
  echo 1;
  //执行完成解锁
  flock($fp,LOCK_UN);
} else {
  echo 2;
}
//关闭文件
fclose($fp);
Copier après la connexion

demo2.php


<?php
$fp = fopen("file_lock.txt", "r");
// 加锁(如果改成flock($fp, LOCK_EX | LOCK_NB),demo2.php会直接返回2,否则会等待demo.php执行完返回1)
if(flock($fp, LOCK_EX))
{
  echo 1;
} else {
  echo 2;
}
//关闭文件
fclose($fp);
Copier après la connexion

Exécuter simultanément Deux fichiers, puis modifiez le mécanisme de verrouillage dans demo2, vous pouvez voir la différence entre le mode bloquant (en attente) et le mode non bloquant (en attente).

Mais cela entraînera le blocage de la file d'attente. Si 10 personnes écrivent dans la base de données à la même seconde, elle sera bloquée la 10ème personne attendra que les 9 premières soient exécutées avant de s'exécuter !


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