2

我正在开发一个项目(使用 Symfony 2 用 PHP 编写的 Web 应用程序),其中需要记录各种与安全相关的事件。还要求日志文件中的事件连续编号(我想这不是那么容易删除项目)。

我将使用Monolog(包含在 Symfony 中)进行日志记录,并且我知道我可以使用处理器将数字添加到记录中。

然而,我不知道如何真正可靠地生成连续数字。我所说的“可靠”是指:没有间隙,也没有重复的数字。

我能想到的唯一解决方案是让数据库(通过 Doctrine 的 MySQL)通过使用具有自动增量 ID 的虚拟表来生成数字,但这似乎有点用于日志记录的开销。

对此还有哪些其他策略?

4

2 回答 2

2

您可以使用包含最后一个 id 的单个文件来模拟自动增量 id。锁可以防止竞争条件:

$fp = fopen('/path/to/id.file', 'r+');
flock($fp, LOCK_EX);
$lastId = fgets($fp);
$currentId = $lastId + 1;
fseek($fp, 0);
fputs($currentId);

// place logging here...

flock($fp, LOCK_UN);
于 2013-03-22T09:13:41.170 回答
0

如果您想写入文件,我想唯一可靠的是在写入新记录之前从该文件中读取最大数量 - 并在执行此操作时使用文件锁定以避免TOCTTOU问题。所以基本上是数据库事务为你做的事情,但是文件:-)

也许你不需要每次都锁定和读取整个日志文件——只将最后一个数字记录到一个单独的“计数器”文件中就足够了,并在读取最后一个数字时锁定它,写入日志文件并更新计数器文件中的数字。

于 2013-03-22T09:11:31.190 回答