程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP 如何使用文件鎖

PHP 如何使用文件鎖

編輯:關於PHP編程

//WRITE
$fp = fopen("test.txt", ab);              //From the end
flock($fp, LOCK_EX);                        //lock the file for waiting...
fwrite($fp, Just A Test String.......);   //Start writing...
flock($fp, LOCK_UN);                        //Release write lock
fclose($fp);                                //Close the file讀操作:

//READ
$fp = fopen("test.txt", r);
flock($fp, LOCK_SH);
//Read from the file.......
flock($fp, LOCK_UN);
fclose($fp);來詳細的看看 PHP 手冊上面關於函數 flock 的介紹吧:

flock -- 輕便的咨詢文件鎖定

其函數原型為:bool flock ( int handle, int operation [, int &wouldblock] )

PHP 支持以咨詢方式(也就是說所有訪問程序必須使用同一方式鎖定, 否則它不會工作)鎖定全部文件的一種輕便方法,需要注意的地方是:在 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。

來看看 PHP manual 上面經典的實例:

<?php

$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // 進行排它型鎖定
    fwrite($fp, "Write something here ");
    flock($fp, LOCK_UN); // 釋放鎖定
} else {
    echo "Couldnt lock the file !";
}

fclose($fp);

?> 注意: 由於 flock() 需要一個文件指針, 因此可能不得不用一個特殊的鎖定文件來保護打算通過寫模式打開的文件的訪問(在 fopen() 函數中加入 "w" 或 "w+")。

注意:

flock() 不能用於 NFS 以及其它一些網絡文件系統。詳細資料查看自己操作系統的文檔。

在部分操作系統中 flock() 以進程級實現。當用一個多線程服務器 API(比如 ISAPI)時,可能不可以依靠 flock() 來保護文件,因為運行於同一服務器實例中其它並行線程的 PHP 腳本可以對該文件進行處理。

flock() 不支持舊的文件系統,如 FAT 以及它的派生系統。因此,此環境下總是返回 FALSE(尤其是對 Windows

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved