本文實例講述了PHP使用文件鎖解決高并發問題。分享給大家供大家參考,具體如下:
新建一個.txt文件,文件中什么都不用寫。
【一】.阻塞(等待)模式:(只要有其他進程已經加鎖文件,當前進程會一直等其他進程解鎖文件)
<?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);?>
【二】.非阻塞(等待)模式:(只要有其他進程已經加鎖文件,當前進程不會等其他進程解鎖文件直接返回)
<?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);?>
如果連接數據庫費時間的話,下面有個簡單的小demo,可以更直觀的理解下。
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);
同時運行兩個文件,然后修改demo2中加鎖機制,就可以看出來阻塞(等待)模式和非阻塞(等待)模式的區別了。
但是這樣會導致隊列堵塞,假如10個人同一秒寫入數據庫,那就堵塞了,第10個人會等待前9個都執行完才會執行!
希望本文所述對大家PHP程序設計有所幫助。
新聞熱點
疑難解答
圖片精選