Heim >Backend-Entwicklung >PHP-Problem >So implementieren Sie Linux-Befehle in PHP

So implementieren Sie Linux-Befehle in PHP

藏色散人
藏色散人Original
2021-12-08 11:00:493546Durchsuche

So implementieren Sie Linux-Befehle in PHP: 1. Erstellen Sie eine PHP-Beispieldatei. 2. Geben Sie „#!/usr/bin/env php“ in die erste Zeile ein. 3. Übergeben Sie „if(2 != count($argv )" ){...}" und andere Codes können den Linux-Befehl „tail -f“ implementieren.

So implementieren Sie Linux-Befehle in PHP

Die Betriebsumgebung dieses Artikels: Linux5.9.8-System, PHP-Version 7.1, Dell G3-Computer.

Wie implementiert man Linux-Befehle in PHP?

Wie implementiert man Linux-Befehle in PHP tail -ftail -f

今天突然想到之前有人问过我的一个问题,如何通过PHP实现linux中的命令tail -f,这里就来分析实现下。

这个想一想也挺简单,通过一个循环检测文件,看文件的大小是否有变化,如果有变化,输出文件变化的部分,当然了这里面会有好多的细节,这里具体分析下。

如果初始文件太大或者改变内容太多

这个时候一下输出好多内容可能看不清,因此我这里设置了一个阈值8192,当内容长度超过这个阈值的时候,只输出最后面的8192个字节,这样就不会出现大面积的刷新导致看不清的问题。

如何检测文件大小的变化

这个问题是这个程序的核心,能不能成功,性能的好坏就靠这部分了。
我在这里的实现是下面这样:

  • 打开文件句柄$fp,这里要注意,这里的文件句柄全程需中只打开一次关闭一次,因此要将他放在循环的外面。
  • 初始化当前文件大小file_sizefile_size_new都为0。
    • 循环里面更新file_size_new文件大小,这里要注意,php中获取文件大小之前一定要运行函数clearstatcache(),清除文件状态缓存,否则获取文件大小可能会有偏差。
    • 计算add_size = file_size_new - file_size,看文件大小是否有变化,如果有变化,将文件指针移动到指定位置,然后输出新加的内容,更新file_size值为new_file_size
    • usleep(50000),睡眠1/20秒。

代码实现

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

代码实现这里第一行的#!/usr/bin/env php 是告诉可执行文件,可执行文件php在系统PATH中查找,这样的好处就是移植性好。

2016-02-22 11:28:51改进

查了PHP官方手册,fseek函数这里可以改进改进,这个函数还接受第三个参数,表示偏移指针的类型,默认是SEEK_SET,从开始偏移,还可以设置为SEEK_CUR,表示从当前位置偏移,因此这里改为fseek($fp, $ignore_size, $ignore_size);

Heute fiel mir plötzlich eine Frage ein, die mir zuvor jemand gestellt hatte, wie man sie implementiert Befehle unter Linux über PHP tail -f, lassen Sie es uns hier 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. Natürlich wird dies der Fall sein viele Details darin.

Wenn die Anfangsdatei zu groß ist oder zu viele geänderte Inhalte vorhanden sind

Zu diesem Zeitpunkt werden viele Inhalte auf einmal ausgegeben und möglicherweise nicht deutlich sichtbar, daher habe ich hier einen Schwellenwert festgelegt8192. Wenn die Inhaltslänge diesen Schwellenwert überschreitet, werden nur die letzten 8192 Bytes ausgegeben, sodass dies der Fall ist Durch die großflächige Aktualisierung entsteht kein Problem mit unklarer Sicht.

So erkennen Sie Änderungen in der Dateigröße

Diese Frage ist der Kern dieses Programms. Ob es erfolgreich sein kann oder nicht, hängt von diesem Teil der Leistung ab.
Meine Implementierung hier ist wie folgt: 🎜
  • Öffnen Sie das Dateihandle $fp. Hierbei ist zu beachten, dass das Dateihandle hier nur einmal geöffnet und geschlossen werden muss im gesamten Prozess also außerhalb der Schleife platzieren.
  • 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. Beachten Sie hier, dass Sie die Funktion clearstatcache() ausführen müssen, bevor Sie die Dateigröße in PHP erhalten Leeren Sie den Dateistatus-Cache. Andernfalls kann es zu Abweichungen bei der Ermittlung der Dateigröße kommen.
    • Berechnen Sie add_size = file_size_new - file_size, um zu sehen, ob sich die Dateigröße geändert hat. Wenn ja, bewegen Sie den Dateizeiger an die angegebene Position, geben Sie dann den neu hinzugefügten Inhalt aus und aktualisieren Sie file_size-Wert ist new_file_size.
    • usleep(50000), 1/20 Sekunde lang schlafen.

Code Implementation🎜rrreee🎜Code Implementation Die erste Zeile hier ist #!/usr/bin/env php teilt der ausführbaren Datei mit, dass die ausführbare Datei <code>php im System PATH gesucht werden soll. Der Vorteil davon ist, dass sie eine gute Portabilität aufweist. 🎜🎜🎜22.02.2016 11:28:51Verbesserung🎜🎜🎜Ich habe das offizielle PHP-Handbuch überprüft und festgestellt, dass die Funktion fseek verbessert werden kann. Diese Funktion akzeptiert auch einen dritten Parameter, der das darstellt Offset-Zeiger. Der Typ von , $ignore_size, $ignore_size);🎜🎜Hier sind die Ergebnisse🎜🎜🎜🎜🎜Empfohlenes Lernen: „🎜PHP-Video-Tutorial🎜“🎜

Das obige ist der detaillierte Inhalt vonSo implementieren Sie Linux-Befehle in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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:Was bedeuten Delphi und PHP?Nächster Artikel:Was bedeuten Delphi und PHP?