PHP에서 Linux 명령을 구현하는 방법: 1. PHP 샘플 파일을 만듭니다. 2. 첫 번째 줄에 "#!/usr/bin/env php"를 입력합니다. 3. "if(2 != count($argv) )" ){...}" 및 기타 코드는 Linux 명령 "tail -f"를 구현할 수 있습니다.
이 기사의 운영 환경: linux5.9.8 시스템, PHP 버전 7.1, Dell G3 컴퓨터.
PHP에서 Linux 명령을 구현하는 방법은?
PHP에서 Linux 명령을 구현하는 방법 tail -f
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
。#!/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
中查找,这样的好处就是移植性好。
2016-02-22 11:28:51改进
查了PHP官方手册,fseek
函数这里可以改进改进,这个函数还接受第三个参数,表示偏移指针的类型,默认是SEEK_SET
,从开始偏移,还可以设置为SEEK_CUR
,表示从当前位置偏移,因此这里改为fseek($fp, $ignore_size, $ignore_size);
tail -f
를 통해 Linux의 명령을 분석하고 구현해 보겠습니다. 생각해보면 아주 간단합니다. 파일 크기가 변경되었는지 확인하기 위해 루프를 통해 파일의 변경된 부분을 출력합니다. 거기에 많은 세부 사항이 있습니다. 여기에 자세한 분석이 있습니다.
이때 많은 내용이 한꺼번에 출력됩니다 명확하게 표시되지 않을 수 있으므로 여기에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
입니다. #!/usr/bin/env php는 실행 파일 <code>php
가 시스템 PATH
에서 검색되어야 함을 알려줍니다. 이 방법의 장점은 이식성이 좋다는 것입니다. 🎜🎜🎜2016-02-22 11:28:51Improvement🎜🎜🎜PHP 공식 매뉴얼을 확인한 결과 fseek
함수를 개선할 수 있는 것으로 나타났습니다. 이 함수는 세 번째 매개변수도 허용합니다. 오프셋 포인터 유형, $ignore_size, $ignore_size);🎜🎜다음은 결과입니다🎜🎜🎜🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜위 내용은 PHP에서 Linux 명령을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!