在之前的文章《PHP中怎樣刪除一個(gè)目錄(實(shí)例詳解)》中詳細(xì)的介紹了PHP中刪除目錄的相關(guān)知識(shí),其中刪除一個(gè)非空的目錄稍微復(fù)雜些。本篇文章我們來看一下PHP中文件鎖的相關(guān)知識(shí),希望對(duì)大家有幫助!
在之前的文章中我們已經(jīng)了解了很多的文件處理相關(guān)知識(shí),比如寫入文件、讀取文件等等操作,其中有一個(gè)東西叫做文件鎖。關(guān)于文件鎖的理解可能會(huì)有些抽象,因?yàn)槲募i的機(jī)制一般在打開文件的時(shí)候是看不到效果的。
那文件鎖到底是什么東西?他是用來做什么的?我們?yōu)槭裁匆褂梦募i?我們要怎樣去使用它?帶著這些疑問下面就讓我們來看一下文件鎖的相關(guān)知識(shí)吧。
什么是文件鎖?
首先的一個(gè)問題,簡(jiǎn)單來說,文件鎖就是一種文件保護(hù)機(jī)制,可以理解為當(dāng)你在讀取或者寫入這個(gè)文件的時(shí)候,也就是已經(jīng)有一位在進(jìn)行對(duì)該文件進(jìn)行操作的時(shí)候,文件的一種保護(hù)機(jī)制,為例避免在文件被操作期間被另一個(gè)進(jìn)行操作。
文件鎖的用途
一個(gè)文件有文件鎖的話,當(dāng)我在使用這個(gè)文件的時(shí)候,只有我能夠?qū)υ撐募M(jìn)行操作,除非將這個(gè)文件鎖進(jìn)行釋放,否則別人就沒法插手我對(duì)該文件的操作。同一時(shí)段只能夠允許一人進(jìn)行操作,防止數(shù)據(jù)錯(cuò)誤。
若是沒有文件鎖,出現(xiàn)多個(gè)人員操作同一個(gè)文件,極有可能會(huì)造成數(shù)據(jù)的錯(cuò)誤或者不對(duì)等,因此使用文件鎖是必要的。這就是文件所得用途以及為什么要使用文件鎖。
怎樣去使用文件鎖:flock()
函數(shù)
接下來我們看一下怎樣去使用這個(gè)PHP文件鎖,首先我們需要知道,我們?cè)诖蜷_文件后可以通過flock()函數(shù)來對(duì)文件進(jìn)行上鎖。
flock()
函數(shù)的基本語法格式如下:
flock(resource $handle, int $operation[, int &$wouldblock])
其中需要注意的是:
參數(shù)$handle
表示的是文件系統(tǒng)的指針,也就是通過fopen()
創(chuàng)建的文件資源;參數(shù)$operation
表示的是文件鎖類型;參數(shù)$wouldblock
是一個(gè)可選參數(shù),他表示的是可以將其設(shè)置為1
或者true
,這樣的話文件鎖定時(shí)就會(huì)堵塞其它進(jìn)程。
下面我們來介紹一下參數(shù)$operation的類型:
-
LOCK_EX
表示的是寫鎖,也就是在寫入的時(shí)候是寫鎖狀態(tài),其他人不能寫也沒法讀,只有等解鎖后才能恢復(fù)。 -
LOCK_SH
表示的是共享鎖,理解為別人只能讀,但是沒法寫。解鎖后回復(fù)。 -
LOCK_UN
表示的是解除上面兩種狀態(tài)。也就是解鎖。 -
LOCK_NB
表示的是在讀取或?qū)懭氲臅r(shí)后,當(dāng)文件鎖住了,就會(huì)馬上返回通知訪問的文件被鎖了。
接下來我們通過示例來看一下,示例如下:
<?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, '被鎖住了'); //寫入數(shù)據(jù) flock($handle, LOCK_UN); //釋放文件鎖 }else{ echo "鎖失敗了"; } fclose($handle);//關(guān)閉文件 readfile($file);//讀取文件內(nèi)容 ?>
輸出結(jié)果:
test.txt內(nèi)被寫入了數(shù)據(jù):
由上述示例我們便完成了對(duì)文件進(jìn)行文件鎖的操作,操作完成后使用fclose()函數(shù)來關(guān)閉文件;然后通過readfile()函數(shù)讀取文件內(nèi)容。其中需要注意的是:
當(dāng)我們使用flock()函數(shù),就是對(duì)文件進(jìn)行了加鎖,想要讓文件自動(dòng)解鎖,只需要調(diào)用fclose()函數(shù)就可以了。在我們寫代碼的時(shí)候在使用文件鎖之后還是加上解鎖語句為好。
大家如果感興趣的話,可以點(diǎn)擊《PHP視頻教程》進(jìn)行