2011-12-15 69 views
0

我有一个每日一次运行的代码和fputs()的附加格式每天日志条目到一个平面文件:如何编写与最近的记录先申请

yyyy-mm-dd|log entry 

该文件,然后通过显示fgets()并显示从最旧到最新的所有记录的网页。

我需要做的是改变,使该读/写过程:

A.只有X最近的记录都保存在日志文件中。

B.输出顺序相反,最先显示最近的日志条目。

如果日志文件的顺序可以通过写操作反转,则读操作可以保持不变。

如果还有更好的方式来做到这一点,比fputs和fgets,我很乐意。

感谢

+0

[需要用PHP开始写文件](http://stackoverflow.com/questions/1760525/need-to-write-at-beginning-of-file-with-php) – 2011-12-15 14:33:55

+0

@ BradChristie该问题不需要对文件进行排序或限制记录数量。 – user191688 2011-12-15 15:35:57

回答

1

要做到这一点,最好的办法,我认为(虽然它不是最内存高效的方法)是这样的:

function writeLogEntry ($filePath, $str, $maxRecords) { 
    $fileData = file($filePath); // Get file contents as array 
    array_unshift($fileData, $str); // Add the log entry to the beginning 
    if (count($fileData) > $maxRecords) { // Strip old records off 
    $file = array_slice($fileData, 0, $maxRecords); 
    } 
    file_put_contents($filePath, $fileData); // Write file again 
} 

$logEntry = "yyyy-mm-dd|Something happened\n"; 

writeLogEntry('/path/to/file', $logEntry, 1000); 

使用这种方法时,文件被保存在顺序你想要它(最新的第一个)。但是,如果此文件可能一次由多个进程写入,则需要实施某种形式的锁定以避免丢失数据。