PHP實現(xiàn)linux命令tail -f
tail 命令從指定點開始將文件寫到標準輸出.使用tail命令的-f選項可以方便的查閱正在改變的日志文件,tail -f filename會把filename里最尾部的內(nèi)容顯示在屏幕上,并且不但刷新,使你看到最新的文件內(nèi)容.
1.命令格式;
tail[必要參數(shù)][選擇參數(shù)][文件]
2.命令功能:
用于顯示指定文件末尾內(nèi)容,不指定文件時,作為輸入信息進行處理。常用查看日志文件。
3.命令參數(shù):
-f 循環(huán)讀取
-q 不顯示處理信息
-v 顯示詳細的處理信息
-c<數(shù)目> 顯示的字節(jié)數(shù)
-n<行數(shù)> 顯示行數(shù)
--pid=PID 與-f合用,表示在進程ID,PID死掉之后結(jié)束.
-q, --quiet, --silent 從不輸出給出文件名的首部
-s, --sleep-interval=S 與-f合用,表示在每次反復(fù)的間隔休眠S秒
今天突然想到之前有人問過我的一個問題,如何通過PHP實現(xiàn)linux中的命令tail -f,這里就來分析實現(xiàn)下。
這個想一想也挺簡單,通過一個循環(huán)檢測文件,看文件的大小是否有變化,如果有變化,輸出文件變化的部分,當然了這里面會有好多的細節(jié),這里具體分析下。
如果初始文件太大或者改變內(nèi)容太多
這個時候一下輸出好多內(nèi)容可能看不清,因此我這里設(shè)置了一個閾值8192,當內(nèi)容長度超過這個閾值的時候,只輸出最后面的8192個字節(jié),這樣就不會出現(xiàn)大面積的刷新導(dǎo)致看不清的問題。
如何檢測文件大小的變化
這個問題是這個程序的核心,能不能成功,性能的好壞就靠這部分了。
我在這里的實現(xiàn)是下面這樣:
•打開文件句柄$fp,這里要注意,這里的文件句柄全程需中只打開一次關(guān)閉一次,因此要將他放在循環(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秒。
代碼實現(xiàn)
#!/usr/bin/env php
<?php
if(2 != count($argv)){
fwrite(
STDERR,
"調(diào)用格式錯誤!使用格式 ./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);
代碼實現(xiàn)這里第一行的#!/usr/bin/env php 是告訴可執(zhí)行文件,可執(zhí)行文件php在系統(tǒng)PATH中查找,這樣的好處就是移植性好。
下面是結(jié)果

下文給大家介紹如何實現(xiàn)Linux下高亮關(guān)鍵字的tail -f功能
公司內(nèi)部一哥們發(fā)布到郵件列表中的一個小tip,挺有意思,屬于程序員的“奇淫技巧”類吧,值得記錄一下。
如果你在linux下工作,那用tail -f跟蹤一個日志文件的輸出內(nèi)容應(yīng)該是家常便飯了。
但是,有時你更關(guān)心的是一些敏感字詞,希望能夠在動態(tài)跟蹤的同時,把這些字詞高亮出來,比如日志中的ERROR關(guān)鍵字。
那么,一種思路就是把你tail輸出的東西再做一次包裝處理,這個很符合linux管道處理的思想。以高亮Log中的ERROR為例,你可以這樣:
Shell代碼
tail -f xxx.log | perl -pe 's/(ERROR)/\e[1;31m$1\e[0m/g'
其中,xxx.log是你要跟蹤的文件。這里假設(shè)了你的Linux的PATH中有perl。perl在這里干的事情,就是通過命令行的方式進行動態(tài)的替換ERROR字符串的操作,替換過程中,主要使用了Linux的console_codes的語法結(jié)構(gòu)。(具體關(guān)于console_codes的細節(jié),可以通過man console_codes進行了解)這里,\e主要進行轉(zhuǎn)移說明。
如果你手頭有server log之類的日志,試試上面的命令,是不是把ERROR全部標紅了。
利用這個原理,你完全可以按照你所需要的顏色高亮你感興趣的輸出,具體的顏色說明,可以在man console_codes中查到。
另外,less本身也支持類似于tail -f的操作,就是在你用less打開一個文件之后,按住SHIFT+F鍵,這樣就直接進入follow的模式了。看上去跟tail -f效果是一致的。利用這點,你想達到高亮的tail -f的效果,就攏共分為以下3步了:
less xxx.log
中/${key_work}的方式搜索你要高亮的關(guān)鍵字。(即使目前文件中沒有也沒關(guān)系)
SHIFT+F,進入follow模式
相關(guān)文章
php批量更改數(shù)據(jù)庫表前綴實現(xiàn)方法
我們經(jīng)常會遇到替換或添加數(shù)據(jù)庫表前綴的問題,通過數(shù)據(jù)庫導(dǎo)出,在記事本上批量更改,然后再導(dǎo)出,這也是一種方法,但是不夠方便2013-10-10
windows server 2008/2012安裝php iis7 mysql環(huán)境搭建教程
這篇文章主要為大家詳細介紹了windows server 2008/2012安裝php iis7 mysql環(huán)境搭建教程 ,需要的朋友可以參考下2016-06-06
thinkPHP5框架整合plupload實現(xiàn)圖片批量上傳功能的方法
這篇文章主要介紹了thinkPHP5框架整合plupload實現(xiàn)圖片批量上傳功能的方法,結(jié)合實例形式分析了thinkPHP結(jié)合pluploadQueue實現(xiàn)上傳功能的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
ThinkPHP框架結(jié)合Ajax實現(xiàn)用戶名校驗功能示例
這篇文章主要介紹了ThinkPHP框架結(jié)合Ajax實現(xiàn)用戶名校驗功能,涉及thinkPHP使用ajax與后臺控制交互、數(shù)據(jù)庫查詢、判定等相關(guān)操作技巧,需要的朋友可以參考下2019-07-07
laravel ORM 只開啟created_at的幾種方法總結(jié)
下面小編就為大家分享一篇laravel ORM 只開啟created_at的幾種方法總結(jié),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01

