【问题标题】:PHP/Javascript - read only added lines in real time from huge log filePHP/Javascript - 从巨大的日志文件中实时读取添加的行
【发布时间】:2015-06-01 17:29:43
【问题描述】:

我几天来一直在寻找类似的东西,但我找不到任何东西。我对Javascript的了解非常有限,所以我在这里请你们帮助我。

基本上我需要一个 PHP 脚本,它可以实时读取一个巨大的日志 .txt 文件(无需刷新页面),该文件会不断更新。但它应该只读取自从我打开我的 .php 页面以来已写入文件的最新行。这意味着如果我刷新我的页面,它必须从头开始加载新行。

我现在得到了这个(catchlogs.php):

$f = fopen("test.txt", 'r');

$maxLineLength = 1000;
$linesToRead = 1;

fseek($f, -$maxLineLength*$linesToRead, SEEK_END);
$res = array();

while (($buffer = fgets($f, $maxLineLength)) !== false) {
    $res[] = $buffer;
}

$content = array_slice($res, -$linesToRead);

for($i = 0; $i < $linesToRead; $i++) {
    echo $content[$i]."<br>";
}

还有这个(logreader.php):

<script type="text/javascript">
var auto_refresh = setInterval(
(function () {
    $("#logreader").load("catchlogs.php");
}), 1000);
</script>
<div id="logreader"></div>

这会加载最新的 10 行,但每秒对它们进行切片。我不需要有限的行数,我需要一个脚本,从最后一行开始加载行,直到我刷新页面(或关闭它或其他)。

谢谢!

【问题讨论】:

  • 使用ftell() 在完成读取运行时获取 EOL 偏移量,将其存储在会话 var 中,然后在下一个 ajax 请求进入时使用 fseek() 到该位置。
  • 请注意,在 jQuery 中使用 $.load() 可能会遇到缓存问题(服务器端和客户端)。因为它默认使用 GET。您应该改用 POST

标签: javascript php file time fopen


【解决方案1】:

这是你的脚本,我测试过。

catchlogs.php

define("LOG_FILE", "test.txt");

/* function to count lines from a file */
function count_line_numbers($file){
    $linecount = 0;
    $handle = fopen($file, "r");
    while(!feof($handle)){
      $line = fgets($handle);
      $linecount++;
    }
    fclose($handle);
    // return results
    return $linecount;
}

/* show all lines from line */
function logs_started_by_line($file, $xline = 0){
    $currline = 0;
    $handle = fopen($file, "r");
    while(!feof($handle)){
        $line = fgets($handle, 2000);
        if($xline <= $currline)
            echo $line."<br>";
        $currline++;
    }
    fclose($handle);
}



session_start();

if(isset($_GET['do'])){ $_SESSION['start'] = -1; }

if( ! isset($_SESSION['start']) || $_SESSION['start'] == -1 ){
    $_SESSION['start'] = count_line_numbers(LOG_FILE);
}

logs_started_by_line( LOG_FILE, $_SESSION['start'] );

logreader.php

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
    $("#logreader").load("catchlogs.php?do=refresh");
    var auto_refresh = setInterval(
    (function () {
        $("#logreader").load("catchlogs.php");
    }), 1000);
});

</script>
<div id="logreader"></div>

test.txt

line 1
new log
something..

【讨论】:

  • 您是否在文件很大(例如 2 GB)时对其进行了测试?
  • 这与测试文件完美配合,我会在 1/2 GB 文件上使用它,如已经询问过的那样,我会遇到任何内存问题吗?无论如何,谢谢你,这很棒!
  • 你会的,因为file 将整个文件内容读取到一个数组中,因此我对 Mihai 的问题。
  • 现在,没关系 @reyy 。我针对大文件进行了优化。只需用新代码更改 catchlogs.php。
  • 完美处理 1.2 GB 的文件,谢谢!
【解决方案2】:

最完美的解决方案 - 使用 Node-Webkit 并监听 tail -f /path/to/log

【讨论】:

    猜你喜欢
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2011-05-01
    相关资源
    最近更新 更多