读取平面文件的并发性几乎是无限的(如果我错了,请纠正我);但是写入的并发性如何?考虑在PHP中编写一个简单的访问日志(用于访问),以附加一行以\n
fopen(); // in append mode
fwrite();
fclose();
由于我们有并发访问者,系统(一个用户是wbserver / php用户)如何同时写入视图日志?
我的困惑是:函数file_put_contents()
(它是上述三个函数的包装)有一个锁定选项(LOCK_EX
)?使用这种锁定选项是否有益?这将如何影响日志写作?
更新:我的问题是LOCK
最初如何工作/影响将日志写入文件。我不比较file_put_contents
和fwrite
;甚至我的问题也不仅限于PHP
。问题是在写入过程中锁定文件。
答案 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?那里有一些日志记录处理程序用于异步日志记录,这对于访问日志记录的任何操作都是理想的。