PHP實(shí)作linux指令tail -f
今天突然想到之前有人問過我的一個(gè)問題,如何透過PHP實(shí)作linux中的指令 tail -f ,這裡就來(lái)分析實(shí)作下。
這個(gè)想一想也挺簡(jiǎn)單,透過一個(gè)循環(huán)檢測(cè)文件,看文件的大小是否有變化,如果有變化,輸出文件變化的部分,當(dāng)然了這裡面會(huì)有好多的細(xì)節(jié),這裡具體分析下。
如果初始文件太大或改變內(nèi)容太多
這個(gè)時(shí)候一下輸出內(nèi)容可能看不清,因此我這裡設(shè)定了一個(gè)閾值8192 ,當(dāng)內(nèi)容長(zhǎng)度超過這個(gè)閾值的時(shí)候,只輸出最後面的8192 個(gè)好多字節(jié),這樣就不會(huì)出現(xiàn)大面積的刷新導(dǎo)致看不清楚的問題。
如何偵測(cè)檔案大小的變化
這個(gè)問題是這個(gè)程式的核心,能不能成功,效能的好壞就靠這部分了。我在這裡的實(shí)現(xiàn)是下面這樣:
打開文件句柄 $fp ,這裡要注意,這裡的文件句柄全程需中只打開一次關(guān)閉一次,因此要將他放在循環(huán)的外面。
初始化目前檔案大小 file_size 和 file_size_new 都為0。
循環(huán)裡面更新 file_size_new 檔案大小,這裡要注意,php中取得檔案大小之前一定要執(zhí)行函數(shù) clearstatcache() ,清除檔案狀態(tài)緩存,否則取得檔案大小可能會(huì)有偏差。
計(jì)算 add_size = file_size_new - file_size ,看檔案大小是否有變化,如果有變化,將檔案指標(biāo)移到指定位置,然後輸出新加的內(nèi)容,更新 file_size 值為 new_file_size 。
usleep(50000),睡眠1/20秒。
程式碼實(shí)作
#!/usr/bin/env php <?php if(2 != count($argv)){ fwrite( STDERR, "調(diào)用格式錯(cuò)誤!使用格式 ./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);
程式碼實(shí)現(xiàn)這裡第一行的 #!/usr/bin/env php 是告訴可執(zhí)行文件,可執(zhí)行文件 php 在系統(tǒng) PATH 中查找,這樣的好處就是移植性好。
2016-02-22 11:28:51改進(jìn)
查了PHP官方手冊(cè), fseek 函數(shù)這裡可以改進(jìn)改進(jìn),這個(gè)函數(shù)還接受第三個(gè)參數(shù),表示偏移指針的類型,默認(rèn)是 SEEK_SET ,從開始偏移,也可以設(shè)定為 SEEK_CUR ,表示從目前位置偏移,因此這裡改為 fseek($fp, $ignore_size, $ignore_size);
下面是結(jié)果

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁(yè)開發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)
