PHP 利用檔案鎖處理高併發
阿新 • • 發佈:2018-11-16
利用
flock()
函式對檔案進行加鎖(排它鎖),實現併發按序進行。
flock(file,lock,block)
有三個引數。
- file : 已經開啟的檔案
-
lock : 鎖的型別
- LOCK_SH : 共享鎖定(讀鎖)
- LOCK_EX : 獨佔鎖定(排它鎖,寫鎖)
- LOCK_UN : 解鎖
- LOCK_NB : 如果希望在檔案鎖定時阻塞程序,那麼需要加上該引數
- block : 設定為
true
的時候,鎖定檔案時,會阻止其他程序
下面是一個簡單demo
/** * 阻塞模式(後面的程序會一直等待前面的程序執行完畢) */ public function crateOrder() { $file = fopen(__DIR__.'/lock.txt','w+'); //加鎖 if(flock($file,LOCK_EX)) { //TODO 執行業務程式碼 flock($file,LOCK_UN);//解鎖 } //關閉檔案 fclose($file); } /** * 非阻塞模式(只要當前檔案有鎖存在,那麼直接返回) */ public function crateOrder() { $file = fopen(__DIR__.'/lock.txt','w+'); //加鎖 if(flock($file,LOCK_EX|LOCK_NB)) { //TODO 執行業務程式碼 flock($file,LOCK_UN);//解鎖 } else { //TODO 執行業務程式碼 返回系統繁忙等錯誤提示 } //關閉檔案 fclose($file); }
小提示:在執行
fclose()
的時候檔案也會自動解鎖,所以可以省略解鎖的程式碼