>백엔드 개발 >PHP 문제 >PHP에서 Linux 명령을 구현하는 방법

PHP에서 Linux 명령을 구현하는 방법

藏色散人
藏色散人원래의
2021-12-08 11:00:493541검색

PHP에서 Linux 명령을 구현하는 방법: 1. PHP 샘플 파일을 만듭니다. 2. 첫 번째 줄에 "#!/usr/bin/env php"를 입력합니다. 3. "if(2 != count($argv) )" ){...}" 및 기타 코드는 Linux 명령 "tail -f"를 구현할 수 있습니다.

PHP에서 Linux 명령을 구현하는 방법

이 기사의 운영 환경: linux5.9.8 시스템, PHP 버전 7.1, Dell G3 컴퓨터.

PHP에서 Linux 명령을 구현하는 방법은?

PHP에서 Linux 명령을 구현하는 방법 tail -ftail -f

今天突然想到之前有人问过我的一个问题,如何通过PHP实现linux中的命令tail -f,这里就来分析实现下。

这个想一想也挺简单,通过一个循环检测文件,看文件的大小是否有变化,如果有变化,输出文件变化的部分,当然了这里面会有好多的细节,这里具体分析下。

如果初始文件太大或者改变内容太多

这个时候一下输出好多内容可能看不清,因此我这里设置了一个阈值8192,当内容长度超过这个阈值的时候,只输出最后面的8192个字节,这样就不会出现大面积的刷新导致看不清的问题。

如何检测文件大小的变化

这个问题是这个程序的核心,能不能成功,性能的好坏就靠这部分了。
我在这里的实现是下面这样:

  • 打开文件句柄$fp,这里要注意,这里的文件句柄全程需中只打开一次关闭一次,因此要将他放在循环的外面。
  • 初始化当前文件大小file_sizefile_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中查找,这样的好处就是移植性好。

2016-02-22 11:28:51改进

查了PHP官方手册,fseek函数这里可以改进改进,这个函数还接受第三个参数,表示偏移指针的类型,默认是SEEK_SET,从开始偏移,还可以设置为SEEK_CUR,表示从当前位置偏移,因此这里改为fseek($fp, $ignore_size, $ignore_size);

오늘 문득 예전에 누군가 나에게 물었던 질문이 생각났습니다. PHP tail -f를 통해 Linux의 명령을 분석하고 구현해 보겠습니다.

생각해보면 아주 간단합니다. 파일 크기가 변경되었는지 확인하기 위해 루프를 통해 파일의 변경된 부분을 출력합니다. 거기에 많은 세부 사항이 있습니다. 여기에 자세한 분석이 있습니다.

초기 파일이 너무 크거나 변경된 내용이 너무 많은 경우

이때 많은 내용이 한꺼번에 출력됩니다 명확하게 표시되지 않을 수 있으므로 여기에8192 임계값을 설정했습니다. 콘텐츠 길이가 이 임계값을 초과하면 마지막 8192 바이트만 출력됩니다. 대면적 갱신으로 인해 시인성이 불분명해지는 문제가 없습니다.

파일 크기 변화를 감지하는 방법

이 질문이 이 프로그램의 핵심입니다. 이 부분의 성능에 따라 성공 여부가 결정됩니다.
여기서 구현한 내용은 다음과 같습니다. 🎜
  • $fp 파일 핸들을 엽니다. 여기에서 파일 핸들은 한 번만 열고 닫아야 한다는 점에 유의해야 합니다. 전체 과정에서 루프 외부에 두십시오.
  • 현재 파일 크기 file_sizefile_size_new를 모두 0으로 초기화합니다.
    • file_size_new 파일 크기는 루프에서 업데이트됩니다. PHP에서 파일 크기를 얻기 전에 clearstatcache() 함수를 실행해야 합니다. 파일 상태 캐시를 지우십시오. 그렇지 않으면 파일 크기를 얻는 데 편차가 있을 수 있습니다.
    • add_size = file_size_new - file_size를 계산하여 파일 크기가 변경되었는지 확인합니다. 그렇다면 파일 포인터를 지정된 위치로 이동한 다음 새로 추가된 내용을 출력하고 file_size 값은 new_file_size입니다.
    • usleep(50000), 1/20초 동안 잠자기.

코드 구현🎜rrreee🎜코드 구현 여기서 첫 번째 줄은 #!/usr/bin/env php는 실행 파일 <code>php가 시스템 PATH에서 검색되어야 함을 알려줍니다. 이 방법의 장점은 이식성이 좋다는 것입니다. 🎜🎜🎜2016-02-22 11:28:51Improvement🎜🎜🎜PHP 공식 매뉴얼을 확인한 결과 fseek 함수를 개선할 수 있는 것으로 나타났습니다. 이 함수는 세 번째 매개변수도 허용합니다. 오프셋 포인터 유형, $ignore_size, $ignore_size);🎜🎜다음은 결과입니다🎜🎜🎜🎜🎜추천 학습: "🎜PHP 비디오 튜토리얼🎜"🎜

위 내용은 PHP에서 Linux 명령을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.