搜尋
首頁php教程php手册PHP flock 檔案鎖定詳細介紹_php基礎

flock
(PHP 4, PHP 5)

flock — 輕便的諮詢文件鎖定

說明
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
PHP 支援以諮詢方式(也就是說所有存取程式必須使用相同方式鎖定, 否則它不會工作)鎖定全部檔案的一種輕便方法。

Note:

在 Windows 下 flock() 將會強制執行。

flock() 操作的 handle 必須是一個已經開啟的檔案指標。 operation 可以是下列值之一:


要取得共用鎖定(讀取的程式),將 operation 設為 LOCK_SH(PHP 4.0.1 先前的版本設為 1)。
要取得獨佔鎖定(寫入的程式),將 operation 設為 LOCK_EX(PHP 4.0.1 先前的版本設定為 2)。
要釋放鎖定(無論共用或獨佔),將 operation 設為 LOCK_UN(PHP 4.0.1 先前的版本中設為 3)。
如果不希望 flock() 在鎖定時堵塞,則給 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中設定為 4)。

flock() 允許執行一個簡單的可以在任何平台中使用的讀取/寫入模型(包括大部分的 Unix 派生版和甚至是 Windows)。如果鎖定會阻塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設定為 TRUE。鎖定操作也可以被 fclose() 釋放(程式碼執行完畢時也會自動呼叫)。

成功時回傳TRUE, 或失敗時回傳FALSE.


Example #1 flock() 範例

複製程式碼程式碼如下:

$fp = fopen("/tmp/lock.txt", "w ");
if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
fwrite($fp, "Write something here ");
flock($fp, LOCK_UN); // 釋放鎖定} else {
echo "Couldn't lock the file !";
}
fclose($fp);
?>

Note:

由於flock() 需要一個檔案指針, 因此可能不得不用一個特殊的鎖定檔案來保護打算透過寫入模式開啟的檔案的存取(在fopen() 函數中加入"w " 或"w ")。

Warning
flock() 不能用於 NFS 以及其它一些網路檔案系統。詳細資料查看自己作業系統的文件。
在部分作業系統中 flock() 以行程級實作。當用一個多執行緒伺服器 API(例如 ISAPI)時,可能不可以依靠 flock() 來保護文件,因為運行於同一伺服器實例中其它並行執行緒的 PHP 腳本可以對該文件進行處理。
flock() 不支援舊的檔案系統,如 FAT 以及它的衍生系統。因此,在此環境下總是會傳回 FALSE(尤其是對 Windows 98 使用者來說)。

php中檔案鎖定函數flock函數用法簡介:

語法:

bool flock ( int $handle , int $operation [, int &$wouldblock ] )
flock() 操作的handle 必須是一個已經打開的檔案指標。 operation 可以是以下值之一:
1. 要取得共享鎖定(讀取程式),將operation 設為LOCK_SH(PHP 4.0.1 先前的版本設為1)
2. 要取得獨佔鎖定(寫入程式),將operation 設為LOCK_EX(PHP 4.0.1 先前的版本中設為2)
3. 要釋放鎖定(無論共用或獨佔),將operation 設為LOCK_UN(PHP 4.0.1 以前的版本中設定為3)
4. 如果你不希望flock() 在鎖定時堵塞,則給operation 加上LOCK_NB(PHP 4.0.1 以前的版本中設定為4)

看下面代碼:

a.php
複製程式碼 程式碼如下:

$file = “temp.txt”;
$fp = fopen($file , 'w');
if(flock($fp , LOCK_EX)){
fwrite( $fp , “abc”);
sleep(10);
fwrite($fp , “123”);
flock($fp , LOCK_UN);
}
fclose($ fp);
?>

b.php
複製程式碼 程式碼如下:

$file = “temp.txt”;
$fp = fopen($file , 'r');
echo fread($fp , 100);
fclose($fp);
?>

運行a.php 後,馬上運行b.php ,可以看到輸出:
abc
等a.php 運行完後運行b.php ,可以看到輸出:
abc
123
顯然,當a.php 寫檔案時資料太大,導致時間比較長時,這時b.php 讀取資料不完整,在對b.php做修改
修改b.php 為:
複製程式碼 程式碼如下:

$file = “ temp.txt」;
$fp = fopen($file , 'r');
if(flock($fp , LOCK_EX)){
echo fread($fp , 100);
flock($fp , LOCK_UN);
} else{
echo “Lock file failed…”;
}
fclose($fp);
?>

運行a.php 後,馬上運行b.php ,可以發現b.php 會等到a.php 運行完成後(即10 秒後)才顯示:
abc
123
讀取資料完整,但時間過長,他要等待寫鎖釋放,再對b.php做修改。
修改b.php 為:
複製程式碼 程式碼如下:

php
$file = “temp.txt”;
$fp = fopen($file , 'r');
if(flock($fp , LOCK_SH | LOCK_NB)){
echo fread ($fp , 100);
flock($fp , LOCK_UN);
} else{
echo “Lock file failed…”;
}
fclose($fp);
?>

運行a.php 後,馬上運行b.php ,可以看到輸出:
Lock file failed…
證明可以回傳鎖定檔案失敗狀態,而不是向上面一樣要等很久。
腳本之家小編結論:
建議作檔案快取時,選好相關的鎖,不然可能導致讀取資料不完整,或重複寫入資料。
file_get_contents 好像選擇不了鎖,不知道他預設用的什麼鎖,反正和不鎖得到的輸出一樣,是不完整的資料。
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器