2010-07-10 20 views
9

Tôi muốn đọc tệp nhật ký liên tục được ghi vào. Nó nằm trên cùng một máy chủ như ứng dụng. Việc nắm bắt được các tập tin được ghi vào mỗi vài giây, và tôi về cơ bản muốn tail các tập tin trên ứng dụng trong thời gian thực.PHP: Cách đọc tệp trực tiếp liên tục được ghi vào

Điều này có khả thi không?

Trả lời

21

Bạn cần phải lặp với giấc ngủ:

$file='/home/user/youfile.txt'; 
$lastpos = 0; 
while (true) { 
    usleep(300000); //0.3 s 
    clearstatcache(false, $file); 
    $len = filesize($file); 
    if ($len < $lastpos) { 
     //file deleted or reset 
     $lastpos = $len; 
    } 
    elseif ($len > $lastpos) { 
     $f = fopen($file, "rb"); 
     if ($f === false) 
      die(); 
     fseek($f, $lastpos); 
     while (!feof($f)) { 
      $buffer = fread($f, 4096); 
      echo $buffer; 
      flush(); 
     } 
     $lastpos = ftell($f); 
     fclose($f); 
    } 
} 

(thử nghiệm .. nó hoạt động)

+0

Trang không tải ... trông nó bị mắc kẹt trong một vòng lặp infite – HyderA

+3

@gAMBOOKa Hãy thử thêm một tuôn ra sau khi tiếng vang. Và có, nó trong một vòng lặp vô hạn. Đó không phải là vấn đề? – Artefacto

-1

Chỉ cần một ý tưởng ..

Bạn có nghĩ đến việc sử dụng * nix đuôi lệnh? thực thi lệnh từ php (với một tham số sẽ trả về một số dòng nhất định) và xử lý các kết quả trong tập lệnh php của bạn.

+0

Bạn có thể không bao giờ chắc chắn có bao nhiêu dòng được viết giữa các cuộc gọi :) – bisko

0

bạn có thể đóng bộ xử lý tệp khi nó không được sử dụng (khi một phần dữ liệu đã được viết). hoặc bạn có thể sử dụng bộ đệm để lưu trữ dữ liệu và đặt nó vào tệp chỉ khi nó đầy. theo cách này, bạn sẽ không mở tập tin mọi lúc.

nếu bạn muốn nhận mọi thứ được ghi vào tệp ngay khi được viết ở đó, bạn có thể cần phải mở rộng mã, ghi dữ liệu, sao cho nó cũng sẽ xuất sang các vị trí khác (màn hình, một số biến , khác tập tin ...)

0

Ví dụ:

$log_file = '/tmp/test/log_file.log'; 

$f = fopen($log_file, 'a+'); 
$fr = fopen($log_file, 'r'); 

for ($i = 1; $i < 10; $i++) 
{ 
    fprintf($f, "Line: %u\n", $i); 
    sleep(2); 
    echo fread($fr, 1024) . "\n"; 
} 

fclose($fr); 
fclose($f); 

//Or if you want use tail 

$f = fopen($log_file, 'a+'); 

for ($i = 1; $i < 10; $i++) 
{ 
    fprintf($f, "Line: %u\n", $i); 
    sleep(2); 
    $result = array(); 
    exec('tail -n 1 ' . $log_file, $result); 
    echo "\n".$result[0]; 
} 

fclose($f); 
Các vấn đề liên quan