文件鎖分為兩種方式:
【一】.阻塞模式:(如果其他進程已經加鎖文件,當前進程會一直等其他進程解鎖文件后繼續執行)
<?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返回提示信息
