国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP實現linux命令tail -f

2024-05-04 23:43:12
字體:
來源:轉載
供稿:網友
tail 命令從指定點開始將文件寫到標準輸出.使用tail命令的-f選項可以方便的查閱正在改變的日志文件,tail -f filename會把filename里最尾部的內容顯示在屏幕上,并且不但刷新,使你看到最新的文件內容.接下來通過本文給大家介紹PHP實現linux命令tail -f,需要的朋友參考下
 

tail 命令從指定點開始將文件寫到標準輸出.使用tail命令的-f選項可以方便的查閱正在改變的日志文件,tail -f filename會把filename里最尾部的內容顯示在屏幕上,并且不但刷新,使你看到最新的文件內容.

1.命令格式;

tail[必要參數][選擇參數][文件]

2.命令功能:

用于顯示指定文件末尾內容,不指定文件時,作為輸入信息進行處理。常用查看日志文件。

3.命令參數:

-f 循環讀取

-q 不顯示處理信息

-v 顯示詳細的處理信息

-c<數目> 顯示的字節數

-n<行數> 顯示行數

--pid=PID 與-f合用,表示在進程ID,PID死掉之后結束.

-q, --quiet, --silent 從不輸出給出文件名的首部

-s, --sleep-interval=S 與-f合用,表示在每次反復的間隔休眠S秒

今天突然想到之前有人問過我的一個問題,如何通過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。
•usleep(50000),睡眠1/20秒。

代碼實現

#!/usr/bin/env php <?phpif(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中查找,這樣的好處就是移植性好。

下面是結果

PHP實現linux命令tail -f

下文給大家介紹如何實現Linux下高亮關鍵字的tail -f功能

公司內部一哥們發布到郵件列表中的一個小tip,挺有意思,屬于程序員的“奇淫技巧”類吧,值得記錄一下。
如果你在linux下工作,那用tail -f跟蹤一個日志文件的輸出內容應該是家常便飯了。
但是,有時你更關心的是一些敏感字詞,希望能夠在動態跟蹤的同時,把這些字詞高亮出來,比如日志中的ERROR關鍵字。
那么,一種思路就是把你tail輸出的東西再做一次包裝處理,這個很符合linux管道處理的思想。以高亮Log中的ERROR為例,你可以這樣:

Shell代碼

tail -f xxx.log | perl -pe 's/(ERROR)//e[1;31m$1/e[0m/g' 

其中,xxx.log是你要跟蹤的文件。這里假設了你的Linux的PATH中有perl。perl在這里干的事情,就是通過命令行的方式進行動態的替換ERROR字符串的操作,替換過程中,主要使用了Linux的console_codes的語法結構。(具體關于console_codes的細節,可以通過man console_codes進行了解)這里,/e主要進行轉移說明。
如果你手頭有server log之類的日志,試試上面的命令,是不是把ERROR全部標紅了。
利用這個原理,你完全可以按照你所需要的顏色高亮你感興趣的輸出,具體的顏色說明,可以在man console_codes中查到。
另外,less本身也支持類似于tail -f的操作,就是在你用less打開一個文件之后,按住SHIFT+F鍵,這樣就直接進入follow的模式了。看上去跟tail -f效果是一致的。利用這點,你想達到高亮的tail -f的效果,就攏共分為以下3步了:

less xxx.log中/${key_work}的方式搜索你要高亮的關鍵字。(即使目前文件中沒有也沒關系)SHIFT+F,進入follow模式


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新乐市| 安远县| 长宁县| 深泽县| 两当县| 莲花县| 东安县| 镇巴县| 昆明市| 会昌县| 石家庄市| 吉木萨尔县| 河津市| 沾益县| 乌兰察布市| 偏关县| 德化县| 汉寿县| 广东省| 广元市| 宜君县| 亚东县| 临澧县| 大理市| 天水市| 甘孜| 深州市| 长子县| 石屏县| 昌乐县| 房山区| 紫云| 新巴尔虎右旗| 许昌市| 且末县| 仲巴县| 恩平市| 马公市| 友谊县| 武平县| 仙居县|