我在這里的實(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)緩存,否則獲取文件大小可能會有偏差。計算add_size = file_size_new – file_size,看文件大小是否有變化,如果有變化,將文件指針移動到指定位置,然后輸出新加的內(nèi)容,更新file_size值為new_file_size。usleep(50000),睡眠1/20秒。代碼實(shí)現(xiàn)#!/usr/bin/env php <?phpif(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);
代碼實(shí)現(xiàn)這里第一行的#!/usr/bin/env php是告訴可執(zhí)行文件,可執(zhí)行文件php在系統(tǒng)PATH中查找,這樣的好處就是移植性好。
2016-02-22 11:28:51改進(jìn)
查了PHP官方手冊,fseek函數(shù)這里可以改進(jìn)改進(jìn),這個函數(shù)還接受第三個參數(shù),表示偏移指針的類型,默認(rèn)是SEEK_SET,從開始偏移,還可以設(shè)置為SEEK_CUR,表示從當(dāng)前位置偏移,因此這里改為fseek($fp, $ignore_size, $ignore_size);
下面是結(jié)果
推薦學(xué)習(xí):《PHP視頻教程》
更多關(guān)于云服務(wù)器,域名注冊,虛擬主機(jī)的問題,請訪問西部數(shù)碼官網(wǎng):m.ps-sw.cn