php中檔案鎖函式flock函式用法簡介

2021-06-18 01:13:32 字數 1677 閱讀 2136

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 

<?php 

$file = "temp.txt"; 

$fp = fopen($file , 'w'); 

if(flock($fp , lock_ex)) 

fclose($fp); 

?> 

b.php 

<?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 為: 

<?php 

$file = "temp.txt"; 

$fp = fopen($file , 'r'); 

if(flock($fp , lock_ex)) else 

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)) else 

fclose($fp); 

?> 

執行 a.php 後,馬上執行 b.php ,可以看到輸出: 

lock file failed… 

證明可以返回鎖檔案失敗狀態,而不是向上面一樣要等很久。 

結論: 

建議作檔案快取時,選好相關的鎖,不然可能導致讀取資料不完整,或重複寫入資料。 

file_get_contents 好像選擇不了鎖,不知道他預設用的什麼鎖,反正和不鎖得到的輸出一樣,是不完整的資料。

flock 函式 檔案鎖

檔案鎖是一種檔案讀寫機制,在任何特定的時間只允許乙個程序訪問乙個檔案。利用這種機制能夠使讀寫單個檔案的過程變得更安全。這裡我們使用flock 函式。flock函式說明 flock 會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式只能鎖定整個檔案,無法鎖定檔...

linux使用flock檔案鎖

使用linux flock 檔案鎖實現任務鎖定,解決衝突 格式 flock sxun w fd flock sxon w file c command flock help flock util linux ng 2.17.2 usage flock sxun w fd flock sxon w f...

linux使用flock檔案鎖

使用linux flock 檔案鎖實現任務鎖定,解決衝突 格式 flock sxun w fd flock sxon w file c command flock help flock util linux ng 2.17.2 usage flock sxun w fd flock sxon w f...