PHP實(shí)現(xiàn)linux命令tail -f
今天突然想到之前有人問過我的一個(gè)問題,如何通過PHP實(shí)現(xiàn)linux中的命令 tail -f ,這里就來分析實(shí)現(xiàn)下。
這個(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)的外面。
初始化當(dāng)前文件大小 file_size 和 file_size_new 都為0。
循環(huán)里面更新 file_size_new 文件大小,這里要注意,php中獲取文件大小之前一定要運(yùn)行函數(shù) clearstatcache() ,清除文件狀態(tài)緩存,否則獲取文件大小可能會(huì)有偏差。
計(jì)算 add_size = file_size_new - file_size ,看文件大小是否有變化,如果有變化,將文件指針移動(dòng)到指定位置,然后輸出新加的內(nèi)容,更新 file_size 值為 new_file_size 。
usleep(50000),睡眠1/20秒。
代碼實(shí)現(xiàn)
#!/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 ,表示從當(dāng)前位置偏移,因此這里改為 fseek($fp, $ignore_size, $ignore_size);
下面是結(jié)果

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)