我想删除旧日志文件中的所有行,并保留最底部的50行。
我怎样才能做这样的事情,如果可能的话,我们可以改变这些线的方向,
normal input
111111
2222222
3333333
44444444
5555555
output like
555555
4444444
3333333
22222
111111
仅在顶部查看新记录,仅查看50或100行。
如何加入这个?
// set source file name and path
$source = "toi200686.txt";
// read raw text as array
$raw = file($source) or die("Cannot read file");
// join remaining data into string
$data = join('', $raw);
// replace special characters with HTML entities
// replace line breaks with <br />
$html = nl2br(htmlspecialchars($data));
它将输出作为HTML文件。那么你的代码将如何运行呢?
答案 0 :(得分:7)
$lines = file('/path/to/file.log'); // reads the file into an array by line
$flipped = array_reverse($lines); // reverse the order of the array
$keep = array_slice($flipped,0, 50); // keep the first 50 elements of the array
从那里你可以使用$keep
进行任何操作。例如,如果你想把它吐出来:
echo implode("\n", $keep);
或
file_put_contents('/path/to/file.log', implode("\n", $keep));
答案 1 :(得分:3)
这有点复杂,但由于整个文件未加载到数组中,因此占用的内存较少。基本上,它保留一个N长度的数组,并在从文件中读取时按下新行,同时切换一个。因为新行是由fgets返回的,所以即使使用填充数组,你也可以简单地进行内爆以查看N行。
<?php
$handle = @fopen("/path/to/log.txt", "r");
$lines = array_fill(0, $n-1, '');
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle);
array_push($lines, $buffer);
array_shift($lines);
}
fclose($handle);
}
print implode("",$lines);
?>
只是展示另一种做事方式,特别是如果您没有tail
可供使用。
答案 2 :(得分:1)
这可以用于截断日志文件:
exec("tail -n 50 /path/to/log.txt", $log);
file_put_contents('/path/to/log.txt', implode(PHP_EOL, $log));
这将返回tail
中$log
的输出并将其写回日志文件。
答案 3 :(得分:0)
最佳形式是:
<?
print `tail -50 /path/to/file.log`;
?>
答案 4 :(得分:0)
此方法使用关联数组每次仅存储$tail
个行数。它没有用所有行填充整个数组
$tail=50;
$handle = fopen("file", "r");
if ($handle) {
$i=0;
while (!feof($handle)) {
$buffer = fgets($handle,2048);
$i++;
$array[$i % $tail]=$buffer;
}
fclose($handle);
for($o=$i+1;$o<$i+$tail;$o++){
print $array[$o%$tail];
}
}