php günlük dosyası hattının son n sayıda tutmak için nasıl

5 Cevap php

merhaba ben eski günlük dosyaları tüm satırları silin ve altındaki taze 50 satır tutmak istiyorum

plz bana bu ve benzeri bir şey php kodunu yapmak vermek mümkünse biz bu çizgilerin yönünü değiştirebilirsiniz

normal input

111111
2222222
3333333
44444444
5555555

output like

555555
4444444
3333333
22222
111111

Taze üstündeki günlüğü ve sadece 50 veya 100 hatları görmek için

Çok teşekkürler


Aşağıdaki eklenen Yorum

Çok teşekkürler but how to join it with this one ?

// 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)); 

bir html dosyası olarak bir çıkış yapmak, bu yüzden nasıl ur kod düzgün bu ile çalışacak? Teşekkürler

5 Cevap

$lines = file('/path/to/file.log'); // reads the file into an array by line
$flipped = array_reverse($lines); // reverse the veyader of the array
$keep = array_slice($flipped,0, 50); // keep the first 50 elements of the array

veyaadan yapabilirsiniz dow ile olursa olsun $keep. Örneğin onu geri dışarı tükürmek istiyveyaum:

echo implode("\n", $keep);

veya

file_put_contents('/path/to/file.log', implode("\n", $keep));

Bu biraz daha karmaşık, ancak tüm dosya diziye yüklü değil gibi daha az bellek kullanır. Temelde, bir N uzunluğu dizi tutar ve bir kapalı kayması sırasında onlar dosyadan okumak gibi yeni hatlarda iter. Satır fgets tarafından döndürülen olduğundan, sadece bile yastıklı dizi ile, sizin N satırları görmek için çöktüğünü yapabilirsiniz.

<?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);
?>

Sadece senin emrinde tail yok, özellikle eğer, bir şeyler yapmak için başka bir yol gösteren.

Bu günlük dosyası kesiliyor için çalışmak:

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

Bu tail $log gelen çıkış iade ve geri günlük dosyasına yazacaktır.

Optimal şeklidir:

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

Bu yöntem hatları sadece $tail sayısını her zaman depolamak için ilişkisel dizi kullanın. Tüm hatları ile tüm dizi doldurmak değil

$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];
    }
}