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...