使用AJAX从页面上的日志文件重新加载内容

时间:2010-10-28 15:28:02

标签: php javascript ajax

我在后台运行shell脚本并将输出重定向到php中的日志文件。我想在页面上显示日志文件中的内容。我可以使用下面的代码来做到这一点。

<?php   
    $logfile = "hello";  
?>
function displayOutput()
{
    var html = <?php
        echo filesize($logfile)
            ? json_encode(file_get_contents($logfile))
            : '"Log file is getting generated"'; 
        ?>;
    document.form.text1.value = html;
}

但是,日志文件会一直保持更新,直到脚本完成执行。如何从同一页面上的文件重新加载更新的内容?

4 个答案:

答案 0 :(得分:1)

我在这里开发+讨论的技术可能很有用:

http://commavee.com/2007/04/13/ajax-logfile-tailer-viewer/

已经存在了一段时间+运作良好。

答案 1 :(得分:0)

您需要设置一个间隔计时器,每隔n秒调用您的函数。看看这个答案可以帮助你 - how to schedule ajax calls every N seconds?

setInterval(displayOutput, (10 * 1000));
// reload log contents every 10 seconds

答案 2 :(得分:0)

也许你想要基本的XMLHttpRequest用法。

我不是真正的php家伙,neiter javascript guru,只是想给你一个想法

function refreshText()
{
    if (window.XMLHttpRequest)
    {
        xhttp = new XMLHttpRequest();
    }
    else // for IE 5/6, just in case
    {
        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xhttp.open("GET","/page.php?action=download_log_file", false);
    xhttp.send();

    document.form.text1.value = xhttp.responseXML;
}
setInterval(refreshText, (10 * 1000)); // refresh text1.value every 10 seconds

使用jQuery同样的事情

setInterval(function {
        $.get('/page.php?action=download_log_file', function(data) {
            $('#text1').val(data);
        });
}, (10 * 1000));

服务器上的处理程序脚本只打印文件数据,请参阅 例如http://www.w3schools.com/xml/xml_server.asp

答案 3 :(得分:0)

我最近实现了“COMET-like”功能。它的工作方式是使用长超时的AJAX轮询:

var lines = 0 

function getLog(file, lines) {

    $.ajax({
              type:     'POST',
              url:      'http://thissite.com/getLogFile.php?File=' + file + '&Lines=' + lines,
              dataType: 'json',
              timeout:  400000,
        error:
            function() {
                return false;
            },
        success:
            function(data) {
                if (data.Error) {
                    alert(data.Message)
                } else {
                    if (data.Lines > lines) {
                        // do something with data.LogLines, e.g. add to a textarea
                    }
                    getLogFile(file, data.Lines)
                }
            }
    })
}

后端脚本然后就像这样循环:

  1. 计算日志文件中的行数
  2. 如果它与线条一样,睡觉(比如说一秒钟),那么请回到1
  3. 如果行数较大,则返回新行和新行数,然后退出
  4. 经过一些迭代(我使用100)后,退出并返回现有的行数
  5. 后端脚本返回的数据结构是JSON:

    {
        Error: // 0 or 1,
        Lines: // Number of lines
        Text: // New lines from log file
    }
    

    这与UNIX中的'tail -f'类似,但在浏览器中也是如此!