如果其他进程锁定了文件,如何使flock块


How to make flock block if other process locked the file?

我有一个JavaScript应用程序,它将消息发布到服务器。我必须在服务器端收集这些消息,然后进行分析,所以我只是将它们写入文件。问题是,当我打开文件进行阅读时,即在记事本中,消息没有被写入。由于flock()是阻塞的,并且锁在Windows上应该是强制性的,我希望脚本只需等待,直到我关闭文件,然后保存所有挂起的消息,但它似乎不起作用。有没有办法确保所有消息最终都会保存到文件中,即使其他进程获得了对该文件的独占访问权限?即使有人打开文件进行阅读或复制,我也不会丢失任何消息。我可以用PHP实现吗?或者我应该把消息发送到数据库?PHP版本是7.0.4,我的脚本如下:

$f = fopen('log.csv', 'a+');
flock($f, LOCK_EX);
$text = date('Y-m-d H:i:s'). ";" .htmlspecialchars($_POST["message"]). PHP_EOL;
clearstatcache();
fwrite($f, $text);
fflush($f);
flock($f, LOCK_UN);
fclose($f);
?>

flock如果成功则返回true,如果失败则返回false。

while(!flock($f, LOCK_EX)) {
  sleep(5);
}

如果另一个进程长时间锁定脚本,这不会解决脚本超时的问题。在这种情况下,您可能需要关闭该文件,然后尝试打开其他文件名。