2009-07-09 4 views
15

PHP로 tail 명령과 같은 움직임을 만들고 싶습니다 ( ). 어떻게 파일에 추가를 볼 수 있습니까?PHP에서 파일 쓰기를 보는 방법은?

+2

는 http://code.google.com/p/php-tail/ – Peeter

+0

는 Packagist에서 사용 가능 : https://packagist.org/packages/icyapril/tail 안녕, 귀하의 솔루션은 불타는 것 같다 – mjsa

답변

24

의 사용을 고려하는 것이 좋습니다. 파일 크기를 지속적으로 폴링하고 새로운 데이터를 출력하면됩니다. 이것은 실제로 매우 쉽고주의해야 할 유일한 사실은 파일 크기와 다른 통계 데이터가 PHP에 캐시된다는 것입니다. 이에 대한 해결책은 데이터를 출력하기 전에 clearstatcache()으로 전화하는 것입니다.

function follow($file) 
{ 
    $size = 0; 
    while (true) { 
     clearstatcache(); 
     $currentSize = filesize($file); 
     if ($size == $currentSize) { 
      usleep(100); 
      continue; 
     } 

     $fh = fopen($file, "r"); 
     fseek($fh, $size); 

     while ($d = fgets($fh)) { 
      echo $d; 
     } 

     fclose($fh); 
     $size = $currentSize; 
    } 
} 

follow("file.txt"); 
+0

많은 CPU (내 테스트 설정에서 + 40 %). 폴더를보다 효율적으로 볼 수있는 방법이 있습니까? – Coyote

+1

'usleep (100)'이 1 초 당 100 만분의 1 초 또는 0.0001 초 동안 잠자고 있습니다. 매우 낮은 대기 시간을 필요로하지 않는 한 CPU 사용량을 줄이려면 'usleep (10000)'(0.01s)로 늘리십시오. 'usleep (2000000)'또는'sleep (2)'(2s)는 당신이 흘끗 보았을 때 합리적으로 신선한 것을 원한다. – ReactiveRaven

+0

이 코드를 시도했지만 성공하지 못했습니다 ... 브라우저가 계속 로딩을 계속합니다 ... 그리고 아무 반응이 없습니다 .. – ihtus

2
$handler = fopen('somefile.txt', 'r'); 

// move you at the end of file 
fseek($handler, filesize()); 
// move you at the begining of file 
fseek($handler, 0); 

그리고 아마도 당신은 내가 그것을 할 몇 가지 마법의 방법이 있다고 생각하지 않습니다 stream_get_line

2

대신 폴링 파일 크기는 일반 파일의 수정 시간 확인 : filemtime

+3

둘 다 표면 밑에 stat() 호출이 필요하므로, 별 문제가되지 않는다. –

5

체크 아웃 php-tail on Google code

여기에 오류 처리를 포함하지 않는 빠른 샘플입니다. PHP와 Javascript를 사용하는 2 파일 구현이며, 테스트시 오버 헤드가 거의 없습니다.

grep 키워드로 필터링을 지원합니다 (프레임 속도 등을 매초마다 울리는 ffmpeg에 유용합니다).

11
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r'); 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo "$buffer\n"; 
    flush(); 
} 
pclose($handle); 
+0

아파치 서버가 충돌합니다 .. 나만이 일을합니까? – dctremblay

+0

에러 로그에서 단서를 확인하십시오.하지만 아파치 프로세스를 중단해서는 안됩니다. –

0

다음은 위에서 변경 한 내용입니다. 주기적으로 Ajax 호출로 호출하고 'holder'(textarea)에 추가하십시오. 희망이 있습니다 ... stackoverflow 및 기타 포럼에 기여하는 여러분 모두에게 감사드립니다!

/* Used by the programming module to output debug.txt */ 
session_start(); 
$_SESSION['tailSize'] = filesize("./debugLog.txt"); 
if($_SESSION['tailPrevSize'] == '' || $_SESSION['tailPrevSize'] > $_SESSION['tailSize']) 
{ 
     $_SESSION['tailPrevSize'] = $_SESSION['tailSize']; 
} 
$tailDiff = $_SESSION['tailSize'] - $_SESSION['tailPrevSize']; 
$_SESSION['tailPrevSize'] = $_SESSION['tailSize']; 

/* Include your own security checks (valid user, etc) if required here */ 

if(!$valid_user) { 
    echo "Invalid system mode for this page."; 
} 
$handle = popen("tail -c ".$tailDiff." ./debugLog.txt 2>&1", 'r'); 
while(!feof($handle)) { 
    $buffer = fgets($handle); 
    echo "$buffer"; 
    flush(); 
} 
pclose($handle); 
관련 문제