讀寫相關的問題是永遠存在的,文件鎖定就是為了解決這個問題而做的,其實它就是個簡單的信號量。讀寫相關性指由於同時讀寫檔案造成文件資料的隨機性衝突。為了明確知道在何時透過何種操作對更改或是讀取了文件中的那些數據,有必要對操作進行序列化,原子化,同步化,使用戶能確知在何時文件中有什麼數據。文件鎖就是其中一個工具。
檔案系統一般有兩種鎖,共享鎖定及排它鎖,也可稱為讀鎖和寫入鎖定。
檔案系統鎖定的特色:
一個檔案開啟的時候只能擁有一把鎖,就是在同時,不能給一個檔案同時分配兩個以上的鎖定。
讀取已上鎖的檔案的使用者可以持有這把鎖,也就是持有這把鎖的使用者可以對該檔案進行對應的操作,如讀或寫。使用者可以申請持有某個文件鎖,如果文件開始無鎖,申請持有鎖之前先由系統為該文件創建了一把鎖,然後該申請者持有它。
持有鎖的規則:如果這個檔案已擁有一個讀(共享)鎖,其它使用者不能為該檔案分配排它鎖或唯讀鎖,但可以持有這把鎖,也就是說其它使用者可以讀文件,但只要該文件被鎖住,就沒有使用者可以對其進行寫入。如果該文件已有一把排它鎖且已為某用戶持有,則沒有任何用戶可以再持有這把鎖,除非持有者解鎖。
有一個重要的概念要記住:對文件的操作本身與鎖其實沒有什麼關係,無論文件是否被上鎖,用戶都可以隨意對文件進行正常情況下的任何操作,但操作系統會檢查鎖,針對不同的情況給予不同的處理。比如說在無鎖的情況下,任何人可以同時對某文件進行任意的讀寫,當然這樣很有可能讀寫的內容會出現錯誤——注意只是內容出錯,操作並不會出錯。加鎖後,某些操作在某些情況下會被拒絕。文件鎖的作用並不是保護文件及資料本身,而是保證資料的同步性,因此文件鎖只對持有鎖的使用者才是真正有效的,也只有所有使用者都使用同一種完全相同的方式利用文件鎖的限制對檔案進行操作,檔案鎖才能對所有使用者有效,否則,只要有一個例外,整個檔案鎖的功能就會被破壞。例如,所有人都遵循的開文件,加鎖,操作讀寫,解鎖,關閉文件的步驟的話,所有的人操作都不會出現問題,因為基於文件鎖的分配及持有原則,文件中的數據的更新是作為原子操作存在的,是不可分的,因此也是同步的,安全的。但假如某個人不是採取此步驟,那麼他在讀寫時就會出現問題,不是讀不準就是寫不進等等。
基於上述原理,對讀取資料是否鎖定這點就值得說。一般來說,寫資料的時候排它鎖定是唯一的操作,它這時保證寫到文件中的資料是正確的,文件被鎖時,其它使用者無法得到該鎖,因此無權做任何操作。在讀的時候,要視具體情況而定,大多數情況下,如果不需要特別精確或是敏感的數據,無需鎖定,因為鎖定要花時間和資源,一個人申請持有鎖花不了時間,人一多就有問題了,最主要的是,如果該文件需要被更新的話,假如被上了只讀鎖,則寫入無法進行,因為那些想寫入的用戶將得不到排它鎖,如果同時申請持有隻讀鎖的人過多的話,排它鎖就有可能一直申請不到,這樣表現就是文件可能很長時間內無法被寫入,顯得很慢。一般來說,寫文件的機會相對較少,也更重要,因此主要做好排它鎖定,只讀鎖在多數情況下並無必要。那麼只讀鎖用在何處呢?只讀鎖其實只對使用者本身有用,只讀鎖定保證使用者讀到的資料是確實從檔案中讀到的真實數據,而不是被稱為「dirty」的髒數據。其實,這個還是針對那些不用鎖的其它用戶對文件的誤操作,假如文件上鎖,其它用戶不一定非要通過鎖對文件進行讀寫,如果他是直接讀寫的話,對上了鎖的文件操作不一定有效,持有讀鎖的使用者可以肯定在他讀取資料的時候讀出來的是從真實的檔案中得到的,而不是同時已被覆蓋掉的資料。
因此,在寫入的時候上排它鎖應該是天經地義的,可以保證這時資料的不會出錯。如果你不申請共享鎖,可能讀出的數據有錯誤,但對文件本身沒有任何影響,影響只是對用戶的,申請共享鎖後讀出的數據肯定是當時讀的時候文件中的真實數據,如果不是為了確保資料的精確性,共享鎖可以不加,充其量就是重新讀一次,如果你讀它是為了寫入,不如直接加排它鎖,沒有必要用共享鎖。
還有一點要強調的是:文件鎖只對使用它的用戶,而且是按規則使用它的用戶才有效,否則,你用你的,我用我的,有的用,有的不用,還是會亂套的,錯誤還是會出現的,對同一個文件,只有大家用同一個規則用文件鎖,才能保證每個用戶在對該文件進行共享操作的時候不會出現讀寫錯誤。
以上是詳解PHP檔案讀寫鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

SublimeText3 Linux新版
SublimeText3 Linux最新版