新聞中心
本文操作環(huán)境:linux5.9.8系統(tǒng),php7.1版,Dell G3電腦。

php怎么實現(xiàn)linux命令?
PHP實現(xiàn)linux命令tail -f
今天突然想到之前有人問過我的一個問題,如何通過PHP實現(xiàn)linux中的命令tail -f,這里就來分析實現(xiàn)下。
這個想一想也挺簡單,通過一個循環(huán)檢測文件,看文件的大小是否有變化,如果有變化,輸出文件變化的部分,當然了這里面會有好多的細節(jié),這里具體分析下。
如果初始文件太大或者改變內(nèi)容太多
這個時候一下輸出好多內(nèi)容可能看不清,因此我這里設置了一個閾值8192,當內(nèi)容長度超過這個閾值的時候,只輸出最后面的8192個字節(jié),這樣就不會出現(xiàn)大面積的刷新導致看不清的問題。
如何檢測文件大小的變化
這個問題是這個程序的核心,能不能成功,性能的好壞就靠這部分了。
我在這里的實現(xiàn)是下面這樣:
- 打開文件句柄
$fp,這里要注意,這里的文件句柄全程需中只打開一次關閉一次,因此要將他放在循環(huán)的外面。 - 初始化當前文件大小
file_size和file_size_new都為0。- 循環(huán)里面更新
file_size_new文件大小,這里要注意,php中獲取文件大小之前一定要運行函數(shù)clearstatcache(),清除文件狀態(tài)緩存,否則獲取文件大小可能會有偏差。 - 計算
add_size = file_size_new - file_size,看文件大小是否有變化,如果有變化,將文件指針移動到指定位置,然后輸出新加的內(nèi)容,更新file_size值為new_file_size。 - usleep(50000),睡眠1/20秒。
- 循環(huán)里面更新
代碼實現(xiàn)
#!/usr/bin/env php
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);
代碼實現(xiàn)這里第一行的#!/usr/bin/env php 是告訴可執(zhí)行文件,可執(zhí)行文件php在系統(tǒng)PATH中查找,這樣的好處就是移植性好。
查了PHP官方手冊,fseek函數(shù)這里可以改進改進,這個函數(shù)還接受第三個參數(shù),表示偏移指針的類型,默認是SEEK_SET,從開始偏移,還可以設置為SEEK_CUR,表示從當前位置偏移,因此這里改為fseek($fp, $ignore_size, $ignore_size);
下面是結果
網(wǎng)頁名稱:php怎么實現(xiàn)linux命令
標題來源:http://www.5511xx.com/article/cddsjgh.html


咨詢
建站咨詢
