PHP linux 명령 tail-f 구현

tail 명령 은 지정 한 지점 에서 부터 파일 을 표준 출력 에 기록 합 니 다.tail 명령 의-f 옵션 을 사용 하면 변경 중인 로그 파일 을 쉽게 찾 을 수 있 습 니 다.tail-f filename 은 filename 의 맨 끝 부분 내용 을 화면 에 표시 하고 새로 고침 뿐만 아니 라 최신 파일 내용 을 볼 수 있 습 니 다.
1.명령 형식;
tail[필요 매개 변수][매개 변수 선택][파일]
2.명령 기능:
지정 한 파일 의 끝 내용 을 표시 하고 파일 을 지정 하지 않 을 때 입력 정보 로 처리 합 니 다.로그 파일 을 자주 봅 니 다.
3.명령 매개 변수:
-f 순환 읽 기
-q 처리 정보 표시 하지 않 음
-v 자세 한 처리 정보 표시
-c<수>표시 되 는 바이트 수
-n<줄 수>줄 수 보이 기
--pid=PID 와-f 를 함께 사용 하면 프로 세 스 ID,PID 가 죽은 후에 끝 납 니 다.
-q,--quiet,--silent 는 파일 이름 의 첫 번 째 부분 을 출력 하지 않 습 니 다.
-s,--sleep-interval=S 와-f 를 함께 사용 하여 매번 반복 되 는 간격 으로 S 초 간 휴면 하 는 것 을 나타 낸다.
오늘 갑자기 전에 누군가가 나 에 게 물 어 본 질문 이 생각 났 다.어떻게 PHP 를 통 해 Liux 의 명령 tail-f 를 실현 하 는 지 분석 해 보 자.
이것 은 생각해 보 는 것 도 매우 간단 하 다.하나의 순환 을 통 해 파일 의 크기 가 변화 가 있 는 지,변화 가 있 으 면 출력 파일 이 변화 하 는 부분 을 살 펴 보 자.물론 이 안 에는 많은 세부 사항 이 있 을 것 이다.여기 서 구체 적 으로 분석 해 보 자.
초기 파일 이 너무 크 거나 내용 이 너무 많이 바 뀌 면
이때 출력 한 많은 내용 이 잘 보이 지 않 을 수 있 기 때문에 저 는 여기 한도 값 8192 를 설 치 했 습 니 다.내용 의 길이 가 이 한도 값 을 초과 할 때 맨 뒤의 8192 바이트 만 출력 하면 대면 적의 새로 고침 으로 인해 잘 보이 지 않 는 문제 가 발생 하지 않 습 니 다.
파일 크기 의 변 화 를 어떻게 검사 합 니까?
이 문 제 는 이 프로그램의 핵심 이다.성공 할 수 있 느 냐 없 느 냐 하 는 것 이다.성능 의 좋 고 나 쁨 은 바로 이 부분 에 달 려 있다.
내 가 여기 서 의 실현 은 다음 과 같다.
•파일 핸들$fp 를 엽 니 다.이 파일 핸들 은 전체 과정 에서 한 번 만 열 고 닫 아야 하기 때문에 순환 하 는 밖 에 두 어야 합 니 다.
•현재 파일 크기 파일 초기 화 filesize 와 filesize_new 는 모두 0 이다.순환 중 file 업데이트size_새 파일 크기 입 니 다.php 에서 파일 크기 를 가 져 오기 전에 함수 clearstatcache()를 실행 하고 파일 상태 캐 시 를 제거 해 야 합 니 다.그렇지 않 으 면 파일 크기 에 오차 가 있 을 수 있 습 니 다.
•계산 addsize = file_size_new - file_size,파일 크기 에 변화 가 있 는 지 확인 하고 변화 가 있 으 면 파일 포인 터 를 지정 한 위치 로 이동 한 다음 에 새로 추 가 된 내용 을 출력 하여 file 을 업데이트 합 니 다.size 값 은 newfile_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 phop 은 실행 가능 한 파일 을 알려 주 고 실행 가능 한 파일 phop 은 시스템 PATH 에서 찾 습 니 다.이러한 장점 은 이식 성 이 좋다 는 것 입 니 다.
다음은 결과.

리 눅 스에 서 하 이 라이트 키 워드 를 구현 하 는 tail-f 기능 을 소개 합 니 다.
회사 내부 의 한 친구 가 메 일 링 리스트 에 올 린 작은 tip 은 매우 재 미 있 습 니 다.프로그래머 의'기 음 기법'류 에 속 합 니 다.기록 해 볼 만 합 니 다.
만약 당신 이 Liux 에서 일한다 면,tail-f 로 로그 파일 의 출력 내용 을 추적 하 는 것 은 일상적인 일이 될 것 입 니 다.
그러나 가끔 은 민감 한 단어 에 관심 이 많 습 니 다.동적 추적 과 동시에 이 단어 들 을 밝 히 고 싶 습 니 다.예 를 들 어 로그 의 ERROR 키워드 등 입 니 다.
그러면 하나의 사고방식 은 바로 당신 이 tail 에서 출력 한 물건 을 다시 포장 처리 하 는 것 이다.이것 은 linux 파이프 처리 사상 에 부합된다.하 이 라이트 로그 의 ERROR 를 예 로 들 면 이렇게 할 수 있 습 니 다.
셸 코드

tail -f xxx.log | perl -pe 's/(ERROR)/\e[1;31m$1\e[0m/g' 
그 중에서 xxx.log 는 당신 이 추적 할 파일 입 니 다.여기 서 리 눅 스 PATH 에 perl 이 있다 고 가정 했다.perl 이 여기 서 하 는 일 은 명령 행 을 통 해 ERROR 문자열 을 동적 으로 교체 하 는 작업 입 니 다.교체 과정 에서 주로 Linux 의 console 을 사 용 했 습 니 다.codes 의 문법 구조.구체 적 으로 consolecodes 의 디 테 일,man consolecodes 알 아 보기)여기,\e 는 주로 이전 설명 을 합 니 다.
서버 로그 같은 로 그 를 가지 고 있다 면 위의 명령 을 사용 해 보 세 요.ERROR 을 모두 붉 게 표시 한 것 이 아 닙 니까?
이 원 리 를 이용 하여 필요 한 색상 에 따라 관심 있 는 출력 을 밝 힐 수 있 습 니 다.구체 적 인 색상 설명 은 man consolecodes 에서 찾 았 습 니 다.
또한 less 자체 도 tail-f 와 같은 동작 을 지원 합 니 다.less 로 파일 을 열 고 SHIFT+F 키 를 누 르 면 follow 모드 로 바로 들 어 갑 니 다.tail-f 효과 와 일치 하 는 것 같 습 니 다.이 점 을 이용 하여 하 이 라이트 테 일-f 의 효 과 를 얻 으 려 면 모두 다음 과 같은 3 단계 로 나 뉜 다.

less xxx.log
 /${key_work}             。(             )
SHIFT+F,  follow  

좋은 웹페이지 즐겨찾기