Как построить график реального времени (гистограмма) с использованием данных, полученных в текстовом файле

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

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

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

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

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

  • История гистограмм (сокращенных)
  • Случайная выборка для построения гистограммы: сколько достаточно?
  • Потоки данных и гистограммы
  • Быстрое инкрементальное сопровождение приближенных гистограмм

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

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