如果其他进程锁定文件,如何制作flock块?

时间:2016-04-14 22:43:21

标签: php flock

我有一个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);

?>

1 个答案:

答案 0 :(得分:0)

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

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

如果其他进程已将其锁定很长时间,则无法解决脚本超时的问题。在这种情况下,您可能希望关闭该文件并尝试打开另一个文件名。