是否有一种可移植的方法来为flock()设置超时?

Mar*_*sch 15 php timeout flock

flock()是PHP的便携式咨询文件锁定功能.他们明确宣传它甚至可以在windows下运行:

flock()允许您执行一个简单的读/写模型,几乎可以在每个平台上使用(包括大多数Unix衍生产品甚至Windows).

我想在阻塞上设置一个便携式超时flock()(并且没有忙于等待处理该LOCK_NB选项).在UNIX中,这可以简单地通过设置警报来实现,该警报将发送SIGALRM:

pcntl_signal(SIGALRM, function() {});
pcntl_alarm(3);
try {
    if (!flock($handle, LOCK_EX)) {
        throw new \Exception("Timeout");
    }
} finally {
    pcntl_alarm(0);
    pcntl_signal_dispatch();
    pcntl_signal(SIGALRM, SIG_DFL);
}
Run Code Online (Sandbox Code Playgroud)

是否有可移植的方法来阻止阻塞flock()?如果是这样,怎么样?

Ric*_*ich 3

我认为在 Windows 上没有繁忙的等待/轮询循环就没有任何方法可以做到这一点。

PHPflock在 Windows 上使用LockFileEx(参见 参考资料flock_compat.c:132)来实现。正如您从这些类似的问题中看到的,无法设置超时LockFileEx或取消等待请求的进程LockFileEx(即没有SIGALRM与此用例的信号等效的信号):

  1. LockFile 超时?(2011 年询问)

问)如果我想等待超时的文件锁定,我该怎么做?

...

A)编写一个小循环来检查返回码

  1. microsoft.public.win32.programmer.kernel邮件列表中的“LockFileEx 无法超时,它只是挂起” ,1997 年

问)有谁知道让 LockFileEx 超时的方法吗?

...

A)您只能让它立即失败、休眠并循环返回,直到达到某个重试限制。