PHP手册说,如果锁定成功,调用flock将返回TRUE,否则返回FALSE。如果文件被其他进程阻止,那么flock应该等到它被解除阻塞(因为我们不使用LOCK_NB)。文档中的超时没有任何内容可以中断等待,所以很明显flock会无限期地等待直到获得锁定。
但有时我在多线程脚本中从flock()获得FALSE。这是什么原因?
答案 0 :(得分:2)
我最近遇到过类似的问题并进行了一项小型研究。如果查看source code of the PHP flock function,您可以看到实现取决于编译代码的操作系统。
对于* nix系统,有:
ret = fcntl(fd, operation & LOCK_NB ? F_SETLK : F_SETLKW, &flck);
表示使用OS级别的fcntl函数。
F_SETLKW(struct flock *)
对于F_SETLK,但如果文件上存在冲突的锁,则等待释放该锁。 如果在等待时捕获到信号,则调用中断并且(在信号处理程序返回后)立即返回(返回值为-1,错误号设置为EINTR;请参阅signal(7))。
答案 1 :(得分:0)