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));
}
}
?>
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