Maison  >  Article  >  développement back-end  >  Explication détaillée des étapes à suivre pour utiliser les verrous de fichiers pour résoudre les problèmes de concurrence élevée en PHP

Explication détaillée des étapes à suivre pour utiliser les verrous de fichiers pour résoudre les problèmes de concurrence élevée en PHP

php中世界最好的语言
php中世界最好的语言original
2018-05-17 13:47:502027parcourir

Cette fois, je vais vous donner une explication détaillée des étapes permettant à PHP d'utiliser les verrous de fichiers pour résoudre une concurrence élevée. Quelles sont les précautions pour que PHP utilise les verrous de fichiers pour résoudre une concurrence élevée. un cas pratique, jetons un coup d'oeil.

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

【2】 Mode non bloquant (en attente)  : (Tant que les autres processus. ont verrouillé le fichier, actuellement Le processus 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);
?>

Si la connexion à la base de données prend du temps, il y a une simple démo ci-dessous pour un compréhension 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);

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

Exécutez deux fichiers en même temps, puis modifiez le mécanisme de verrouillage dans demo2, vous pouvez voir le mode bloquant (la différence entre attendre) et le mode non bloquant (attendre).

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 !

Je pense que vous maîtrisez la méthode après avoir lu le cas dans cet article. Pour des informations plus intéressantes, veuillez prêter attention aux autres articles connexes sur le site Web chinois de php !

Lecture recommandée :

Explication détaillée de l'utilisation du mode décorateur PHP

Explication détaillée des étapes d'obtention dynamique paramètres de fonction en PHP

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