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); ?>