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

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

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

最佳答案 我最近遇到过类似的问题并进行了一项小型研究.如果你看一下
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 *)

As for F_SETLK, but if a conflicting lock is held on the file, then wait for that lock to be released. If a signal is caught while waiting, then the call is interrupted and (after the signal handler has returned) returns immediately (with return value -1 and errno set to EINTR; see signal(7)).

点赞