PHP实现linux命令tail -f
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中查找,这样的好处就是移植性好。
下面是结果
下文给大家介绍如何实现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模式
上一篇: spring配置文件加密方法示例
下一篇: 了解java中的session
推荐阅读
-
PHP实现linux命令tail -f
-
PHP执行linux命令常用函数汇总
-
PHP执行linux系统命令的常用函数使用说明
-
linux下面覆盖文件,如何实现直接覆盖,不提示 博客分类: Linux Linux cp命令
-
linux下面覆盖文件,如何实现直接覆盖,不提示 博客分类: Linux Linux cp命令
-
update-alternatives命令实现ubuntu下jdk切换 博客分类: linux jdkubuntu
-
Unix Linux Find 命令 博客分类: Unix/Linux UnixLinuxFind命令find . -type f -name data.txt
-
linux查看日志文件内容命令tail、cat、tac、head、echo 博客分类: linux linux
-
linux查看日志文件内容命令tail、cat、tac、head、echo 博客分类: linux linux
-
PHP在linux上执行外部命令的方法