我有一段代码将CSV日志文件截断到指定的尾随时间段。每个CSV条目中的第一个字段是一个时间戳。Atomically file_get_contents + file_put_contents
以下正确清除,但不是自动截断日志,导致可能失去file_get_contents & file_put_contents之间丢失的日志条目。由于新条目位于文件底部,因此在此之前不会有破坏日志的风险。
我考虑的file_get_contents & file_put_contents内手动执行的操作,但PHP文档声称,这些行动做的所有类型的超级好玩的巫术优化,并做我想要的(让所有的文件内容作为一个字符串的推荐方法和用字符串填充文件),所以我很好奇是否有一种方法可以在不危险的情况下使用这些函数。
$time = time();
$fp = @fopen($file, 'r');
if ($fp !== false) {
$truncate = false;
$offset = 0;
// find the first non-expired entry
while (($fields = fgetcsv($fp)) !== false) {
if (! is_null($fields) && $time > ($fields[0] + $purge_interval)) {
// we've reached the recent entries -- nothing beyond here will be removed
break;
}
$offset = @ftell($fp);
if (false === $offset) {
break;
}
$truncate = true;
}
@fclose($fp);
if ($truncate) {
// need the next two lines atomically performed...
$data = file_get_contents($file, false, null, $offset);
file_put_contents($file, $data, LOCK_EX);
}
}
你是否也控制了使用日志的所有其他代码?我做的是 – Jon
。更多的话来满足最小尺寸要求... – Dan