php实现linux命令的方法:1、创建一个php示例文件;2、在第一行输入“#!/usr/bin/env php”;3、通过“if(2 != count($argv)){…}”等代码实现linux命令“tail -f”即可。
本文操作环境:linux5.9.8系统,php7.1版,dell g3电脑。
php怎么实现linux命令?
php实现linux命令tail -f
今天突然想到之前有人问过我的一个问题,如何通过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 <?phpif(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中查找,这样的好处就是移植性好。
2016-02-22 11:28:51改进
查了php官方手册,fseek函数这里可以改进改进,这个函数还接受第三个参数,表示偏移指针的类型,默认是seek_set,从开始偏移,还可以设置为seek_cur,表示从当前位置偏移,因此这里改为fseek($fp, $ignore_size, $ignore_size);
下面是结果
推荐学习:《php视频教程》
2020年购买云服务器合适网站建设关键词如何定位?河北服务器出租云空间多少钱一个在线ssl证书申请的步骤是怎么样的?国内ssl证书比较好的是哪家?如何根据安全等级来选择ssl证书?江苏服务器公司云主机价格软件开发是什么域名有哪些类型 国际域名查询方法