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 相关文章推荐
mysql总结之explain
Feb 27 PHP
php-fpm配置详解
Feb 12 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
PHP 读取和编写 XML
Nov 19 PHP
两个php日期控制类实例
Dec 09 PHP
PHP中使用array函数新建一个数组
Nov 19 PHP
thinkPHP统计排行与分页显示功能示例
Dec 02 PHP
php+Memcached实现简单留言板功能示例
Feb 15 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 PHP
Laravel框架实现的批量删除功能示例
Jan 16 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 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
解析php中curl_multi的应用
2013/07/17 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
php mysql like 实现多关键词搜索的方法
2016/10/29 PHP
PHP表单验证内容是否为空的实现代码
2016/11/14 PHP
PHP实现的迪科斯彻(Dijkstra)最短路径算法实例
2017/09/16 PHP
javascript实现阻止iOS APP中的链接打开Safari浏览器
2014/06/12 Javascript
node.js中的fs.fstatSync方法使用说明
2014/12/15 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
理解javascript异步编程
2016/01/27 Javascript
JQuery 设置checkbox值二次无效的解决方法
2016/07/22 Javascript
js实现PC端根据IP定位当前城市地理位置
2017/02/22 Javascript
JS实现移动端实时监听输入框变化的实例代码
2017/04/12 Javascript
js学习总结之DOM2兼容处理顺序问题的解决方法
2017/07/27 Javascript
Nodejs调用WebService的示例代码
2017/09/29 NodeJs
微信小程序左右滑动的实现代码
2017/12/15 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
一个小示例告诉你Python语言的优雅之处
2014/07/04 Python
flask-socketio实现WebSocket的方法
2018/07/31 Python
Python3爬取英雄联盟英雄皮肤大图实例代码
2018/11/14 Python
Pytorch抽取网络层的Feature Map(Vgg)实例
2019/08/20 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
jupyter实现重新加载模块
2020/04/16 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
简单的大学生自我鉴定
2014/02/18 职场文书
机关出纳岗位职责
2014/04/03 职场文书
逃课检讨书怎么写
2015/01/01 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
报案材料怎么写
2015/05/25 职场文书
MySQL 数据类型详情
2021/11/11 MySQL
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers