PHP flock()文件鎖定函數(shù)

flock 參數(shù)

  • LOCK_SH取得共享鎖定(讀取的程序)
  • LOCK_EX 取得獨占鎖定(寫入的程序)
  • LOCK_UN 釋放鎖定(無論共享或獨占)
  • LOCK_NB 在鎖定時不堵塞(Windows 上還不支持)

php5.3.2后,在文件資源句柄關閉時不再自動解鎖。現(xiàn)在要解鎖必須手動進行。

LOCK_SH共享鎖不阻塞

LOCK_EX 獨占鎖阻塞

a.php

<?php
$file = 'test.txt';
$fp = fopen($file, 'a');
 
if(flock($fp, LOCK_EX)){              // 取得獨占鎖
    fwrite($fp, "Hello World\r\n");   // 寫入數(shù)據(jù)
    sleep(10);                                // sleep 10秒,文件被鎖定
    fwrite($fp, "Hello PHP\r\n");     // 寫入數(shù)據(jù)
    flock($fp, LOCK_UN);              // 解鎖
}
 
fclose($fp);

b.php

<?php
$file = 'test.txt';
$fp = fopen($file, 'a');
 
if(flock($fp, LOCK_EX)){                              // 取得獨占鎖
    fwrite($fp, "How Are You\r\n");                 // 寫入數(shù)據(jù)
    fwrite($fp, "Show Me The Money\r\n");    // 寫入數(shù)據(jù)
    flock($fp, LOCK_UN);                              // 解鎖
}
 
fclose($fp);

先執(zhí)行a.php,然后執(zhí)行b.php,b需要等待a執(zhí)行完,才能寫入數(shù)據(jù),阻塞

LOCK_NB 鎖定時不阻塞,不等待

修改b.php


<?php
$file = 'test.txt';
$fp = fopen($file, 'a');
 
if(flock($fp, LOCK_EX|LOCK_NB)){            // 取得獨占鎖
    fwrite($fp, "How Are You\r\n");         // 寫入數(shù)據(jù)
    fwrite($fp, "Show Me The Money\r\n");   // 寫入數(shù)據(jù)
    flock($fp, LOCK_UN);                    // 解鎖
}else{
    echo 'file locked';
}
 
fclose($fp);

先執(zhí)行a.php,然后執(zhí)行b.php,b取不到獨占鎖,不需要等待a執(zhí)行完,而是直接返回取不到鎖提示,非阻塞

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容