flock 参数
- LOCK_SH取得共享锁定(读取的程序)
- LOCK_EX 取得独占锁定(写入的程序)
- LOCK_UN 释放锁定(无论共享或独占)
- LOCK_NB 在锁定时不堵塞(Windows 上还不支持)
php5.3.2后,在文件资源句柄关闭时不再自动解锁。现在要解锁必须手动进行。
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"); // 写入数据
sleep(10); // sleep 10秒,文件被锁定
fwrite($fp, "Hello PHP\r\n"); // 写入数据
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"); // 写入数据
fwrite($fp, "Show Me The Money\r\n"); // 写入数据
flock($fp, LOCK_UN); // 解锁
}
fclose($fp);
先执行a.php,然后执行b.php,b需要等待a执行完,才能写入数据,阻塞
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"); // 写入数据
fwrite($fp, "Show Me The Money\r\n"); // 写入数据
flock($fp, LOCK_UN); // 解锁
}else{
echo 'file locked';
}
fclose($fp);
先执行a.php,然后执行b.php,b取不到独占锁,不需要等待a执行完,而是直接返回取不到锁提示,非阻塞
网友评论