Php flock()返回FALSE的原因是什么?

Php flock()返回FALSE的原因是什么?,php,Php,PHP手册说,如果锁定成功,调用flock将返回TRUE,否则返回FALSE。若文件被其他进程阻塞,那个么flock应该等到它被解锁(因为我们不使用LOCK_NB)。文档中没有超时,超时会中断等待,所以显然flock将无限等待,直到获得锁为止 但有时我在我的多线程脚本中从flock()得到了FALSE。原因是什么?我最近也有类似的问题,并做了一个小调查。如果查看,您可以看到实现依赖于编译代码的操作系统 对于*nix系统,有: ret = fcntl(fd, operation & LOC

PHP手册说,如果锁定成功,调用flock将返回TRUE,否则返回FALSE。若文件被其他进程阻塞,那个么flock应该等到它被解锁(因为我们不使用LOCK_NB)。文档中没有超时,超时会中断等待,所以显然flock将无限等待,直到获得锁为止


但有时我在我的多线程脚本中从flock()得到了FALSE。原因是什么?

我最近也有类似的问题,并做了一个小调查。如果查看,您可以看到实现依赖于编译代码的操作系统

对于*nix系统,有:

ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
这意味着使用了操作系统级fcntl功能

说:

F_SETLKW(结构群集*)

至于F_SETLK,但是如果文件上有冲突的锁,则等待该锁被释放如果在等待时捕捉到信号,则呼叫会中断,并且(在信号处理程序返回后)会立即返回(返回值为-1,errno设置为EINTR;请参阅信号(7))


另一个原因可能是php.ini中的“安全”限制

因此,也可以使用
phpinfo()
检查
flock
是否列在
disabled_functions
列表中:


可能是因为“所有访问程序都必须使用相同的锁定方式,否则它将无法工作”?如果没有获得锁定的原因,而不是“它已经被获取”,例如“操作系统不允许我检查文件是否被锁定”。如果您不想获得任何东西,则结果将为False(不太可能回答你)猜测,你必须给出更多的细节,比如你的操作系统,你试图
flock()
的资源类型,并进一步澄清你所说的“某个时候”是什么意思.multi-threaded PHP?虽然它可能非常不寻常,但在这种情况下,您竟然以如此随意的方式提及它,这是很奇怪的。特别是当它经常与异步I/O(这会使锁定更加复杂)同时出现时。您能澄清一下您用于多线程的扩展吗?我使用pcntl_fork()在FreeBSD下,我想知道一般情况下,如果flock应该等待锁释放,那么怎么可能会出错。