首頁 後端開發 php教程 詳解PHP檔案讀寫鎖

詳解PHP檔案讀寫鎖

Aug 21, 2017 pm 02:14 PM
php 文件 讀寫

讀寫相關的問題是永遠存在的,文件鎖定就是為了解決這個問題而做的,其實它就是個簡單的信號量。讀寫相關性指由於同時讀寫檔案造成文件資料的隨機性衝突。為了明確知道在何時透過何種操作對更改或是讀取了文件中的那些數據,有必要對操作進行序列化,原子化,同步化,使用戶能確知在何時文件中有什麼數據。文件鎖就是其中一個工具。 

檔案系統一般有兩種鎖,共享鎖定及排它鎖,也可稱為讀鎖和寫入鎖定。 

檔案系統鎖定的特色: 

一個檔案開啟的時候只能擁有一把鎖,就是在同時,不能給一個檔案同時分配兩個以上的鎖定。 

讀取已上鎖的檔案的使用者可以持有這把鎖,也就是持有這把鎖的使用者可以對該檔案進行對應的操作,如讀或寫。使用者可以申請持有某個文件鎖,如果文件開始無鎖,申請持有鎖之前先由系統為該文件創建了一把鎖,然後該申請者持有它。

持有鎖的規則:如果這個檔案已擁有一個讀(共享)鎖,其它使用者不能為該檔案分配排它鎖或唯讀鎖,但可以持有這把鎖,也就是說其它使用者可以讀文件,但只要該文件被鎖住,就沒有使用者可以對其進行寫入。如果該文件已有一把排它鎖且已為某用戶持有,則沒有任何用戶可以再持有這把鎖,除非持有者解鎖。

有一個重要的概念要記住:對文件的操作本身與鎖其實沒有什麼關係,無論文件是否被上鎖,用戶都可以隨意對文件進行正常情況下的任何操作,但操作系統會檢查鎖,針對不同的情況給予不同的處理。比如說在無鎖的情況下,任何人可以同時對某文件進行任意的讀寫,當然這樣很有可能讀寫的內容會出現錯誤——注意只是內容出錯,操作並不會出錯。加鎖後,某些操作在某些情況下會被拒絕。文件鎖的作用並不是保護文件及資料本身,而是保證資料的同步性,因此文件鎖只對持有鎖的使用者才是真正有效的,也只有所有使用者都使用同一種完全相同的方式利用文件鎖的限制對檔案進行操作,檔案鎖才能對所有使用者有效,否則,只要有一個例外,整個檔案鎖的功能就會被破壞。例如,所有人都遵循的開文件,加鎖,操作讀寫,解鎖,關閉文件的步驟的話,所有的人操作都不會出現問題,因為基於文件鎖的分配及持有原則,文件中的數據的更新是作為原子操作存在的,是不可分的,因此也是同步的,安全的。但假如某個人不是採取此步驟,那麼他在讀寫時就會出現問題,不是讀不準就是寫不進等等。 

基於上述原理,對讀取資料是否鎖定這點就值得說。一般來說,寫資料的時候排它鎖定是唯一的操作,它這時保證寫到文件中的資料是正確的,文件被鎖時,其它使用者無法得到該鎖,因此無權做任何操作。在讀的時候,要視具體情況而定,大多數情況下,如果不需要特別精確或是敏感的數據,無需鎖定,因為鎖定要花時間和資源,一個人申請持有鎖花不了時間,人一多就有問題了,最主要的是,如果該文件需要被更新的話,假如被上了只讀鎖,則寫入無法進行,因為那些想寫入的用戶將得不到排它鎖,如果同時申請持有隻讀鎖的人過多的話,排它鎖就有可能一直申請不到,這樣表現就是文件可能很長時間內無法被寫入,顯得很慢。一般來說,寫文件的機會相對較少,也更重要,因此主要做好排它鎖定,只讀鎖在多數情況下並無必要。那麼只讀鎖用在何處呢?只讀鎖其實只對使用者本身有用,只讀鎖定保證使用者讀到的資料是確實從檔案中讀到的真實數據,而不是被稱為「dirty」的髒數據。其實,這個還是針對那些不用鎖的其它用戶對文件的誤操作,假如文件上鎖,其它用戶不一定非要通過鎖對文件進行讀寫,如果他是直接讀寫的話,對上了鎖的文件操作不一定有效,持有讀鎖的使用者可以肯定在他讀取資料的時候讀出來的是從真實的檔案中得到的,而不是同時已被覆蓋掉的資料。 

因此,在寫入的時候上排它鎖應該是天經地義的,可以保證這時資料的不會出錯。如果你不申請共享鎖,可能讀出的數據有錯誤,但對文件本身沒有任何影響,影響只是對用戶的,申請共享鎖後讀出的數據肯定是當時讀的時候文件中的真實數據,如果不是為了確保資料的精確性,共享鎖可以不加,充其量就是重新讀一次,如果你讀它是為了寫入,不如直接加排它鎖,沒有必要用共享鎖。 

還有一點要強調的是:文件鎖只對使用它的用戶,而且是按規則使用它的用戶才有效,否則,你用你的,我用我的,有的用,有的不用,還是會亂套的,錯誤還是會出現的,對同一個文件,只有大家用同一個規則用文件鎖,才能保證每個用戶在對該文件進行共享操作的時候不會出現讀寫錯誤。 

以上是詳解PHP檔案讀寫鎖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles