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

时间:2016-11-20 23:12:37

标签: 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);
}

是否有一种可移植的方法可以在阻止flock()上设置超时?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

我认为在没有繁忙的等待/轮询循环的情况下,没有办法在Windows上执行此操作。

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

  1. LockFile with timeout?(2011年询问)
  2.   

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

         

    ...

         

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

    1. "LockFileEx can't time out it just hangs"来自microsoft.public.win32.programmer.kernel邮件列表,1997
    2.   

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

           

      ...

           

      A)你只能让它失败,睡眠和循环   直到达到某个重试限制。