Frage

Ich vermute, es ist fgets, aber ich kann die spezifische Syntax nicht finden. Ich versuche, (in einem String Ich denke einfacher ist) zum Auslesen der letzten Zeile in eine Protokolldatei hinzugefügt.

War es hilfreich?

Lösung

Die einfachste naive Lösung ist einfach:

$file = "/path/to/file";
$data = file($file);
$line = $data[count($data)-1];

Obwohl, dies wird die gesamte Datei in den Speicher laden. Möglicherweise ein Problem (oder nicht). Eine bessere Lösung ist dies:

$file = escapeshellarg($file); // for the security concious (should be everyone!)
$line = `tail -n 1 $file`;

Andere Tipps

Das sieht aus wie es ist, was Sie suchen:

tekkie.flashbit.net: Schwanz Funktionalität in PHP

Es implementiert eine Funktion, die fseek () mit einem negativen Index verwendet die Datei aus dem Ende aufzurollen. Sie können festlegen, wie viele Zeilen Sie zurückgeschickt werden soll.

Der Code auch als Gist auf GitHub :

// full path to text file
define("TEXT_FILE", "/home/www/default-error.log");
// number of lines to read from the end of file
define("LINES_COUNT", 10);


function read_file($file, $lines) {
    //global $fsize;
    $handle = fopen($file, "r");
    $linecounter = $lines;
    $pos = -2;
    $beginning = false;
    $text = array();
    while ($linecounter > 0) {
        $t = " ";
        while ($t != "\n") {
            if(fseek($handle, $pos, SEEK_END) == -1) {
                $beginning = true; 
                break; 
            }
            $t = fgetc($handle);
            $pos --;
        }
        $linecounter --;
        if ($beginning) {
            rewind($handle);
        }
        $text[$lines-$linecounter-1] = fgets($handle);
        if ($beginning) break;
    }
    fclose ($handle);
    return array_reverse($text);
}

$fsize = round(filesize(TEXT_FILE)/1024/1024,2);

echo "<strong>".TEXT_FILE."</strong>\n\n";
echo "File size is {$fsize} megabytes\n\n";
echo "Last ".LINES_COUNT." lines of the file:\n\n";

$lines = read_file(TEXT_FILE, LINES_COUNT);
foreach ($lines as $line) {
    echo $line;
}
define('YOUR_EOL', "\n");
$fp = fopen('yourfile.txt', 'r');

$pos = -1; $line = ''; $c = '';
do {
    $line = $c . $line;
    fseek($fp, $pos--, SEEK_END);
    $c = fgetc($fp);
} while ($c != YOUR_EOL);

echo $line;

fclose($fp);

Das ist besser, da sie laden nicht die komplette Datei in den Speicher ...

Set YOUR_EOL auf Ihre korrekten Zeilenende, wenn Sie die gleichen Zeilenende als Standardzeilenende des OS, wo das Skript befindet verwenden, können Sie die Konstante PHP_EOL verwenden.

function seekLastLine($f) {
    $pos = -2;
    do {
        fseek($f, $pos--, SEEK_END);
        $ch = fgetc($f);
    } while ($ch != "\n");
}

-2 weil letztes Zeichen kann \n werden

Sie haben entweder die Datei in Zeile für Zeile zu lesen und die zuletzt gelesene Zeile zu speichern, um es zu bekommen.

Oder wenn auf Unix / Linux Sie sich anschauen sollten die Shell-Befehl Schwanz mit

tail -n 1 filename

Dies wird nicht brechen für eine 1 oder 0 Zeilendatei.

function readlastline($fileName)
{

       $fp = @fopen($fileName, "r");
       $begining = fseek($fp, 0);      
       $pos = -1;
       $t = " ";
       while ($t != "\n") {
             fseek($fp, $pos, SEEK_END);
             if(ftell($fp) == $begining){
              break;
             }
             $t = fgetc($fp);
             $pos = $pos - 1;
       }
       $t = fgets($fp);
       fclose($fp);
       return $t;
}

... Warum lesen Sie einfach die letzte Zeile?

function readLines($fp, $num) {

    $line_count = 0; $line = ''; $pos = -1; $lines = array(); $c = '';

    while($line_count < $num) {
        $line = $c . $line; 
        fseek($fp, $pos--, SEEK_END);
        $c = fgetc($fp);
        if($c == "\n") { $line_count++; $lines[] = $line; $line = ''; $c = ''; }
    }   
    return $lines;
}

$filename = "content.txt";
$fp = @fopen($filename, "r");

print_r(readLines($fp, 2));

fclose($fp);

Wenn Sie wollen, dass die file Funktion liest den Inhalt einer Datei, Zeile für Zeile und gibt jede Linie als ein Element eines Arrays.

So können Sie etwas tun könnte so einfach wie:

$lines    = file('log.txt');
$lastLine = array_pop($lines);

@unique_stephen, Ihre Antwort ist falsch. PHP FSEEK 0 für Erfolg und -1 für Fehler zurückgibt. Speicher das Ergebnis in $ begining (sic!) Und dann später in einem Filter für ftell mit () ist nicht korrekt. Wenn mein Ruf höher wäre, würde ich Sie nach unten gestimmt und hat einen Kommentar hinterlassen. Hier ist eine modifizierte Version von unique_stephen der Funktion.

function readlastline($fileName)
{
    $fp = @fopen($fileName, "r");
    if (fseek($fp, 0) == -1)
        exit('Cannot seek to beginning of the file'); 
    $pos = -1;
    $t = " ";
    while ($t != "\n") {
        if (fseek($fp, $pos, SEEK_END) == -1)
            exit('Cannot seek to the end of the file');
        if (ftell($fp) == 0) {
            break;
        }
        $t = fgetc($fp);
        $pos = $pos - 1;
    }
    $t = fgets($fp);
    fclose($fp);
    return $t;
}

Hinweis: PHP fseek nicht verwalten kann bis zum Ende der Dateien, die größer als PHP_MAX_INT zu suchen, die 32-Bit auch auf 64-Bit-Binärdateien signiert

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top