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