2010-08-06 5 views
1

J'ai récemment commencé à explorer en utilisant AJAX pour un petit projet, et j'ai eu un succès raisonnable si elle n'est pas aussi lisse que je le voudrais.Ajax page ne met pas à jour régulièrement

La configuration de base est une application appelée ProphetX qui s'interface avec Excel pour afficher les cours boursiers. Les prix sont mis à jour à mesure qu'ils changent dans Excel. En utilisant VBA, je sauvegarde les données de la feuille de calcul dans une base de données SQL08 chaque fois qu'un prix est mis à jour. Cela peut parfois être quelques fois par seconde. En utilisant PHP sur un serveur Apache, je me connecte à la base de données SQL et charge les données dans des tables, et une fonction javascript pour garder à jour les informations une fois par seconde. J'ai remarqué cependant que parfois la page se bloque si vous l'avez déjà, ou charge un écran vide si vous l'arrêtez, en particulier lorsque les données sont mises à jour rapidement. Donc, au cœur de ma question: y a-t-il quelque chose dans mon code qui pourrait causer ce hoquet? Je doute qu'il encombre les ressources du réseau ou du serveur car je les surveille et elles semblent faibles. J'ai aussi utilisé WireShark pour surveiller le trafic réseau, et quand je charge la page et qu'elle apparaît vide dans le navigateur, je peux voir le code HTML envoyé du serveur à ma machine.

Toute aide/critique de style de codage est très appréciée, code source ci-dessous.

index.php:

<html> 
<head> 
<script type="text/javascript" src="update.js"></script> 
</head> 
<body onLoad = update()> 
<font size = +2> 
<?php 
echo " 
<div id = 'marketData'></div> 
"; 
?> 
</font> 
</body></html> 

Update.js:

function update() 
{ 
    if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
    else 
     {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      document.getElementById("marketData").innerHTML=xmlhttp.responseText; 
     } 
    } 
    //URL needs a var to be passed via get for code to function in IE, thus Math.Random(). 
//I am also confused by this requirement. 
    xmlhttp.open("GET","update.php?i="+ Math.random(),true); 
    xmlhttp.send(); 
    var t = setTimeout("update()", 3000); 
} 

update.php:

<?php 
//connect to database 
error_reporting(0); 
    sqlsrv_configure("WarningsReturnAsErrors", 1); 
    $server = "myServer"; 
    $db = "myDB"; 
    $connectionInfo = array("Database"=>"$db, "UID"=>"user", "PWD"=>"pass"); 
    $conn = sqlsrv_connect($server, $connectionInfo); 

    if($conn) 
    { 
     echo "<font size =-1 color=green>Connection Established<br></font>"; 
    } 
    else 
    { 
     echo"Connection not established:<br>"; 
     print_r(sqlsrv_errors()); 
    } 

    //Func calls sqlsrv_query($conn, [$symbol],[$DatabaseName]) 
    $stmt = sqlsrv_query($conn,query(array('sym1','sym2','sym3'), "electronic")); 
    errorCheck($stmt); 
    printTables("Electronic Commodity Prices", $stmt); 

    $stmt = sqlsrv_query($conn,query(array('sym1','sym2','sym3'), "floor")); 
    errorCheck($stmt); 
    printTables("Floor Commodity Prices", $stmt); 

    $stmt = sqlsrv_query($conn,query(array('sym1','sym2','sym3',... ,sym19), "natgas")); 
    errorCheck($stmt); 
    printTables("Natural Gas Commodity Prices", $stmt); 

    sqlsrv_free_stmt($stmt); 
    sqlsrv_close($conn); 

    //This function prints out the tables 
    function printTables($tableName, $stmt) 
    { 
     echo 
     " 
     $tableName<hr> 
     <table cellspacing ='5' cellpadding = '5'> 
     <tr> 
      <th>Symbol</th> 
      <th>Product</th> 
      <th>Last Price</th> 
      <th>Change</th> 
      <th>High Price</th> 
      <th>Low Price</th> 
      <th>Previous Price</th> 
      <th>Trade Time</th> 
     </tr> 
     "; 
     while($row=sqlsrv_fetch_array($stmt)) 
     { 
     echo 
     " 
     <tr> 
      <td>$row[symbol]</td> 
      <td><font size =+3 color = blue>$row[description]</font></td> 
      <td>$row[last]</td> 
      <td><font size =+5> $row[change]</font></td> 
      <td>$row[highPrice]</td> 
      <td>$row[lowPrice]</td> 
      <td>$row[previousprice]</td> 
      <td>" . date("j M g:i",strtotime($row['tradetime'])) . "</td> 
     </tr> 
     "; 
     } 
     echo"</table><hr>"; 
    } 
    function query($symbols, $db) 
    { 
    $count = count($symbols); 
     $stmt = 
     " 
       select distinct id,symbol,description,last,change,highPrice,lowPrice,previousprice,tradetime from $db 
       where "; 
       for($i = 0; $i< $count; $i++) 
       { 
        $stmt .= "id in (select MAX(id)from $db where symbol ='$symbols[$i]') "; 
        if($i != $count-1) 
        { 
         $stmt.= "or "; 
        } 
       } 
       $stmt .= "order by description asc"; 
       // id in (select MAX(id)from $db where symbol ='$symbols[0]') 
       // or id in (select MAX(id)from $db where symbol ='$symbols[1]') 
       // or id in (select MAX(id)from $db where symbol ='$symbols[2]') 
        // order by description asc 
     return $stmt; 
    } 
    function errorCheck($stmt) 
    { 
     if($stmt=== false) 
     { 
      echo "Error in statement preparation/execution.\n"; 
      die(print_r(sqlsrv_errors(), true)); 
     } 
    } 
?> 

Répondre

1

Sans courir votre code localement, je vous suggère de regarder dans DB problèmes de verrouillage. Si vous mettez réellement à jour vos enregistrements de base de données plusieurs fois par seconde, et que vous essayez de charger la page de requête trois secondes (votre délai d'attente est défini sur 3000, soit trois secondes). Si votre page de requête prend plus de trois secondes à charger en raison de problèmes de verrouillage de la base de données, votre navigateur peut avoir des problèmes de blocage, car elle attend la réponse d'une requête lors du lancement d'une nouvelle requête ajax.

Vous pourriez essayer de mettre du code de timeout dans votre page de requête php.

+0

Nous vous remercions du conseil concernant le verrouillage DB. Quelques recherches Google et j'ai vérifié mes serrures DB et il y avait saut entre 2000 ~ 4000! Après avoir rendu les paramètres de verrouillage un peu moins stricts, je les ai ramenés à 20 ~ 90. Je vais surveiller la page pendant environ un autre jour pour voir quand le marché est à son plus achalandé et le commerce se fait rapidement, bien que il se sent déjà un peu plus fiable. – BOMEz

Questions connexes