在上一篇文章中我們介紹了使用PHP獲取指定目錄中文件(不包含子目錄)的方法,有需要的請看《php怎么知道指定目錄中有哪些文件》。這次我們來給大家介紹一下文件鎖,看看文件鎖的作用,添加文件鎖和解除文件鎖的方法。
在之前的文章《php文件操作之如何清空文件重新添加數(shù)據(jù)》中我們介紹了向文件中寫入數(shù)據(jù)的方法,文章中我們是同一時刻單個用戶在操作文件,因此沒有問題。但如果是在網(wǎng)絡(luò)環(huán)境下,多個客戶端用戶在同一個時刻對服務(wù)器上的同一個文件進行訪問操作,那么程序就會出現(xiàn)錯誤,且很可能會破壞文件。
舉個例子:
-
有一個用戶正在向文件中寫入數(shù)據(jù)(數(shù)據(jù)還沒完),此時又有一個用戶也向這個文件中寫入數(shù)據(jù),這樣會造成數(shù)據(jù)寫入混亂;
-
或者,在用戶沒有將數(shù)據(jù)寫完的情況下,有其他用戶去獲取這個文件中的內(nèi)容,那么該用戶獲取的數(shù)據(jù)是不是不完整的,會得到殘缺的數(shù)據(jù)。
為了解決這個問題,PHP提供了flock()函數(shù)–文件鎖機制,可以鎖定或釋放文件。
在使用PHP向文件中寫入時,暫時鎖定該文件;只有等到鎖定被釋放以后,其他用戶才能操作該文件。這樣可以避免在并發(fā)訪問同一個文件時破壞數(shù)據(jù)。
我們來看看下面一個示例:
<?php header("Content-Type: text/html;charset=utf-8"); //設(shè)置字符編碼 $file = "test.txt"; $handle = fopen($file,'w+'); //打開文件 if(flock($handle, LOCK_EX|LOCK_NB)){ //給文件上鎖 fwrite($handle, '現(xiàn)在是:'.date('Y-m-d H:i:s', time())); //寫入數(shù)據(jù) flock($handle, LOCK_UN); //釋放文件鎖 }else{ echo "string"; } fclose($handle);//關(guān)閉文件 readfile($file);//讀取文件內(nèi)容 ?>
分析上面的代碼:
先使用fopen()函數(shù)打開一個文件。然后使用flock($handle, LOCK_EX|LOCK_NB)
語句給文件加一個“LOCK_EX”獨占鎖,且設(shè)置“LOCK_NB”在鎖定的情況下避免阻塞其他進程,直接返回else中的內(nèi)容。接著就可以使用fwrite()函數(shù)進行寫入操作,寫入當前的時間了。
文件操作好后,就需要使用fclose()函數(shù)來關(guān)閉文件;最后使用readfile()函數(shù)讀取文件內(nèi)容。因此輸出結(jié)果為:
下面我們來簡單了解一下flock()函數(shù)。
flock($file,$lock,$block)
函數(shù)接受了2個必需參數(shù)$file
(需要加鎖/解鎖的打開文件)和$lock
(鎖定類型)和一個可省略的參數(shù)$block
(當值設(shè)置為1 或 true時,可在文件鎖定時堵塞其它進程)。
$lock參數(shù)用于設(shè)置文件鎖類型,可以設(shè)置一個或多個以下值(多個值需要使用|
來分隔):
-
LOCK_SH
– 共享鎖定(讀取的程序)。允許其他進程訪問該文件。 -
LOCK_EX
– 獨占鎖定(寫入的程序)。防止其他進程訪問該文件。 -
LOCK_UN
– 釋放一個共享鎖定或獨占鎖定 -
LOCK_NB
– 鎖定的情況下避免阻塞其他進程。
好了就說到這里了,有其他想知道的,可以點擊這個哦。→ →PHP文件基礎(chǔ)操作
推薦:《PHP面試題大匯總(收藏)》《php視頻教程》