2010-07-10 56 views

回答

21

您需要循環睡眠:

$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); 
    } 
} 

(測試..它的工作原理)

+0

該頁面無法加載......看起來它卡在一個infite循環中 – HyderA 2010-07-11 02:24:17

+3

@gAMBOOKa嘗試在echo之後添加一個flush。是的,這是一個無限循環。這不是重點嗎? – Artefacto 2010-07-11 09:54:33

-1

只是一個想法..

您是否想過使用* nix tail命令?從PHP執行命令(帶有一個將返回一定數量的行的參數)並在你的php腳本中處理結果。

+0

您可能無法確定在多次呼叫之間寫入了多少行:) – bisko 2010-07-10 12:51:44

0

您可以在不使用文件句柄時關閉文件句柄(一旦寫入了一部分數據)。或者您可以使用緩衝區來存儲數據,並僅在文件已滿時將其放入文件。這樣你就不會一直打開文件。

如果您想要在寫入文件時立即獲得寫入文件的所有內容,則可能需要擴展代碼,寫入數據,以便將其輸出到其他位置(屏幕,某些變量,其他文件...)

0

例如:

$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);