有没有一种可移植的方法可以在flock()上放置超时?

2022-08-30 23:46:46

flock() 是 PHP 的可移植咨询文件锁定功能。他们明确地宣传它甚至可以在Windows下工作:

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

我想在阻塞上放置一个便携式超时(并且没有忙于等待该选项的工作)。在UNIX中,这可以通过设置警报来实现,该警报将发送:flock()LOCK_NBSIGALRM

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);
}

有没有一种便携式方法可以对阻塞进行超时?如果是这样,如何?flock()


答案 1

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

PHP使用LockFileEx在Windows上实现flock(参见flock_compat.c:132)。从这些类似的问题中可以看出,没有办法设置超时或取消等待请求的进程(即,对于此用例,没有等效的信号):LockFileExLockFileExSIGALRM

  1. 锁定文件是否超时?(问2011)

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

...

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

  1. “LockFileEx不能超时它只是挂起”,来自邮件列表,1997年microsoft.public.win32.programmer.kernel

问)有没有人知道一种方法让LockFileEx超时?

...

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


答案 2

推荐