php解決高並發(文件鎖)


文件鎖分為兩種方式:

【一】.阻塞模式:(如果其他進程已經加鎖文件,當前進程會一直等其他進程解鎖文件后繼續執行)

<?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);
?>
這種情況若是其他進程已經加鎖文件,那么所有進程都會等他執行完並解鎖文件后才會執行

【二】.非阻塞模式:(如果其他進程已經加鎖文件,當前進程不會等其他進程解鎖文件,而是走else)
<?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);
}else{
  echo "locked file failed\n";
} unset($res); mysqli_close($con); ?>
這種情況就會直接走else返回提示信息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM