PHP實現linux命令tail -f,phplinuxtail-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中尋找,這樣的好處就是移植性好。
下面是結果
下文給大家介紹如何?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模式
您可能感興趣的文章:
- Node.js中使用Log.io在瀏覽器中即時監控日誌(等同tail -f命令)
http://www.bkjia.com/PHPjc/1102469.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1102469.htmlTechArticlePHP實現linux命令tail -f,phplinuxtail-f tail 命令從指定點開始將檔案寫到標準輸出.使用tail命令的-f選項可以方便的查閱正在改變的記錄檔,ta...