在上一篇文章中我們介紹了使用PHP取得指定目錄中檔案(不包含子目錄)的方法,有需要的請看《php怎麼知道指定目錄中有哪些檔案》 。這次我們來跟大家介紹一下文件鎖,看看文件鎖的作用,加入文件鎖和解除文件鎖的方法。
在先前的文章《php檔案操作之如何清空檔案重新新增資料》中我們介紹了向檔案中寫入資料的方法,文章中我們是同一時刻單一使用者在操作文件,因此沒有問題。但如果是在網路環境下,多個客戶端使用者在同一時刻對伺服器上的同一個檔案進行存取操作,那麼程式就會出現錯誤,且很可能會破壞檔案。
舉例:
有一個使用者正在寫入檔案中寫入資料(資料還沒完),此時又有一個使用者也向這個文件中寫入數據,這樣會造成數據寫入混亂;
或者,在用戶沒有將數據寫完的情況下,有其他用戶去獲取這個文件中的內容,那麼該用戶所取得的資料是不是不完整的,會得到殘缺的資料。
為了解決這個問題,PHP提供了flock()函數--檔案鎖定機制,可以鎖定或釋放檔案。
在使用PHP寫入檔案時,暫時鎖定該檔案;只有等到鎖定被釋放以後,其他使用者才能操作該檔案。這樣可以避免在並發存取同一個檔案時破壞資料。
我們來看看下面一個範例:
<?php header("Content-Type: text/html;charset=utf-8"); //设置字符编码 $file = "test.txt"; $handle = fopen($file,'w+'); //打开文件 if(flock($handle, LOCK_EX|LOCK_NB)){ //给文件上锁 fwrite($handle, '现在是:'.date('Y-m-d H:i:s', time())); //写入数据 flock($handle, LOCK_UN); //释放文件锁 }else{ echo "string"; } fclose($handle);//关闭文件 readfile($file);//读取文件内容 ?>
分析上面的程式碼:
先使用fopen()函數開啟一個檔案。然後使用flock($handle, LOCK_EX|LOCK_NB)
語句為檔案加上一個「LOCK_EX」獨佔鎖,且設定「LOCK_NB」在鎖定的情況下避免阻塞其他進程,直接傳回else中的內容。接著就可以使用fwrite()函數進行寫入操作,寫入目前的時間了。
檔案操作好後,就需要使用fclose()函數來關閉檔案;最後使用readfile()函數讀取檔案內容。因此輸出結果為:
下面我們來簡單了解flock()函數。
flock($file,$lock,$block)
函數接受了2個必要參數$file
(需要加鎖/解鎖的開啟檔案)和$lock
(鎖定類型)和一個可省略的參數$block
(當值設為1 或true時,可在檔案鎖定時阻塞其它進程)。
$lock參數用於設定檔案鎖定類型,可以設定一個或多個以下值(多個值需要使用|
來分隔):
##LOCK_SH - 共用鎖定(讀取的程式)。允許其他進程存取該檔案。
LOCK_EX - 獨佔鎖定(寫入的程式)。防止其他進程存取該文件。
LOCK_UN - 釋放一個共享鎖定或獨佔鎖定
LOCK_NB - 鎖定的情況下避免阻塞其他進程。
以上是php知道文件鎖嗎?有什麼用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!