我在后台运行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;
}
但是,日志文件会一直保持更新,直到脚本完成执行。如何从同一页面上的文件重新加载更新的内容?
答案 0 :(得分:1)
答案 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)
}
}
})
}
后端脚本然后就像这样循环:
后端脚本返回的数据结构是JSON:
{
Error: // 0 or 1,
Lines: // Number of lines
Text: // New lines from log file
}
这与UNIX中的'tail -f'类似,但在浏览器中也是如此!