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函数.
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)).