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

时间:2016-03-18 12:16:48

标签: php

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

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

2 个答案:

答案 0 :(得分:2)

我最近遇到过类似的问题并进行了一项小型研究。如果查看source code of the PHP flock function,您可以看到实现取决于编译代码的操作系统。

对于* nix系统,有:

ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);

表示使用OS级别的fcntl函数。

Manual for fcntl说:

  

F_SETLKW(struct flock *)

     

对于F_SETLK,但如果文件上存在冲突的锁,则等待释放该锁。 如果在等待时捕获到信号,则调用中断并且(在信号处理程序返回后)立即返回(返回值为-1,错误号设置为EINTR;请参阅signal(7))。

答案 1 :(得分:0)

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

因此,请与phpinfo()核对flock列表中是否列出disabled_functions

Example of phpinfo() with disabled flock function