【发布时间】:2015-07-20 02:49:02
【问题描述】:
我有一段代码可以将 CSV 日志文件截断到指定的尾随时间段。每个 CSV 条目中的第一个字段是时间戳。
以下内容会正确清除,但不会自动截断日志,从而导致 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 );
}
}
【问题讨论】:
-
您是否也可以控制使用日志的所有其他代码?
-
我愿意。满足最小尺寸要求的更多字...