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.
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 -f
tail -f
今天突然想到之前有人问过我的一个问题,如何通过PHP实现linux中的命令tail -f
,这里就来分析实现下。
这个想一想也挺简单,通过一个循环检测文件,看文件的大小是否有变化,如果有变化,输出文件变化的部分,当然了这里面会有好多的细节,这里具体分析下。
这个时候一下输出好多内容可能看不清,因此我这里设置了一个阈值8192
,当内容长度超过这个阈值的时候,只输出最后面的8192
个字节,这样就不会出现大面积的刷新导致看不清的问题。
这个问题是这个程序的核心,能不能成功,性能的好坏就靠这部分了。
我在这里的实现是下面这样:
$fp
,这里要注意,这里的文件句柄全程需中只打开一次关闭一次,因此要将他放在循环的外面。file_size
和file_size_new
都为0。file_size_new
文件大小,这里要注意,php中获取文件大小之前一定要运行函数clearstatcache()
,清除文件状态缓存,否则获取文件大小可能会有偏差。add_size = file_size_new - file_size
,看文件大小是否有变化,如果有变化,将文件指针移动到指定位置,然后输出新加的内容,更新file_size
值为new_file_size
。#!/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);
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.
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
$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. file_size
und file_size_new
jeweils auf 0. 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. 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
. #!/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!