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

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
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应用程序,其中就包括对文件的处理。在这些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 12:12 PM

使用Golang实现文件锁的最佳实践在开发中,我们经常会遇到需要对文件进行加锁的情况,以保证文件在多个goroutine或进程间的并发访问时能够正确操作。在Golang中,实现文件锁并不复杂,这篇文章将介绍如何使用Golang实现文件锁的最佳实践,包含具体的代码示例。文件锁的作用文件锁是一种在操作系统层面对文件进行加锁的机制,它可以帮助我们在并发访问文件时确

如何在Golang中利用文件锁确保数据安全如何在Golang中利用文件锁确保数据安全Feb 28, 2024 pm 01:12 PM

标题:如何在Golang中利用文件锁确保数据安全在编程过程中,保证数据安全是至关重要的一环。在Golang中,为了确保数据操作的原子性和线程安全,我们经常会使用文件锁来实现对共享资源的访问控制。文件锁在操作系统层面上保证了进程间的互斥访问,从而避免了数据竞态和资源冲突问题。本文将介绍如何在Golang中利用文件锁确保数据安全,并提供具体的代码示例。1.文件

See all articles

熱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.能量晶體解釋及其做什麼(黃色晶體)
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
2 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
2 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

MantisBT

MantisBT

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

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

mPDF

mPDF

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