首頁 php教程 php手册 PHP flock 檔案鎖定詳細介紹_php基礎

PHP flock 檔案鎖定詳細介紹_php基礎

May 16, 2016 am 09:00 AM
flock 文件鎖

flock
(PHP 4, PHP 5)

flock — 輕便的諮詢文件鎖定

說明
bool flock ( int $handle , int $operation [, int &$wouldblock ] )
PHP 支援以諮詢方式(也就是說所有存取程式必須使用相同方式鎖定, 否則它不會工作)鎖定全部檔案的一種輕便方法。

Note:

在 Windows 下 flock() 將會強制執行。

flock() 操作的 handle 必須是一個已經開啟的檔案指標。 operation 可以是下列值之一:


要取得共用鎖定(讀取的程式),將 operation 設為 LOCK_SH(PHP 4.0.1 先前的版本設為 1)。
要取得獨佔鎖定(寫入的程式),將 operation 設為 LOCK_EX(PHP 4.0.1 先前的版本設定為 2)。
要釋放鎖定(無論共用或獨佔),將 operation 設為 LOCK_UN(PHP 4.0.1 先前的版本中設為 3)。
如果不希望 flock() 在鎖定時堵塞,則給 operation 加上 LOCK_NB(PHP 4.0.1 以前的版本中設定為 4)。

flock() 允許執行一個簡單的可以在任何平台中使用的讀取/寫入模型(包括大部分的 Unix 派生版和甚至是 Windows)。如果鎖定會阻塞的話(EWOULDBLOCK 錯誤碼情況下),可選的第三個參數會被設定為 TRUE。鎖定操作也可以被 fclose() 釋放(程式碼執行完畢時也會自動呼叫)。

成功時回傳TRUE, 或失敗時回傳FALSE.


Example #1 flock() 範例

複製程式碼程式碼如下:

$fp = fopen("/tmp/lock.txt", "w ");
if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
fwrite($fp, "Write something here ");
flock($fp, LOCK_UN); // 釋放鎖定} else {
echo "Couldn't lock the file !";
}
fclose($fp);
?>

Note:

由於flock() 需要一個檔案指針, 因此可能不得不用一個特殊的鎖定檔案來保護打算透過寫入模式開啟的檔案的存取(在fopen() 函數中加入"w " 或"w ")。

Warning
flock() 不能用於 NFS 以及其它一些網路檔案系統。詳細資料查看自己作業系統的文件。
在部分作業系統中 flock() 以行程級實作。當用一個多執行緒伺服器 API(例如 ISAPI)時,可能不可以依靠 flock() 來保護文件,因為運行於同一伺服器實例中其它並行執行緒的 PHP 腳本可以對該文件進行處理。
flock() 不支援舊的檔案系統,如 FAT 以及它的衍生系統。因此,在此環境下總是會傳回 FALSE(尤其是對 Windows 98 使用者來說)。

php中檔案鎖定函數flock函數用法簡介:

語法:

bool flock ( int $handle , int $operation [, int &$wouldblock ] )
flock() 操作的handle 必須是一個已經打開的檔案指標。 operation 可以是以下值之一:
1. 要取得共享鎖定(讀取程式),將operation 設為LOCK_SH(PHP 4.0.1 先前的版本設為1)
2. 要取得獨佔鎖定(寫入程式),將operation 設為LOCK_EX(PHP 4.0.1 先前的版本中設為2)
3. 要釋放鎖定(無論共用或獨佔),將operation 設為LOCK_UN(PHP 4.0.1 以前的版本中設定為3)
4. 如果你不希望flock() 在鎖定時堵塞,則給operation 加上LOCK_NB(PHP 4.0.1 以前的版本中設定為4)

看下面代碼:

a.php
複製程式碼 程式碼如下:

$file = “temp.txt”;
$fp = fopen($file , 'w');
if(flock($fp , LOCK_EX)){
fwrite( $fp , “abc”);
sleep(10);
fwrite($fp , “123”);
flock($fp , LOCK_UN);
}
fclose($ fp);
?>

b.php
複製程式碼 程式碼如下:

$file = “temp.txt”;
$fp = fopen($file , 'r');
echo fread($fp , 100);
fclose($fp);
?>

運行a.php 後,馬上運行b.php ,可以看到輸出:
abc
等a.php 運行完後運行b.php ,可以看到輸出:
abc
123
顯然,當a.php 寫檔案時資料太大,導致時間比較長時,這時b.php 讀取資料不完整,在對b.php做修改
修改b.php 為:
複製程式碼 程式碼如下:

$file = “ temp.txt」;
$fp = fopen($file , 'r');
if(flock($fp , LOCK_EX)){
echo fread($fp , 100);
flock($fp , LOCK_UN);
} else{
echo “Lock file failed…”;
}
fclose($fp);
?>

運行a.php 後,馬上運行b.php ,可以發現b.php 會等到a.php 運行完成後(即10 秒後)才顯示:
abc
123
讀取資料完整,但時間過長,他要等待寫鎖釋放,再對b.php做修改。
修改b.php 為:
複製程式碼 程式碼如下:

php
$file = “temp.txt”;
$fp = fopen($file , 'r');
if(flock($fp , LOCK_SH | LOCK_NB)){
echo fread ($fp , 100);
flock($fp , LOCK_UN);
} else{
echo “Lock file failed…”;
}
fclose($fp);
?>

運行a.php 後,馬上運行b.php ,可以看到輸出:
Lock file failed…
證明可以回傳鎖定檔案失敗狀態,而不是向上面一樣要等很久。
腳本之家小編結論:
建議作檔案快取時,選好相關的鎖,不然可能導致讀取資料不完整,或重複寫入資料。
file_get_contents 好像選擇不了鎖,不知道他預設用的什麼鎖,反正和不鎖得到的輸出一樣,是不完整的資料。
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡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.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 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)

Go語言中如何處理並發檔案的檔案系統檔案鎖定和進程間檔案共用問題? Go語言中如何處理並發檔案的檔案系統檔案鎖定和進程間檔案共用問題? Oct 09, 2023 pm 05:53 PM

Go語言中處理並發檔案的檔案系統檔案鎖定和進程間檔案共享問題引言:在Go語言中,我們常常需要處理並發存取檔案的情況,包括檔案系統檔案鎖定和進程間檔案共用。本文將介紹如何使用Go語言處理這些問題,並提供具體的程式碼範例。一、檔案系統檔案鎖在多個並發程式同時存取同一個檔案時,為了避免出現競爭條件和資料不一致的問題,我們可以使用檔案系統檔案鎖定來進行同步。 Go語言提供了s

Linux 中的檔案鎖定指令:flock、fcntl、lockfile、flockfile 詳細教學! Linux 中的檔案鎖定指令:flock、fcntl、lockfile、flockfile 詳細教學! Feb 23, 2024 pm 09:01 PM

在Linux中,有幾種常用的檔案鎖定指令,包括flock、fcntl、lockfile和flockfile。這些命令用於在多進程或多執行緒環境中對檔案進行互斥存取。以下是這些指令的詳細教學:flock指令:flock指令可以在Shell腳本中使用,用於對檔案進行獨佔鎖定。使用以下語法來鎖定檔案:flock[選項]檔案名稱命令例如,要鎖定名為file.txt的檔案並執行命令,可以執行以下命令:flockfile.txtls-lflock命令會在執行命令期間鎖定文件,並在指令完成後自動釋放鎖定。 fcnt

PHP中的檔案鎖 PHP中的檔案鎖 May 23, 2023 am 08:15 AM

PHP是一門廣泛使用的程式語言,被用來開發大量的Web應用程序,其中就包括對檔案的處理。在這些網路應用程式中,有時需要避免並發存取同一個文件,以防止資料出現衝突。而文件鎖就是一種解決並發存取的方案。文件鎖是一種機制,用於防止多個進程或執行緒同時存取同一個檔案。當一個程序鎖住了一個文件,在它沒有釋放鎖之前,其他程序是不能存取這個文件的。這種鎖的使用能夠確保文件

Golang實作檔案鎖的原理及應用 Golang實作檔案鎖的原理及應用 Feb 29, 2024 am 09:54 AM

Golang實作檔案鎖的原理及應用在作業系統中,檔案鎖是一種用來保護檔案或資源不被多個行程同時存取或修改的機制。在Golang中,透過使用sync套件提供的Mutex鎖可以實現對記憶體中的資料結構進行加鎖,但當涉及到多個進程對同一個檔案進行讀寫操作時,則需要使用檔案鎖來確保資料的一致性和安全性。文件鎖的類型在Golang中,可以使用os包提供的File結構體的F

Java 檔案操作進階技巧:提升開發效率 Java 檔案操作進階技巧:提升開發效率 Feb 27, 2024 pm 12:25 PM

1.高效率文件讀取使用BufferedReader/BufferedWriter提高讀寫效率:BufferedReader和BufferedWriter是高效率的字元流,能夠一次讀取或寫入一行文本,比直接使用InputStream或OutputStream更有效率。 BufferedReaderreader=newBufferedReader(newFileReader("file.txt"));BufferedWriterwriter=newBufferedWriter(newFileWriter("

檔案鎖在Golang程式設計中的重要性及使用方法 檔案鎖在Golang程式設計中的重要性及使用方法 Feb 28, 2024 pm 04:15 PM

檔案鎖在Golang程式設計中的重要性及使用方法在多執行緒的程式設計中,檔案的讀寫操作是非常常見的。在並發程序中,如果多個goroutine同時對一個文件進行讀寫操作,很容易導致文件內容的混亂或資料的遺失。為了避免這種情況,我們可以使用文件鎖來確保文件操作的原子性和安全性。本文將介紹在Golang程式設計中檔案鎖的重要性以及具體的使用方法,同時提供一些程式碼範例。文件

如何在Golang中利用檔案鎖確保資料安全 如何在Golang中利用檔案鎖確保資料安全 Feb 28, 2024 pm 01:12 PM

標題:如何在Golang中利用檔案鎖確保資料安全在程式設計過程中,確保資料安全是至關重要的一環。在Golang中,為了確保資料操作的原子性和執行緒安全,我們經常使用檔案鎖來實現對共享資源的存取控制。檔案鎖在作業系統層面上保證了進程間的互斥訪問,從而避免了資料競態和資源衝突問題。本文將介紹如何在Golang中利用檔案鎖確保資料安全,並提供具體的程式碼範例。 1.文件

使用Golang實現文件鎖的最佳實踐 使用Golang實現文件鎖的最佳實踐 Feb 28, 2024 pm 12:12 PM

使用Golang實現檔案鎖的最佳實踐在開發中,我們經常會遇到需要對檔案進行加鎖的情況,以確保檔案在多個goroutine或進程間的並發存取時能夠正確操作。在Golang中,實作檔案鎖定並不復雜,這篇文章將介紹如何使用Golang實現檔案鎖的最佳實踐,包含具體的程式碼範例。檔案鎖的作用檔案鎖是一種在作業系統層級對檔案進行加鎖的機制,它可以幫助我們在並發存取檔案時確

See all articles