PHP实现linux命令tail -f


Posted in PHP onFebruary 22, 2016

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 
<?php
if(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 相关文章推荐
用PHP 快速生成 Flash 动画的方法
Mar 06 PHP
PHP 彩色文字实现代码
Jun 29 PHP
PHP 全角转半角实现代码
May 16 PHP
第4章 数据处理-php数组的处理-郑阿奇
Jul 04 PHP
php中用socket模拟http中post或者get提交数据的示例代码
Aug 08 PHP
php自定义函数截取汉字长度
May 15 PHP
php实现多城市切换特效
Aug 09 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
php实现留言板功能(代码详解)
Mar 28 PHP
[原创]php token使用与验证示例【测试可用】
Aug 30 PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
Oct 17 PHP
PHP设计模式之观察者模式实例
Feb 22 #PHP
PHP编写RESTful接口的方法
Feb 21 #PHP
PHP常见漏洞攻击分析
Feb 21 #PHP
php采集神器cURL使用方法详解
Feb 19 #PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
Feb 19 #PHP
PHP利用imagick生成组合缩略图
Feb 19 #PHP
对比分析php中Cookie与Session的异同
Feb 19 #PHP
You might like
在PWS上安装PHP4.0正式版
2006/10/09 PHP
修改PHP的memory_limit限制的方法分享
2012/02/21 PHP
php上传图片之时间戳命名(保存路径)
2014/08/15 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
8个PHP数组面试题
2015/06/23 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
js变量作用域及可访问性的探讨
2006/11/23 Javascript
33种Javascript 表格排序控件收集
2009/12/03 Javascript
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
十个优秀的Ajax/Javascript实例网站收集
2010/03/31 Javascript
js动态设置鼠标事件示例代码
2013/10/30 Javascript
快速解决FusionCharts联动的中文乱码问题
2013/12/04 Javascript
浅析JavaScript中两种类型的全局对象/函数
2013/12/05 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
JavaScript面向对象程序设计教程
2016/03/29 Javascript
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
最好用的Bootstrap fileinput.js文件上传组件
2016/12/12 Javascript
js jquery 获取某一元素到浏览器顶端的距离实现方法
2018/09/05 jQuery
Vue2 添加数据可视化支持的方法步骤
2019/01/02 Javascript
学前端,css与javascript重难点浅析
2020/06/11 Javascript
[01:32]完美世界DOTA2联赛10月29日精彩集锦
2020/10/30 DOTA
使用python检测主机存活端口及检查存活主机
2015/10/12 Python
python实现AES加密和解密
2019/03/27 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
django-rest-swagger对API接口注释的方法
2019/08/29 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
python使用matplotlib绘制折线图的示例代码
2020/09/22 Python
老师自我鉴定范文
2013/12/25 职场文书
青年教师典范事迹材料
2014/01/31 职场文书
九华山导游词
2015/02/03 职场文书
实施意见格式范本
2015/06/05 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
MySQL 逻辑备份与恢复测试的相关总结
2021/05/14 MySQL
只用50行Python代码爬取网络美女高清图片
2021/06/02 Python