Cet article partagera avec vous comment résoudre le problème de haute concurrence grâce au verrouillage de fichiers PHP. Les amis qui en ont besoin peuvent se référer au contenu de cet article
Méthode de verrouillage de fichiers PHP pour résoudre le problème de haute concurrence. concurrence
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 actuel attendra que d'autres processus débloquent 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
【 2】.Mode non bloquant (en attente) : (Tant que d'autres processus ont verrouillé le fichier, le processus actuel n'attendra pas que d'autres processus déverrouillent 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
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);
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 les deux fichiers en même temps, puis modifiez le mécanisme de verrouillage dans demo2, vous pouvez voirLa 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 !
Le verrouillage de fichier PHP résout la concurrence élevée
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 actuel attendra que d'autres processus débloquent 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
【 2】.Mode non bloquant (en attente) : (Tant que d'autres processus ont verrouillé le fichier, le processus actuel n'attendra pas que d'autres processus déverrouillent 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,'SELECT total FROM shop WHERE id=1 LIMIT 1')); if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁 flock($fp,LOCK_UN); }//关闭文件fclose($fp);unset($res); mysqli_close($con);?>
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);
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 les deux fichiers en même temps, puis modifiez le mécanisme de verrouillage dans demo2, vous pouvez voirLa 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 !
Recommandations associées :
Parlons des verrous de fichiers PHP, des verrous partagés et des verrous exclusifs
Explication détaillée de la simultanéité des verrous de fichiers PHP. opérations
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!