2009-11-13 17 views
2

J'ai une donnée générée en continu (fichier texte) générée par un programme sur le serveur. Je veux tracer les données sous la forme d'un graphique en temps réel comme le fait powergrid. Ce fut mon approche:Comment tracer un graphique en temps réel (histogramme) en utilisant les données obtenues dans un fichier texte

Comme les données sont générées en continu sur le serveur dans un fichier texte, j'ai écrit un script PHP qui lit ce fichier (get_file_contents), délivre en sortie les points de données et tracer le graphique à l'aide sparkline plugin jQuery. Mais le problème est qu'il lit le fichier tout à la fois. De plus, le fichier texte ne cesse de croître. Quelqu'un peut-il me suggérer une meilleure approche?

Répondre

3

Comme vous parlez d'utiliser une solution de traçage Javascript vous effectuez les opérations suivantes:

  • sur la charge de page que vous créez le graphique actuel en lisant le fichier texte complet et se souvenant de sa taille . Une fois la page chargée, vous créez une fonction Javascript qui interroge régulièrement un script spécifique sur votre serveur à l'aide des techniques AJAX (XMLHttpRequest) et transmet la dernière taille de fichier connue de votre fichier texte en tant que paramètre.
  • votre script d'interrogation prend le paramètre filesize, ouvre le fichier texte, passe à travers le fichier jusqu'à ce qu'il atteigne le point à partir duquel vous avez lu le fichier (paramètre filesize).
  • le script de vote renvoie toutes les données disponibles à partir filesize à la fin du fichier et le nouveau FileSite
  • votre Javascript lit dans la réponse AJAX et ajoute les points de terrain nécessaires à votre graphique
  • vous pouvez alors recommencez à interroger votre script côté serveur avec la nouvelle taille de fichier en tant que paramètre

Cette procédure implique une programmation côté serveur et côté client, mais peut être effectuée facilement.

Voici un exemple de script d'interrogation nécessitant un paramètre index qui indique au script à partir de quelle position lire le fichier texte et renvoie une liste codée JSON de points de tracé et le nouveau pointeur d'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(); 

L'extrait Javascript/jQuery correspondant pourrait être:

// 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); 

S'il vous plaît veiller à ce que c'est seulement un exemple et qu'il n'a pas toutes les erreurs de contrôle (par exemple les appels simultanés à pollData() sur la même page sera être problématique).

0

Tout d'abord, je ne générerais pas le graphique côté utilisateur. Cela a des raisons simples: tout le monde n'a pas activé JavaScript (d'accord, cela dépend de votre groupe cible) et ce n'est probablement pas très rapide.

Puisque vous utilisez déjà PHP, je vous recommande donc d'utiliser un package comme pChart pour créer les graphiques côté serveur. Un autre effet secondaire positif de ceci est que ce paquet vient avec la mise en cache, aussi. Cela vous permettrait, par exemple, de créer le graphique uniquement lorsque le fichier texte de données est modifié (en supposant que vous le générez aussi avec PHP - sinon vous pouvez simplement vérifier si le fichier a été modifié chaque fois que votre script PHP est exécuté) économiser des charges de ressources;)