我正在尝试一种简单的算法:
File1:(lock.php)
File2:(lockstatus.php)
我的代码实现:
Lock.php :
<?php
$f = fopen("key",'a');
if (flock($f, LOCK_EX | LOCK_NB)) {
echo "File Locked. For Next 60 Seconds\n";
sleep(60);
var_dump(flock($f, LOCK_UN)); //release lock
echo "lock released";
} else {
echo "blocked";
}
?>
Lockstatus.php
<?php
do {
echo "\n";
$f = fopen("key",'a');
if ($f) {
echo "Readable\n";
fclose ($f);
} else {
echo "Blocked! I am waiting\n";
sleep(10);
}
} while (!$f); //wait until fopen does not work
?>
问题:
即使已应用flock
,Lockstatus.php
也可以打开该文件。
问题:
Lockstatus.php
锁定文件时,如何屏蔽Lock.php
处的文件?
答案 0 :(得分:2)
问题是flock()
仅提供咨询锁定。另一个程序可能会完全忽略这一点并继续fopen和fread或其他任何东西。关键是在执行flock
之后在Lockstatus.php中使用fopen
来检查是否存在锁定。 Lockstatus.php中的flock
会失败,然后您就会知道存在锁定。
答案 1 :(得分:1)
这个函数flock()在linux和windows上有不同的行为。
深入了解PHP文档中的“Notes”。这可能是你的问题。
之后,注意r +参数,读取+锁定是必需的。
$fp = fopen('/tmp/lock.txt', 'r+');
它不适用于 a 。