2

我有一个由服务器上的程序生成的连续生成的数据(文本文件)。我想像powergrid一样将数据绘制为实时图表。这是我的方法:

由于数据在服务器上以文本文件的形式连续生成,我编写了一个 PHP 脚本,它读取该文件( ),输出数据点并使用sparkline jQuery 插件get_file_contents绘制图形。但问题是它一次读取所有文件。此外,文本文件还在不断增长。谁能建议我更好的方法?

4

3 回答 3

3

当您谈论使用 Javascript 绘图解决方案时,您可以执行以下操作:

  • 在页面加载时,您通过阅读完整的文本文件并记住它的大小来创建当前图形。
  • 加载页面后,您创建一个 Javascript 函数,该函数使用 AJAX 技术 ( ) 定期轮询服务器上的特定脚本,XMLHttpRequest并将文本文件的最后已知文件大小作为参数传递。
  • 您的轮询脚本采用文件大小参数,打开文本文件,跳过文件,直到到达您上次读取文件的点(文件大小参数)。
  • 轮询脚本返回从文件大小到文件末尾和新文件站点的所有可用数据
  • 您的 Javascript 读取 AJAX 响应并将所需的绘图点添加到您的图表中
  • 然后,您可以使用新的文件大小作为参数重新轮询您的服务器端脚本

此过程涉及服务器端和客户端编程,但可以轻松完成。

以下是一个示例轮询脚本,它需要一个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()在同一页面上同时调用会有问题)。

于 2009-11-13T13:44:12.577 回答
3

听起来您的可视化部分大部分都已解决。如果数据集太大而无法重新计算,您可能需要研究维护增量直方图的技术。以下是一些可能有帮助的论文:

于 2009-11-13T13:45:08.487 回答
0

首先,我不会在用户端生成图表。原因很简单:不是每个人都启用了 JavaScript(好吧,取决于您的目标群体),而且速度可能不是很快。

由于您已经在使用 PHP,因此我建议使用像pChart这样的包来在服务器端创建图表。另一个积极的副作用是该包也带有缓存。例如,这将允许您仅在数据文本文件更改时创建图形(假设您也使用 PHP 生成它 - 否则您可以简单地检查文件是否在每次运行 PHP 脚本时被修改),因此节省大量资源;)

于 2009-11-13T13:34:31.700 回答