《PHP教程:PHP实现linux命令tail -f》要点:
本文介绍了PHP教程:PHP实现linux命令tail -f,希望对您有用。如果有疑问,可以联系我们。
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以便利的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.PHP编程
1.命令格式;PHP编程
tail[需要参数][选择参数][文件]PHP编程
2.命令功能:PHP编程
用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理.常用查看日志文件.PHP编程
3.命令参数:PHP编程
-f 循环读取PHP编程
-q 不显示处理信息PHP编程
-v 显示详细的处理信息PHP编程
-c<数目> 显示的字节数PHP编程
-n<行数> 显示行数PHP编程
--pid=PID 与-f合用,表现在进程ID,PID死掉之后结束.PHP编程
-q, --quiet, --silent 从不输出给出文件名的首部PHP编程
-s, --sleep-interval=S 与-f合用,表现在每次反复的间隔休眠S秒PHP编程
本日突然想到之前有人问过我的一个问题,如何通过PHP实现linux中的命令tail -f,这里就来分析实现下.
PHP编程
这个想一想也挺简单,通过一个循环检测文件,看文件的大小是否有变化,如果有变化,输出文件变化的部分,当然了这里面会有好多的细节,这里具体分析下.
PHP编程
如果初始文件太大或者改变内容太多
PHP编程
这个时候一下输出好多内容可能看不清,因此我这里设置了一个阈值8192,当内容长度超过这个阈值的时候,只输出最后面的8192个字节,这样就不会出现大面积的刷新导致看不清的问题.
PHP编程
如何检测文件大小的变化
PHP编程
这个问题是这个程序的核心,能不克不及成功,性能的好坏就靠这部分了.PHP编程
我在这里的实现是下面这样:PHP编程
•打开文件句柄$fp,这里要注意,这里的文件句柄全程需中只打开一次关闭一次,因此要将他放在循环的外面.
•初始化当前文件大小file_size和file_size_new都为0. •循环里面更新file_size_new文件大小,这里要注意,php中获取文件大小之前必定要运行函数clearstatcache(),清除文件状态缓存,否则获取文件大小可能会有偏差.
PHP编程
•计算add_size = file_size_new - file_size,看文件大小是否有变化,如果有变化,将文件指针移动到指定位置,然后输出新加的内容,更新file_size值为new_file_size.
•usleep(50000),睡眠1/20秒.
PHP编程
代码实现
PHP编程
#!/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编程
下面是结果
PHP编程
PHP编程
下文给大家介绍如何实现Linux下高亮关键字的tail -f功能PHP编程
公司内部一哥们发布到邮件列表中的一个小tip,挺有意思,属于程序员的“奇淫技巧”类吧,值得记录一下.
如果你在linux下工作,那用tail -f跟踪一个日志文件的输出内容应该是家常便饭了.
但是,有时你更关心的是一些敏感字词,希望能够在动态跟踪的同时,把这些字词高亮出来,好比日志中的ERROR关键字.
那么,一种思路就是把你tail输出的东西再做一次包装处理,这个很符合linux管道处理的思想.以高亮Log中的ERROR为例,你可以这样:PHP编程
Shell代码PHP编程
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步了:PHP编程
less xxx.log 中/${key_work}的方式搜索你要高亮的关键字.(即使目前文件中没有也不要紧) SHIFT+F,进入follow模式
欢迎参与《PHP教程:PHP实现linux命令tail -f》讨论,分享您的想法,维易PHP学院为您提供专业教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/7524.html