5

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

fopen(); // in append mode
fwrite();
fclose();

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

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

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

4

2 回答 2

3

file_put_contents()确实有一个锁定选项,但在我看来,你应该使用它flock()

从手册:

可用标志

FILE_USE_INCLUDE_PATH
在包含目录中搜索文件名。有关详细信息,请参阅 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

于 2012-05-29T03:10:41.520 回答
0

请注意,访问日志的文件锁定是一个很容易引入竞争条件的环境。也许研究另一种方法?登录到数据库,也许?对于一个设计良好的系统来说,尝试使用并行进程同时打开和写入日志太容易了。

也许看看独白?那里有一些用于异步日志记录的日志记录处理程序,这对于与访问日志记录有关的任何事情都是理想的。

https://github.com/Seldaek/monolog

于 2012-05-29T03:25:00.567 回答