重命名PHP不断编写的文件是否安全?

时间:2017-11-27 00:39:06

标签: php python concurrency filesystems

PHP不断将文本附加到文件foo.log,模式为"a"。我想在python中读取foo.log的内容并截断已读取的行,同时避免python和PHP之间的并发访问问题。

This answer表示os.rename在大多数平台上都是原子的。因此,通过简单地将foo.log重命名为bar.log然后将bar.log读入python来实现我的目标是否安全?或者我是否需要实现更复杂的解决方案,例如共享锁文件?

1 个答案:

答案 0 :(得分:1)

如果你fopen,可能不会。我用于日志的是

file_put_contents( $filename, $data, FILE_APPEND|LOCK_EX);

这样你就没有一个开放的资源句柄,并且如果在写入时不存在,它将创建一个文件。

我用fwrite尝试了一次,大约有15个不同的进程都记录了东西,最后有一半NUL垃圾文件。所以我开始使用它。

http://php.net/manual/en/function.file-put-contents.php

  
      
  • FILE_USE_INCLUDE_PATH 在include目录中搜索文件名。有关更多信息,请参阅include_path。

  •   
  • FILE_APPEND 如果文件文件名已存在,请将数据附加到文件中,而不是覆盖它。

  •   
  • LOCK_EX 在继续写入的同时获取文件的独占锁定。换句话说,在fopen()调用和fwrite()调用之间发生flock()调用。这与使用模式" x"的fopen()调用不同。

  •