Как сохранить последний номер строки из файла журнала в php - PullRequest
0 голосов
/ 12 февраля 2010

Я хочу удалить все строки из старых файлов журнала и сохранить свежие 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. Так как ваш код будет работать с этим?

Ответы [ 5 ]

7 голосов
/ 12 февраля 2010
$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));
3 голосов
/ 12 февраля 2010

Это немного сложнее, но использует меньше памяти, так как весь файл не загружается в массив. По сути, он хранит массив длины 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 в вашем распоряжении.

1 голос
/ 12 февраля 2010

Это будет работать для усечения файла журнала:

exec("tail -n 50 /path/to/log.txt", $log);
file_put_contents('/path/to/log.txt', implode(PHP_EOL, $log));

Это вернет вывод из tail в $log и запишет его в файл журнала.

0 голосов
/ 07 марта 2010

этот метод использует ассоциативный массив для хранения только $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];
    }
}
0 голосов
/ 12 февраля 2010

Оптимальная форма:

<?
print `tail -50 /path/to/file.log`;
?>
...