LOCK如何将日志写入平面文件?

时间:2012-05-29 02:58:04

标签: php concurrency fopen fwrite flat-file

读取平面文件的并发性几乎是无限的(如果我错了,请纠正我);但是写入的并发性如何?考虑在PHP中编写一个简单的访问日志(用于访问),以附加一行以\n

结尾的访问详细信息
fopen(); // in append mode
fwrite();
fclose();

由于我们有并发访问者,系统(一个用户是wbserver / php用户)如何同时写入视图日志?

我的困惑是:函数file_put_contents()(它是上述三个函数的包装)有一个锁定选项(LOCK_EX)?使用这种锁定选项是否有益?这将如何影响日志写作?

更新:我的问题是LOCK最初如何工作/影响将日志写入文件。我不比较file_put_contentsfwrite;甚至我的问题也不仅限于PHP。问题是在写入过程中锁定文件。

2 个答案:

答案 0 :(得分:3)

file_put_contents()确实有锁定选项,但在我看来,您应该使用flock()代替。

来自手册:

  

可用标志

     

<强> FILE_USE_INCLUDE_PATH
  在include目录中搜索filename。有关更多信息,请参阅include_path   信息。

     

<强> FILE_APPEND   如果文件filename已存在,请将数据附加到文件而不是覆盖它。

     

<强> LOCK_EX   在继续写作的同时获取文件的独占锁。

flock()允许您使用其他方法:

  

LOCK_SH 获取共享锁(读者)    LOCK_EX 获得一个   独家锁(作家)    LOCK_UN 以释放锁定(共享或   排斥)。

请参见此处:http://php.net/manual/en/function.flock.php和此处:http://php.net/manual/en/function.file-put-contents.php

答案 1 :(得分:0)

请注意,访问日志的文件锁定是一种可以轻松引入竞争条件的环境。也许看看另一种方法?记录到数据库,也许?设计良好的系统很容易尝试使用并行进程同时打开和写入日志。

也许看一下monolog?那里有一些日志记录处理程序用于异步日志记录,这对于访问日志记录的任何操作都是理想的。

https://github.com/Seldaek/monolog