這次給大家帶來PHP使用檔案鎖解決高並發步驟詳解,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中文網其它相關文章!
推薦閱讀:
PHP裝飾器模式使用詳解
PHP動態擷取函數參數步驟詳解