2009-07-09 26 views

Trả lời

24

Tôi không tin rằng có một số cách kỳ diệu để làm điều đó. Bạn chỉ cần liên tục thăm dò ý kiến ​​kích thước tệp và xuất bất kỳ dữ liệu mới nào. Điều này thực sự khá dễ dàng và điều thực sự duy nhất cần chú ý là kích thước tệp và dữ liệu thống kê khác được lưu trong php. Giải pháp cho việc này là gọi clearstatcache() trước khi xuất bất kỳ dữ liệu nào.

Đây là một mẫu nhanh chóng, mà không bao gồm bất kỳ xử lý lỗi:

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

Hi, giải pháp của bạn dường như được đốt cháy một nhiều CPU (+ -40% trên cấu hình thử nghiệm của tôi). Có bất kỳ con trỏ nào để xem thư mục hiệu quả hơn không? – Coyote

+1

'usleep (100)' đang ngủ trong 100 phần nghìn giây, hoặc trong 0,0001 giây. Tăng giá trị này lên 'usleep (10000)' (0,01s) để sử dụng CPU thấp hơn trừ khi bạn cần độ trễ cực kỳ thấp. 'usleep (2000000)' hoặc 'sleep (2)' (2s) cho một cái gì đó mà bạn chỉ muốn một cách hợp lý mới khi bạn lướt qua nó. – ReactiveRaven

+0

Tôi đã thử mã này, nhưng không thành công ... trình duyệt giữ tải ... và không lặp lại .. – 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); 

Và có lẽ bạn sẽ muốn xem xét việc sử dụng của stream_get_line

2

Thay vì bỏ phiếu filesize bạn thường xuyên kiểm tra các tập tin thời gian chỉnh sửa: filemtime

+3

Cả hai yêu cầu một stat() gọi bên dưới bề mặt, do đó, nó không thực sự quan trọng. –

5

Thanh toán php-tail on Google code. Đó là một tập tin thực hiện 2 với PHP và Javascript và nó có rất ít chi phí trong thử nghiệm của tôi.

Nó thậm chí còn hỗ trợ lọc bằng từ khóa grep (hữu ích cho ffmpeg, tốc độ khung hình sẽ xuất hiện mỗi giây).

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

Nó sụp đổ máy chủ apache .. Làm điều này chỉ với tôi? – dctremblay

+0

Kiểm tra nhật ký lỗi của bạn để tìm manh mối, nhưng điều này sẽ không làm hỏng quá trình apache của bạn. –

0

Dưới đây là những gì tôi đã thích nghi từ trên cao. Gọi nó định kỳ với một cuộc gọi ajax và nối thêm vào 'chủ của bạn' (textarea) ... Hy vọng điều này sẽ giúp ... cảm ơn tất cả các bạn, những người đóng góp cho stackoverflow và các diễn đàn như vậy!

/* 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); 
Các vấn đề liên quan