我正在开发一个项目(使用Symfony 2用PHP编写的Web应用程序),其中要求记录各种与安全相关的事件。还要求日志文件中的事件连续编号(我猜这样不容易删除项目)。
我将使用Monolog(包含在Symfony中)进行日志记录,我知道我可以使用处理器将数字添加到记录中。
我不知道的是如何实际可靠地生成连续数字。 “可靠”是指:没有间隙,没有重复的数字。
我能想到的唯一解决方案是让数据库(MySQL via Doctrine)通过使用带有自动增量ID的虚拟表来生成数字,但这似乎是一些记录开销。
有什么其他策略?
答案 0 :(得分: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);
答案 1 :(得分:0)
如果你想写一个文件,我想唯一可靠的是在写一个新记录之前从这个文件中读取最大数字 - 并在执行时使用文件锁定以避免TOCTTOU问题。所以基本上数据库事务为你做的事情,但文件: - )
也许你不需要每次都锁定和读取整个日志文件 - 它也足以将最后一个数字记录到一个单独的“计数器”文件中,并在读取最后一个数字时将其锁定,写入到日志文件并更新计数器文件中的数字。