Cette fois, je vais vous présenter l'utilisation des verrous de fichiers par Tphp pour résoudre les problèmes de haute concurrence. Quelles sont les précautions à prendre par PHP pour utiliser les verrous de fichiers pour résoudre les problèmes de haute concurrence. Voici des cas pratiques, jetons un coup d'œil.
Créez un nouveau fichier .txt sans rien écrire dans le fichier.
[1].Mode de blocage (attente) : (Tant que d'autres processus ont verrouillé le fichier, le processus actuel attendra que d'autres processus débloquent le fichier. fichier)
<span style="font-family: 微软雅黑, "Microsoft YaHei"; font-size: 14px;"> <?php<br/> //连接数据库<br/> $con=mysqli_connect("192.168.2.186","root","root","test");<br/> //查询商品数量是否大于0,大于0才能下单,并减少库存<br/> $fp = fopen("lock.txt", "r");<br/> //加锁<br/> if(flock($fp,LOCK_EX))<br/>{ <br/> $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1')); <br/> if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} //执行完成解锁<br/> flock($fp,LOCK_UN);<br/>}<br/>//关闭文件<br/>fclose($fp);<br/>unset($res);<br/>mysqli_close($con);<br/>?><br/></span>
[2].Mode non bloquant (en attente) : (Tant que d'autres processus ont verrouillé le fichier, le processus en cours n'attendez pas que d'autres processus débloquent le fichier directement Retour)
<span style="font-family: 微软雅黑, "Microsoft YaHei"; font-size: 14px;"> <?php<br/> //连接数据库<br/> $con=mysqli_connect("192.168.2.186","root","root","test");<br/> //查询商品数量是否大于0,大于0才能下单,并减少库存<br/> $fp = fopen("lock.txt", "r");<br/> //加锁if(flock($fp,LOCK_EX | LOCK_NB))<br/>{ <br/> $res=mysqli_fetch_assoc(mysqli_query($con,'SELECT total FROM shop WHERE id=1 LIMIT 1')); <br/> if($res['total']>0){mysqli_query($con,'UPDATE shop SET total=total-1 WHERE id=1');} <br/> //执行完成解锁<br/> flock($fp,LOCK_UN);<br/>}//关闭文件<br/>fclose($fp);<br/>unset($res);<br/>mysqli_close($con);<br/>?></span>
Si la connexion à la base de données prend du temps, il y a une démo simple ci-dessous pour une 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 la démo2, vous pouvez voir le mode de blocage (en attente) et non bloquant La différence entre le mode (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. exécuté avant d'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!