Как построить график (гистограмму) в реальном времени, используя данные, полученные в текстовом файле - PullRequest
2 голосов
/ 13 ноября 2009

У меня есть постоянно генерируемые данные (текстовый файл), сгенерированные программой на сервере. Я хочу построить данные в виде графика в реальном времени, как это делает powergrid . Это был мой подход:

Поскольку данные непрерывно генерируются на сервере в виде текстового файла, я написал PHP-скрипт, который читает этот файл (get_file_contents), выводит точки данных и строит график с использованием sparkline jQuery plugin , Но проблема в том, что он читает файл все сразу . Более того, текстовый файл продолжает расти. Кто-нибудь может предложить мне лучший подход?

Ответы [ 3 ]

3 голосов
/ 13 ноября 2009

Когда вы говорите об использовании решения для построения графиков Javascript, вы делаете следующее:

  • при загрузке страницы вы создаете текущий график, читая полный текстовый файл и помня его размер.
  • после загрузки страницы вы создаете функцию Javascript, которая регулярно опрашивает конкретный скрипт на вашем сервере, используя AJAX-методы (XMLHttpRequest) и передавая в качестве параметра последний известный размер вашего текстового файла.
  • ваш скрипт опроса принимает параметр filesize, открывает текстовый файл, пропускает файл, пока не достигнет точки, с которой вы последний раз читали файл (filesize-параметр).
  • скрипт опроса возвращает все доступные данные от размер файла до конца файла и нового файлового сайта
  • ваш 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() на той же странице будут проблематичными).

3 голосов
/ 13 ноября 2009

Похоже, у вас в основном проработана часть визуализации. Если набор данных слишком велик для повторного расчета, вы можете изучить методы для поддержки инкрементальных гистограмм. Вот несколько статей, которые могут помочь:

0 голосов
/ 13 ноября 2009

Во-первых, я бы не создавал график на стороне пользователя. Это объясняется простыми причинами: не у всех включен JavaScript (хорошо, зависит от вашей целевой группы), и, вероятно, он не очень быстрый.

Поскольку вы уже используете PHP, я бы порекомендовал использовать пакет типа pChart для создания графиков на стороне сервера. Еще одним положительным побочным эффектом является то, что указанный пакет также поставляется с кэшированием. Это, например, позволит вам создавать график только при изменении текстового файла данных (при условии, что вы генерируете его и с помощью PHP - иначе вы можете просто проверить, был ли файл изменен каждый раз при запуске вашего PHP-скрипта) и, таким образом экономия ресурсов;)

...