我有一个由服务器上的程序生成的连续生成的数据(文本文件)。我想像powergrid一样将数据绘制为实时图表。这是我的方法:
由于数据在服务器上以文本文件的形式连续生成,我编写了一个 PHP 脚本,它读取该文件( ),输出数据点并使用sparkline jQuery 插件get_file_contents
绘制图形。但问题是它一次读取所有文件。此外,文本文件还在不断增长。谁能建议我更好的方法?
当您谈论使用 Javascript 绘图解决方案时,您可以执行以下操作:
XMLHttpRequest
并将文本文件的最后已知文件大小作为参数传递。此过程涉及服务器端和客户端编程,但可以轻松完成。
以下是一个示例轮询脚本,它需要一个index
参数,该参数告诉脚本从哪个位置读取文本文件并返回一个 JSON 编码的绘图点列表和新的索引指针。
// poll.php
$index = (isset($_GET['index'])) ? (int)$_GET['index'] : 0;
$file = fopen('path/to/your/file.txt', 'r');
$data = array(
'index' => null,
'data' => array()
);
// move forward to the designated position
fseek($file, $index, SEEK_SET);
while (!feof($file)) {
/*
* assuming we have a file that looks like
* 0,10
* 1,15
* 2,12
* ...
*/
list($x, $y) = explode(',', trim(fgets($handle)), 2);
$data['data'][] = array('x' => $x, 'y' => $y);
}
// set the new index
$data['index'] = ftell($file);
fclose($file);
header('Content-Type: application/json');
echo json_encode($data);
exit();
相应的 Javascript/jQuery 片段可以是:
// the jQuery code to poll the script
var current = 0;
function pollData() {
$.getJSON('poll.php', { 'index': current }, function(data) {
current = data.index;
for (var i= 0; i < data.data.length; i++) {
var x = data.data[i].x;
var y = data.data[i].y;
// do your plotting here
}
});
}
// call pollData() every 5 seconds
var timer = window.setInterval(pollData, 5000);
请注意,这只是一个示例,并且它缺少所有错误检查(例如,pollData()
在同一页面上同时调用会有问题)。
听起来您的可视化部分大部分都已解决。如果数据集太大而无法重新计算,您可能需要研究维护增量直方图的技术。以下是一些可能有帮助的论文:
首先,我不会在用户端生成图表。原因很简单:不是每个人都启用了 JavaScript(好吧,取决于您的目标群体),而且速度可能不是很快。
由于您已经在使用 PHP,因此我建议使用像pChart这样的包来在服务器端创建图表。另一个积极的副作用是该包也带有缓存。例如,这将允许您仅在数据文本文件更改时创建图形(假设您也使用 PHP 生成它 - 否则您可以简单地检查文件是否在每次运行 PHP 脚本时被修改),因此节省大量资源;)