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简介
Oct 09 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
php打开文件fopen函数的使用说明
Jul 05 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 PHP
thinkphp中memcache的用法实例
Nov 29 PHP
PHP与Java对比学习日期时间函数
Jul 03 PHP
PHP数据对象PDO操作技巧小结
Sep 27 PHP
iOS+PHP注册登录系统 PHP部分(上)
Dec 26 PHP
PHP实现RSA签名生成订单功能【支付宝示例】
Jun 06 PHP
php生成条形码的图片的实例详解
Sep 13 PHP
浅谈Laravel核心解读之Console内核
Dec 02 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读写文件的方法(生成HTML)
2006/11/27 PHP
探讨php define()函数及defined()函数使用详解
2013/06/09 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP实现原生态图片上传封装类方法
2016/11/08 PHP
fancybox1.3.1 基于Jquery的插件在IE中图片显示问题
2010/10/01 Javascript
jquery全选/全不选/反选另一种实现方法(配合原生js)
2013/04/07 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
JS建造者模式基本用法实例分析
2015/06/30 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
JS获取及验证开始结束日期的方法
2016/08/20 Javascript
JS控制页面跳转时未请求要跳转的地址怎么回事
2016/10/14 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
js实现将json数组显示前台table中
2017/01/10 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
js 将线性数据转为树形的示例代码
2019/05/28 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
[01:59]翻天覆地,因你而变,7.20版本地图更新速览
2018/11/24 DOTA
实例讲解python函数式编程
2014/06/09 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
python添加模块搜索路径方法
2017/09/11 Python
python实现顺序表的简单代码
2018/09/28 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Python fileinput模块如何逐行读取多个文件
2020/10/05 Python
移动端HTML5 input常见问题(小结)
2020/09/28 HTML / CSS
Carmen Sol官网:购买果冻鞋、手袋和配件
2021/01/01 全球购物
《水乡歌》教学反思
2014/04/24 职场文书
五水共治一句话承诺
2014/05/30 职场文书
会计学专业自荐信
2014/06/25 职场文书
公司感恩节活动策划书
2014/10/11 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
二年级上册数学教学计划
2015/01/20 职场文书
超市员工辞职信范文
2015/05/12 职场文书
2016年“12.4”法制宣传日活动总结
2016/04/01 职场文书
导游词之镇江西津古渡
2019/11/06 职场文书
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle