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 base64+gzinflate压缩编码和解码代码
Oct 03 PHP
PHP+ajax 无刷新删除数据
Feb 20 PHP
深入Apache与Nginx的优缺点比较详解
Jun 17 PHP
php计算两个日期时间差(返回年、月、日)
Jun 19 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
封装ThinkPHP的一个文件上传方法实例
Oct 31 PHP
PHP实现无限级分类(不使用递归)
Oct 22 PHP
PHP基于yii框架实现生成ICO图标
Nov 13 PHP
PHP实现求两个字符串最长公共子串的方法示例
Nov 17 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
Nov 16 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
laravel实现查询最后执行的一条sql语句的方法
Oct 09 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自定义函数实现代码
2011/12/30 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
基于jquery的兼容各种浏览器的iframe自适应高度的脚本
2010/08/13 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
简单介绍JavaScript中字符串创建的基本方法
2015/07/07 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
最新Javascript程序员面试试题和解题方法
2017/11/23 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
[36:54]Mineski vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现在sqlite动态创建表的方法
2015/05/08 Python
Python实现将绝对URL替换成相对URL的方法
2015/06/28 Python
python实时分析日志的一个小脚本分享
2017/05/07 Python
python 读取数据库并绘图的实例
2019/12/03 Python
Python autoescape标签用法解析
2020/01/17 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
2016/12/14 HTML / CSS
Etam德国:内衣精品店
2019/08/25 全球购物
Wiggle新西兰:自行车、跑步、游泳
2020/05/06 全球购物
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
财务会计专业求职信范文
2013/12/31 职场文书
党员承诺践诺书
2014/05/20 职场文书
白岩松演讲
2014/05/21 职场文书
领导班子四风问题对照检查材料
2014/09/27 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
2019思想汇报范文
2019/05/21 职场文书
2019年圣诞节祝福语集锦
2019/12/25 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
python脚本框架webpy模板控制结构
2021/11/20 Python
html网页引入svg图片的4种方式
2022/08/05 HTML / CSS