Heim  >  Artikel  >  php教程  >  PHP implementiert den Linux-Befehl tail -f

PHP implementiert den Linux-Befehl tail -f

大家讲道理
大家讲道理Original
2016-11-08 13:52:581246Durchsuche

PHP implementiert den Linux-Befehl tail -f

Heute fiel mir plötzlich eine Frage ein, die mir zuvor jemand gestellt hatte, wie man den Linux-Befehl tail -f über PHP implementiert. Hier werde ich ihn analysieren und implementieren.

Das ist ganz einfach, wenn man darüber nachdenkt. Es erkennt die Datei durch eine Schleife, um zu sehen, ob sich die Größe der Datei geändert hat , es wird viele Details darin geben. Hier ist eine detaillierte Analyse.

Wenn die ursprüngliche Datei zu groß ist oder der Inhalt zu stark geändert wurde

Zu diesem Zeitpunkt wird viel Inhalt auf einmal ausgegeben und ist möglicherweise nicht klar sichtbar, daher habe ich eine festgelegt Hier liegt der Schwellenwert von 8192. Wenn die Inhaltslänge diesen Schwellenwert überschreitet, werden nur die letzten 8192 Bytes ausgegeben, sodass es aufgrund der Aktualisierung großer Bereiche nicht zu Problemen mit unklarer Sichtbarkeit kommt.

So erkennen Sie Änderungen in der Dateigröße

Diese Frage ist der Kern dieses Programms. Ob es erfolgreich sein kann oder nicht, die Leistung hängt von diesem Teil ab. Meine Implementierung hier ist wie folgt:

Öffnen Sie das Dateihandle $fp. Hierbei ist zu beachten, dass das Dateihandle hier im gesamten Prozess nur einmal geöffnet und einmal geschlossen werden muss, sodass es außerhalb platziert werden muss die Schleife.

Initialisieren Sie die aktuelle Dateigröße file_size und file_size_new jeweils auf 0.

Die Dateigröße „file_size_new“ wird in der Schleife aktualisiert. Hierbei ist zu beachten, dass Sie vor dem Abrufen der Dateigröße in PHP die Funktion „clearstatcache()“ ausführen müssen, um den Dateistatus-Cache zu löschen Abweichung bei der Ermittlung der Dateigröße.

Berechnen Sie add_size = file_size_new - file_size, um zu sehen, ob sich die Dateigröße ändert. Bewegen Sie den Dateizeiger an die angegebene Position, geben Sie dann den neu hinzugefügten Inhalt aus und aktualisieren Sie den file_size-Wert auf new_file_size.

usleep(50000), 1/20 Sekunde schlafen.

Code-Implementierung

#!/usr/bin/env php 
<?php
if(2 != count($argv)){
    fwrite(
        STDERR,
        "调用格式错误!使用格式 ./tail filename".PHP_EOL
    );  
    return 1;
}
 
$file_name      = $argv[1];
define("MAX_SHOW", 8192);
 
$file_size      = 0;
$file_size_new  = 0;
$add_size       = 0;
$ignore_size    = 0;
$fp = fopen($file_name, "r");
while(1){
    clearstatcache();
    $file_size_new  = filesize($file_name);
    $add_size       = $file_size_new - $file_size;
    if($add_size > 0){ 
        if($add_size > MAX_SHOW){
            $ignore_size    = $add_size - MAX_SHOW;
            $add_size       = MAX_SHOW;
            fseek($fp, $file_size + $ignore_size);
        }   
        fwrite(
            STDOUT,
            fread($fp, $add_size)
        );  
        $file_size  = $file_size_new;
    }
    usleep(50000);
}
 
fclose($fp);

Code-Implementierung Die erste Zeile von #!/usr/bin/env php teilt der ausführbaren Datei hier mit, dass die ausführbare Datei PHP im Systempfad gesucht wird, z Dies Der Vorteil ist eine gute Portabilität.

22.02.2016 11:28:51 Verbesserung

Ich habe das offizielle PHP-Handbuch überprüft und festgestellt, dass die fseek-Funktion verbessert werden kann. Diese Funktion akzeptiert auch einen dritten Parameter, der das darstellt Offset-Zeiger. Typ, Standard ist SEEK_SET , Offset vom Anfang, kann auch auf SEEK_CUR gesetzt werden, was einen Offset von der aktuellen Position bedeutet, daher wird es hier in fseek($fp, $ignore_size, $ignore_size);

Das Folgende ist das Ergebnis

PHP implementiert den Linux-Befehl tail -f

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-Verzeichnis durchquerenNächster Artikel:PHP-Verzeichnis durchqueren