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í)行完,而是直接返回取不到鎖提示,非阻塞