【发布时间】:2014-11-06 00:46:34
【问题描述】:
我正在尝试使用 ajax 和 perl 更新我网页上的 div。这就是我目前所拥有的,并且很有效。
html
<h2 id="cpu">--</h2>
js/ajax 调用
$.ajax({
type: 'GET',
url: '/cgi-bin/cpu.pl',
async: true,
success: function(data) {
$('#cpu').html(data);
}
});
perl
#!/usr/bin/perl
# Ref: Calculating CPU Usage from /proc/stat
# (http://colby.id.au/node/39)
use strict;
use warnings 'all';
use utf8;
use List::Util qw(sum);
$| = 1;
my ( $prev_idle, $prev_total ) = qw(0 0);
while () {
open( STAT, '/proc/stat' ) or die "WTF: $!";
while (<STAT>) {
next unless m{^cpu\s+[0-9]+};
my @cpu = split ' ', $_;
shift @cpu;
my $idle = $cpu[3];
my $total = sum(@cpu);
my $diff_idle = $idle - $prev_idle;
my $diff_total = $total - $prev_total;
my $diff_usage = 100 * ( $diff_total - $diff_idle ) / $diff_total;
$prev_idle = $idle;
$prev_total = $total;
print "Content-type: text/html \n\n";
printf "%0.2f%% \r", $diff_usage;
}
close STAT;
}
这部分有效,因为它确实用百分比更新了 h2,但只更新了一次。我确实有它,它在循环内说sleep 1;,并且从命令行执行它效果很好但是当我将它与ajax一起使用并查看网络时,对于cpu.pl它总是说状态挂起并且它从未改变.
我不确定我是否会以正确的方式解决这个问题。所以任何帮助都会很棒,谢谢。
【问题讨论】:
-
看来你对ajax的工作方式有误解,一旦收到任何数据就不是开放连接
-
对于持续更新(如stackoverflow,例如投票),您需要使用
websockets,或者您需要通过ajax 定期询问服务器,或阅读http-server-push(分块传输)。 ... -
你应该切换到meteor.js (meteor.com) 它可以立即更新html而不需要刷新,并且不需要学习一门新的语言,它使用JavaScript! (这是你想要的吗?)
标签: javascript jquery html ajax perl