在PHP中使用flock
给文件加锁,如果直接加锁可以成功,
$fp = fopen('/tmp/test.pid', 'a');
if (flock($fp, LOCK_EX | LOCK_NB)) {
$pid = posix_getpid();
ftruncate($fp, 0);
fwrite($fp, $pid);
fflush($fp);
echo '加锁成功';
sleep(10);
} else {
echo '加锁失败';
}
运行上面的代码会出现预期的情况,在第一个进程没有退出的时候,第二个进程会加锁失败。
但是如果把加锁的操作放到函数中,加锁操作会一直成功
function lock()
{
$fp = fopen('/tmp/test.pid', 'a');
if (flock($fp, LOCK_EX | LOCK_NB)) {
$pid = posix_getpid();
ftruncate($fp, 0);
fwrite($fp, $pid);
fflush($fp);
return true;
} else {
return false;
}
}
if (lock) {
echo '加锁成功';
sleep(10);
} else {
echo '加锁失败';
}
谁能解释一下这是为什么吗
因为$fp变量没有引用了,所以被回收了。回收时触发洗狗函数。解锁了文件