该flock()
函数旨在处理文件操作的多个并发读写器;默认情况下,flock()
可以暂停一个进程,直到可以获得兼容的锁(即共享或独占)。一旦获得,稍后可以释放锁以允许其他进程对该文件进行操作;当文件关闭或进程结束时,锁会被隐式释放。
除非您的文件在 NFS 上,否则我非常怀疑您是否会遇到同时给出两个冲突锁的情况。
下面说明了使用的基本示例flock()
:
// open the file (take care to not use "w" mode)
$f = fopen('file.txt', 'r+');
// obtain an exlusive lock (may suspend the process)
if (flock($f, LOCK_EX)) {
// this process now holds the only exclusive lock
// make changes to the file
// release the lock
flock($f, LOCK_UN);
}
// don't perform any write operation on $f here
fclose($f);
将LOCK_NB
标志与LOCK_EX
或一起使用LOCK_SH
会阻止进程暂停;如果调用返回false
,则可以传递第三个参数来确定进程是否会被挂起(在 Windows 上不支持)。
if (false === flock($f, LOCK_EX | LOCK_NB, $wouldblock)) {
if ($wouldblock) {
// the lock could not be obtained without suspending the process
} else {
// the lock could not be obtained due to an error
}
}