2009-11-13 4 views
2

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

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

ответ

3

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

  • на странице загрузки вы создаете текущий график, читая полный текстовый файл и запоминать его размер ,
  • После загрузки страницы вы создаете функцию Javascript, которая регулярно опросает определенный скрипт на вашем сервере с использованием AJAX-методов (XMLHttpRequest) и передает последний известный файл вашего текстового файла в качестве параметра.
  • ваш сценарий опроса принимает параметр filesize, открывает текстовый файл, пропускает файл до тех пор, пока он не достигнет точки, из которой вы в последний раз прочитали файл (параметр-файл).
  • скрипт опроса возвращает все доступные данные из размер_файла до конца файла и нового filesite
  • вашего Javascript читает в ответ AJAX и добавляет необходимый сюжетную ваш граф
  • вы можете затем начать с опроса вашего сценария на стороне сервера с новым размером в качестве параметра

Эта процедура включает в себя как серверное, так и клиентское программирование, но может быть выполнена легко.

Ниже приведен пример сценария опроса, который требует параметра index, который сообщает сценарию, из которого следует читать текстовый файл, и возвращает список точек графика и новый указатель указателя.

// 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() на той же странице будет быть проблематичным).

0

Во-первых, я бы не сгенерировал график на стороне пользователя. У этого есть простые причины. Не у всех есть JavaScript (хорошо, зависит от вашей целевой группы), и это, вероятно, не очень быстро.

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

3

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

Смежные вопросы