찾다
php教程PHP源码PHP는 Linux 명령 tail -f를 구현합니다.

PHP는 Linux 명령 tail -f를 구현합니다.

오늘 문득 예전에 누군가가 나에게 물었던 질문이 떠올랐습니다. Linux 명령 tail -f를 PHP를 통해 구현하는 방법을 여기에서 분석하고 구현하겠습니다.

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

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

이때 많은 내용이 한꺼번에 출력되어 선명하게 보이지 않을 수 있으므로 여기서는 임계값 8192입니다. 콘텐츠 길이가 이 임계값을 초과하면 마지막 8192바이트만 출력되므로 넓은 영역 새로 고침으로 인해 가시성이 불분명해지는 문제가 없습니다.

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

이 질문이 이 프로그램의 핵심입니다. 이 부분의 성능에 따라 성공 여부가 결정됩니다. 여기에서의 구현은 다음과 같습니다.

파일 핸들 $fp를 엽니다. 여기에서 파일 핸들은 전체 프로세스에서 한 번만 열고 닫아야 하므로 외부에 배치해야 합니다. 고리.

현재 파일 크기 file_size 및 file_size_new를 0으로 초기화합니다.

file_size_new 파일 크기는 루프에서 업데이트됩니다. PHP에서 파일 크기를 가져오기 전에, 파일 상태 캐시를 지우려면 cleanstatcache() 함수를 실행해야 합니다. 그렇지 않으면 오류가 발생할 수 있습니다. 파일 크기를 얻는 데 편차가 발생합니다.

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는 Linux 명령 tail -f를 구현합니다.

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경