Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    [AJAX - PHP] Dati in tempo reale ogni x secondi

    Un saluto a tutti.
    Mi sto avvicinando al linguaggio Javascript e AJAX e vorrei chiedervi un parere sia sul modo di programmare che sull'approccio ad un problema.
    Devo visualizzare in una pagina web dei valori prelevati da database. La struttura record è la seguente:
    codice:
    ID  Tag           Ora                  Valore    
     1  PRESSIONE     2010-02-01 12:00:00      50    
     2  PORTATA       2010-02-01 12:00:00      50    
     3  TEMPERATURA   2010-02-01 12:00:00      50
    Fino ad oggi ho sviluppato la pagina in PHP e richiamavo se stessa ogni tot secondi tramite il refresh dell'html.
    La cosa antipatica e che mentre scorri la pagina per visualizzare i dati, parte il refresh che mi riporta all'inizio. Allora ho deciso di implementare Javascript ed AJAX.
    Ho buttato giù un po' di codice e sono arrivato al punto di avere 3 file:
    hmi.php -> Viene lanciato all'inizio e si occupa di accedere al database per prelevare i campi ID e Tag e costruire la tabella html e creare i tag ID della cella dei valori e dell'ora
    hmi_ajax.js -> E' presente la classe Tag e le funzioni AJAX
    hmiupdate_ajax.php -> Viene richiamata da hmi_ajax.js ogni tot secondi per accedere di nuovo al database e prelevare nuovamente l'ID con i valori e l'ora aggiornati
    Questo il codice:
    codice:
    // hmi.php ------------------------------------------------------------------------------------
    
    $arrTags=array();
    
    $content="";
    
      // Recupero dati
      $conn = @mysql_connect("localhost", "utente", "password");
    	mysql_select_db(DB_HMI_CP,$conn);
    	
    	$result="";
    	$queryTag="SELECT ID, Ora, Tag, Valore, Descrizione FROM CPGHI_K2 ORDER BY ID";
    	$result=mysql_query($queryTag,$conn);
    	while($rs = mysql_fetch_array($result,MYSQL_ASSOC)) {
    		$arrTags[$rs['ID']]['ID']=$rs['ID'];
    		$arrTags[$rs['ID']]['Nome']=$rs['Tag'];
    		$arrTags[$rs['ID']]['Ora']=$rs['Ora'];
    		$arrTags[$rs['ID']]['Valore']=$rs['Valore'];
    		$arrTags[$rs['ID']]['Descrizione']=$rs['Descrizione'];  
    	}
    
    // Costruzione della pagina
    $content.="
    <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>
    <html>
    <head>
      <meta http-equiv='Content-Type' content='text/html; charset=iso-8859-1'>
      <title>Javascript & AJAX</title>
      <script language='javascript' src='hmi_ajax.js' type='text/javascript'></script>
    </head>
    <body onLoad=\"window.setInterval('Richiesta(2)', ".REFRESH_SECONDS." * 1000);\">";
    
    $content.="
      <table width='100%' border='1' align='center' cellspacing='0' cellpadding='1'>
        <tr>
          <td colspan='3'class='campo'>DATI CARROPONTE K1</td>
        </tr>
        <tr>
          <td width='70%'>Descrizione</td>
          <td width='10%'>Valore</td>
          <td width='20%'>Ora</td>
        </tr>";
      foreach($arrTags as $tag){
        $content.="
        <tr>
          <td>".$tag['Descrizione']."</td>
          <td id='v".$tag['ID']."'>#</td>  <- v=Valore + ID (v1,v2,v3,ecc)
          <td id='h".$tag['ID']."'>#</td>  <- h=Ora + ID (h1,h2,h3,ecc)
        </tr>";
      }
      $content.="
      </table>";
    
    $content.="
      </body>
    </html>";
    
    echo $content;
    codice:
    hmi_ajax.js -----------------------------------------------------------
    
    var XMLHTTP;
    
    function Tag (id,valore,ora){
      this.nome = "";
      this.descrizione = "-";
      this.valore = valore;
      this.ora = ora;
      this.id = id;
    }
    
    function Richiesta(Stringa) {
    
      if(Stringa > 0){
        var url = "hmiupdate_ajax.php?cpk=" + Stringa;
        XMLHTTP = RicavaBrowser(CambioStato);
        XMLHTTP.open("GET", url, true);
        XMLHTTP.send(null);
      }else{
        //document.getElementById("out").innerHTML = "";
      }
    }
    
    function CambioStato() {
      if (XMLHTTP.readyState == 4){
       
        eval(XMLHTTP.responseText);
        
        // Scrivo nelle celle i valori e l'ora aggiornati
        for(item = 0; item < tagList.length; item++){
          document.getElementById("v" + tagList[item].id).innerHTML = tagList[item].valore;
          document.getElementById("h" + tagList[item].id).innerHTML = tagList[item].ora;
        }
    //    tag = null;
      }
    }
    
    function RicavaBrowser(QualeBrowser){
    
      if(navigator.userAgent.indexOf("MSIE") != (-1)){
        var Classe = "Msxml2.XMLHTTP";
        if(navigator.appVersion.indexOf("MSIE 5.5") != (-1)){
          Classe = "Microsoft.XMLHTTP";
        }
        try {
          OggettoXMLHTTP = new ActiveXObject(Classe);
          OggettoXMLHTTP.onreadystatechange = QualeBrowser;
          return OggettoXMLHTTP;
        } catch (e) {
          alert("Errore: l'activeX non verrà eseguito!");
        }
      }else if(navigator.userAgent.indexOf("Mozilla") != (-1)) {
        OggettoXMLHTTP = new XMLHttpRequest();
        OggettoXMLHTTP.onload = QualeBrowser;
        OggettoXMLHTTP.onerror = QualeBrowser;
        return OggettoXMLHTTP;
      }else {
        alert("L'esempio non funziona con altri browser!");
      }
      
    }
    codice:
    // hmiupdate_ajax.php --------------------------------------------------------
    
    $res="";   // Codice Javascript creato da PHP
    
      // Recupero dati
      $conn = @mysql_connect(HOST, "utente", "password");
      mysql_select_db(DB_HMI_CP,$conn);
    
      // Creo un nuovo array in Javascript
      $res .= "var tagList = new Array(); ";
      $result="";
      $queryTag="SELECT ID, Ora, Tag, Valore, Descrizione FROM CPGHI_K2 ORDER BY ID";
      $result=mysql_query($queryTag,$conn);
      $i=-1;
      while($rs = mysql_fetch_array($result,MYSQL_ASSOC)) {
        $i++;
    
        // Aggiungo all'array un nuovo oggetto Tag
        $res .= "tagList[".$i."] = new Tag(\"".$rs['ID']."\",
                                           \"".$rs['Valore']."\",
                                          \"".$rs['Ora']."\"); ";
        }
    
      mysql_free_result($result);
      unset($result);
      unset($rs);
    
      echo $res;   // Ritorno il codice in Javascript
    Tutto funziona bene, i dati si aggiornano. Quello che vorrei sapere da voi è:
    1) E' corretto creare codice Javascript da php?
    2) E' corretto creare ogni volta dei nuovi oggetti Tag? Non influisce sulla memoria del client?
    3) Non è più corretto creare tutti gli oggetti Tag la prima volta e successivamente aggiornare le sue proprietà Valore e Ora?
    4) A parte che il tutto funziona ma a me interessa che sia codice pulito. Avete altre soluzioni da suggerirmi?
    5) Si può ridurre il numero di file da 3 a 2 accorpando la logica?

    Mi scuso per essere stato lungo e spero di essermi spiegato bene.
    Grazie

  2. #2
    Allora, in risposta alle tue domande:
    1- Avendo lavorato su progetti parecchio corposi di JS posso dirti che produrre JS dinamico da PHP è talvolta l'unica soluzione possibile.

    2- No, dato che l'array tagList viene ogni volta sovrascritto, il resto dei dati viene liberato, quindi, a meno che non visualizzi 2000 righe, su di un client con 512 Mb di ram o meno ed IE6, non dovresti aver problemi di memoria. Puoi comunque fare un test lasciando il browser andare per un oretta (su di una macchina diversa dal webserver), e vedere le prestazioni, se la memoria continua ad aumentare devi mettere un delete da qualche parte per rilasciare la memoria.

    3- No, per il motivo sopra elencato.

    4- Io avrei usato un evalutatore di JSON ed una libreria di JS, ma il tuo codice mi sembra molto pulito. L'unico problema che vedo è se cambia il numero di righe da visualizzare, tipo aumenta, ti causa un errore.

    5- No, in questa logica il numero di file DEVE essere tre. Anzi, è sempre buona cosa avere un file in più che avere dei file più grossi.
    I DON'T Double Click!

  3. #3
    Grazie per la risposta artorius.
    Dunque
    1) Questo è molto interessante per sviluppare pagine html che cambiano dinamicamente.
    2) I tag da visualizzare attualmente sono circa un centinaio. Potrebbero aumentare in futuro ma comunque sono sempre fissi. A meno che non ne aggiungo qualcuno nuovo nel database, JS non troverebbe l'ID della cella html ma facendo un controllo sull'esistenza o meno del tag html dovrei uscirmene. Non so come si fa però.
    Ho provato il tutto su un client con Firefox per un giorno intero e la memoria è rimasta stabile intorno ai 60MB.
    4) Non so cosa sia un evalutatore di JSON ed una libreria di JS ma proverò a dare un occhio in rete.

    Ti ringrazio dei consigli e per la disponibilità; proseguirò su questa strada per lo studio di JS e AJAX.
    Un saluto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.