檔案鎖,顧名思義就是對檔案上鎖。前面我們在介紹《向檔案中寫入資料》時,同一時刻只有一個單獨的使用者在操作檔案,這樣是沒有問題的。但是如果兩個或者更多使用者同時操作同一檔案的話,程式就會出現錯誤。解決這種問題的方法就是,在使用 PHP 向檔案中寫入時,暫時鎖定該檔案。
通過學習《file_put_contents() 函數》我們知道,可以通過在 file_put_contents() 函數的第三個引數中設定“LOCK_EX”來為檔案加鎖。但如果我們使用 fopen()、fwrite()、fclose() 等函數來操作檔案的話,就需要在開啟檔案之後使用 flock() 函數來為檔案加鎖了。
flock() 函數的語法格式如下:
flock(resource $handle, int $operation[, int &$wouldblock])
引數說明如下:
-
$handle:檔案系統指標,即使用 fopen() 建立的檔案資源;
-
$operation:檔案鎖型別,可以是以下值之一:
-
LOCK_SH 取得共用鎖定(讀取的程式);
-
LOCK_EX 取得獨占鎖定(寫入的程式);
-
LOCK_UN 釋放鎖定(無論共用或獨占);
-
如果不希望 flock() 在鎖定時堵塞,則可以在 $operation 中新增 LOCK_NB 引數(Windows 上還不支援)。
-
$wouldblock:可選引數,如果希望檔案鎖定時堵塞其它進程,則可以將該引數設定為 1 或 true。(Windows 上不支援)
提示:使用 flock() 函數不僅可以為檔案加鎖,好可以解鎖檔案。
【範例】使用 flock() 函數為檔案加鎖。
<?php
$file = fopen('./test.txt','w+');
if(flock($file, LOCK_EX|LOCK_NB)){
fwrite($file, 'C語言中文網'.date('Y-m-d H:i:s', time()));
flock($file, LOCK_UN);
}else{
echo "string";
}
fclose($file);
?>
提示:如果使用了 flock() 函數對檔案進行了加鎖操作,那麼當呼叫 fclose() 函數時,檔案會自動解鎖,但最好還是在檔案寫入完成後加上解鎖語句。