2018年6月2日 星期六

php 檔案鎖定(檔案同步)

PHP flock() 函數

定義和用法

flock() 函數鎖定或釋放文件。
若成功,則返回 true。若失敗,則返回 false。

語法

flock(file,lock,block)
參數 描述
file 必需。規定要鎖定或釋放的已打開的文件。
lock 必需。規定要使用哪種鎖定類型。
block 可選。若設置為 1 或 true,則當進行鎖定時阻擋其他進程。

說明

flock() 操作的 file 必須是一個已經打開的文件指針。
lock 參數可以是以下值之一:
  • 要取得共享鎖定(讀取的程序),將 lock 設為 LOCK_SH(PHP 4.0.1 以前的版本設置為 1)。
  • 要取得獨佔鎖定(寫入的程序),將 lock 設為 LOCK_EX(PHP 4.0.1 以前的版本中設置為 2)。
  • 要釋放鎖定(無論共享或獨佔),將 lock 設為 LOCK_UN(PHP 4.0.1 以前的版本中設置為 3)。
  • 如果不希望 flock() 在鎖定時堵塞,則給 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中設置為 4)。

提示和註釋

提示:可以通過 fclose() 來釋放鎖定操作,代碼執行完畢時也會自動調用。
註釋:由於 flock() 需要一個文件指針, 因此可能不得不用一個特殊的鎖定文件來保護打算通過寫模式打開的文件的訪問(在 fopen() 函數中加入 "w" 或 "w+")。
-----------------------------------------------------------

例子

a_1.php>>

<?php

ob_start();

$filename = "a1.txt";

$file = fopen($filename, "r+");

$res = '';

// 排它性的锁定
if (flock($file, LOCK_EX)) {
    sleep(15);


    while(!feof($file)){
        $res .= fgets($file);
    }
    
    flock($file, LOCK_UN);
} else {
    echo "Error locking file!";
}

fclose($file);

printf('<p>finish(%s)</p>', $res);
----------------------------------------------------------- 

a_2.php>>

 <?php

ob_start();

$filename = "a1.txt";

$file = fopen($filename, "r+");

$res = '';

// 排它性的锁定
if (flock($file, LOCK_EX)) {
    
    while(!feof($file)){
        $res .= fgets($file);
    }
    
    flock($file, LOCK_UN);
} else {
    echo "Error locking file!";
}

fclose($file);

printf('<p>finish(%s)</p>', $res);