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