2016-12-28 86 views
1

我有一个日志文件,我将数据写入php文件。这是该代码:这是工作从更新日志文件中实时地逐行读取

$filename='/var/log/siawa/dashboard/iot.log'; 

$source_file = fopen($filename, "r") or die("Couldn't open $filename"); 

while (!feof($source_file)) { 
    $buffer = fgets($source_file, 4096); // use a buffer of 4KB 
    $buffer = str_replace($old,$new,$buffer); 
    echo $buffer. "<br />" . "\n"; 
} 

,但我想,一旦它被写在原始日志文件每隔10秒钟后说,以更新PHP的日志数据。怎么做。

回答

2

您需要阅读无限循环中的文件内容while(true)。我会通过代码评论来解释。

// read.php 
<?php 

// Last read position 
$last = 0; 

// Path to the updating log file 
$file = 'log.txt'; 

while (true) { 
    // PHP caches file information in order to provide faster 
    // performance; In order to read the new filesize, we need 
    // to flush this cache. 
    clearstatcache(false, $file); 

    // Get the current size of file 
    $current = filesize($file); 

    // Reseted the file? 
    if ($current < $last) { 
     $last = $current; 
    } 
    // If there's new content in the file 
    elseif ($current > $last) { 
     // Open the file in read mode 
     $fp = fopen($file, 'r'); 

     // Set the file position indicator to the last position 
     fseek($fp, $last); 

     // While not reached the end of the file 
     while (! feof($fp)) { 
      // Read a line and print 
      print fgets($fp); 
     } 

     // Store the current position of the file for the next pass 
     $last = ftell($fp); 

     // Close the file pointer 
     fclose($fp); 
    } 
} 

要进行测试,打开一个终端窗口,并发出:

while true; do echo `date` >> log.txt; sleep 1; done 

这将当前日期时间字符串追加到每个单独第二的文件。现在打开另一个终端并发出php read.php以查看是否正在实时读取文件。它会输出这样的事情:

Wed Dec 28 18:01:12 IRST 2016 
Wed Dec 28 18:01:13 IRST 2016 
Wed Dec 28 18:01:14 IRST 2016 
Wed Dec 28 18:01:15 IRST 2016 
Wed Dec 28 18:01:16 IRST 2016 
Wed Dec 28 18:01:17 IRST 2016 
Wed Dec 28 18:01:18 IRST 2016 
# Keeps updating... 

如果你倾向于通过HTTP服务这一点,你需要打印读取缓冲区后添加ob_flush()电话:

// While not reached the end of the file 
while (! feof($fp)) { 
    print fgets($fp) . '<br>'; 

    // Flush the output cache 
    ob_flush(); 
}