PHP flock():檔案鎖

2020-07-16 10:05:29
檔案鎖,顧名思義就是對檔案上鎖。前面我們在介紹《向檔案中寫入資料》時,同一時刻只有一個單獨的使用者在操作檔案,這樣是沒有問題的。但是如果兩個或者更多使用者同時操作同一檔案的話,程式就會出現錯誤。解決這種問題的方法就是,在使用 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() 函數時,檔案會自動解鎖,但最好還是在檔案寫入完成後加上解鎖語句。