溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

php中的文件鎖有什么作用

發(fā)布時間:2021-08-07 09:42:41 來源:億速云 閱讀:134 作者:chen 欄目:編程語言

這篇文章主要介紹“php中的文件鎖有什么作用”,在日常操作中,相信很多人在php中的文件鎖有什么作用問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”php中的文件鎖有什么作用”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

在之前的文章《php文件操作之如何清空文件重新添加數(shù)據(jù)》中我們介紹了向文件中寫入數(shù)據(jù)的方法,文章中我們是同一時刻單個用戶在操作文件,因此沒有問題。但如果是在網(wǎng)絡環(huán)境下,多個客戶端用戶在同一個時刻對服務器上的同一個文件進行訪問操作,那么程序就會出現(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");    //設置字符編碼
$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”獨占鎖,且設置“LOCK_NB”在鎖定的情況下避免阻塞其他進程,直接返回else中的內(nèi)容。接著就可以使用fwrite()函數(shù)進行寫入操作,寫入當前的時間了。

文件操作好后,就需要使用fclose()函數(shù)來關(guān)閉文件;最后使用readfile()函數(shù)讀取文件內(nèi)容。因此輸出結(jié)果為:

php中的文件鎖有什么作用

下面我們來簡單了解一下flock()函數(shù)。

flock($file,$lock,$block)函數(shù)接受了2個必需參數(shù)$file(需要加鎖/解鎖的打開文件)和$lock(鎖定類型)和一個可省略的參數(shù)$block(當值設置為1 或 true時,可在文件鎖定時堵塞其它進程)。

$lock參數(shù)用于設置文件鎖類型,可以設置一個或多個以下值(多個值需要使用|來分隔):

  • LOCK_SH - 共享鎖定(讀取的程序)。允許其他進程訪問該文件。

  • LOCK_EX - 獨占鎖定(寫入的程序)。防止其他進程訪問該文件。

  • LOCK_UN - 釋放一個共享鎖定或獨占鎖定

  • LOCK_NB - 鎖定的情況下避免阻塞其他進程。

到此,關(guān)于“php中的文件鎖有什么作用”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI