首頁  >  文章  >  資料庫  >  關於php flock 使用實例的講解

關於php flock 使用實例的講解

jacklove
jacklove原創
2018-06-09 11:04:432705瀏覽

php flock 使用實例

bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

#flock()允許執行一個簡單的可以在任何平台中使用的讀取/寫入模型(包括大部分的Unix衍生版和windows)

在PHP 5.3.2版本之前,鎖定會被fclose()

## (在腳本結束後會自動呼叫),現在需要手動解鎖

operation

1. LOCK_SH 取得共享鎖定(讀取的程式)

2.LOCK_EX 取得獨佔鎖定(寫入的程式)

#3.LOCK_UN 釋放鎖定(無論共享或獨佔)

4.LOCK_NB 在flock()鎖定時不阻塞

實例1:A使用獨佔鎖定文件,B讀取文件,阻塞

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;w&#39;);
if(flock($fp, LOCK_EX)){            // 取得独占锁
    fwrite($fp, "Hello World\r\n"); // 写入数据
    sleep(10);                      // sleep 10秒,文件被锁定
    fwrite($fp, "Hello PHP\r\n");   // 写入数据
    flock($fp, LOCK_UN);            // 解锁
}
fclose($fp);
?>

b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得贡献锁
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>
先執行a .php,然後執行b.phpa取得獨佔鎖,b只能等待,等a執行完解除鎖定後才能執行b,

阻塞

實例2:A,B都使用共享鎖定,不阻塞

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得共享锁
    sleep(10);           // sleep 10秒
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>

b.php

6881d79e58a19bf081508955ca08811c
先執行a .php,然後執行b.phpb不需要等待a執行完就能輸出檔案內容,

非阻塞

實例3:A,B都使用獨佔鎖寫文件,阻塞

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX)){            // 取得独占锁
    fwrite($fp, "Hello World\r\n"); // 写入数据
    sleep(10);                      // sleep 10秒,文件被锁定
    fwrite($fp, "Hello PHP\r\n");   // 写入数据
    flock($fp, LOCK_UN);            // 解锁
}
fclose($fp);
?>


b.php

#
<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX)){                    // 取得独占锁
    fwrite($fp, "How Are You\r\n");         // 写入数据
    fwrite($fp, "Show Me The Money\r\n");   // 写入数据
    flock($fp, LOCK_UN);                    // 解锁
}
fclose($fp);
?>

##先執行a.php,然後執行b.phpb需要等待a執行完,才能寫入數據,

阻塞

實例4:LOCK_NB 鎖定時不阻塞,不等待

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX)){            // 取得独占锁
    fwrite($fp, "Hello World\r\n"); // 写入数据
    sleep(10);                      // sleep 10秒,文件被锁定
    fwrite($fp, "Hello PHP\r\n");   // 写入数据
    flock($fp, LOCK_UN);            // 解锁
}
fclose($fp);
?>

b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX|LOCK_NB)){            // 取得独占锁
    fwrite($fp, "How Are You\r\n");         // 写入数据
    fwrite($fp, "Show Me The Money\r\n");   // 写入数据
    flock($fp, LOCK_UN);                    // 解锁
}else{
    echo &#39;file locked&#39;;
}
fclose($fp);
?>

先執行a.php,然後執行b.php b取不到獨佔鎖定,不需要等待a執行完,而是直接回傳取不到鎖定提示,

非阻塞

總結:

使用共享鎖定

LOCK_SH,如果是讀取,不需要等待,但如果是寫入,需要等待讀取完成。

使用獨佔鎖定

LOCK_EX,無論寫入/讀取都需要等待。

LOCK_UN,無論使用共用/讀取佔鎖,使用完後需解鎖。

LOCK_NB,當被鎖定時,不阻塞,而是提示鎖定。

######本文解釋了關於php flock 使用實例,更多相關內容請關注php中文網。 ######

相關推薦:

php str_replace 取代指定次數方法的解說

關於header,headers_sent,headers_list,header_remove 使用說明

透過PDO 查詢mysql傳回欄位整數變成String型的解決方法

#

以上是關於php flock 使用實例的講解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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