PHP中文件鎖定 flock() 函數


flock — 輕便的咨詢文件鎖定

說明

flock ( resource $handle , int $operation [, int &$wouldblock ] ) : bool

 

flock() 允許執行一個簡單的可以在任何平台中使用的讀取/寫入模型(包括大部分的 Unix 派生版和甚至是 Windows)。

在 PHP 5.3.2版本之前,鎖也會被 fclose() 釋放(在腳本結束后會自動調用)。

PHP 支持以咨詢方式(也就是說所有訪問程序必須使用同一方式鎖定, 否則它不會工作)鎖定全部文件的一種輕便方法。 默認情況下,這個函數會阻塞到獲取鎖;這可以通過下面文檔中 LOCK_NB 選項來控制(在非 Windows 平台上)。


參數
handle
文件系統指針,是典型地由 fopen() 創建的 resource(資源)。

operation
operation 可以是以下值之一:

LOCK_SH 取得共享鎖定(讀取的程序)。
LOCK_EX 取得獨占鎖定(寫入的程序。
LOCK_UN 釋放鎖定(無論共享或獨占)。
如果不希望 flock() 在鎖定時堵塞,則是 LOCK_NB(Windows 上還不支持)。

wouldblock
如果鎖定會堵塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設置為 TRUE。(Windows 上不支持)


這個函數一般用來處理並發事件的

例子1

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
/**
*這寫需要執行的代碼
**/
flock($fp, LOCK_UN); // 釋放鎖定
} else {
echo "Couldn't get the lock!";
}

fclose($fp);

 

但是其中需要執行的代碼在並發的情況下所有用戶進程都會執行,這是一個大坑。
所以 flock($fp, LOCK_EX) 要加上 flock($fp, LOCK_EX|LOCK_NB) 在鎖定時阻塞,才不會出現多個進程都會執行,但這樣也會導致,當一個進程執行程序時其它進程直接返回失敗錯誤。


例子2:

<?php 
$file = "./test1.txt";
$f = fopen($file, 'a');
if(flock($f, LOCK_EX)){#上鎖,因為執行的是fwrite(即寫入)所以是LOCK_EX
fwrite($f, "hello world!");
}
flock($f,LOCK_UN);#釋放
fclose($f);
?>

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM