tags:

views:

39

answers:

1

I've recently started exploring using AJAX for a small project, and I've had reasonable success though it's not as smooth as I would like.

The Basic setup is that an applications named ProphetX which interfaces with Excel to show stock market prices. Prices are updated as they change in Excel. Using VBA I save the data from the spreadsheet into an SQL08 DB every time a price updates. This could sometimes be a few times per second.

Using PHP on an Apache server I connect to the SQL DB and load the data into tables, and a javascript function to keep updating the information once every second. I've noticed however that at times the page will simply hang if you already have it up, or load a blank screen if you pull it up, particularly when data is being updated rapidly. So to the meat of my question: Is there something in my code which could be causing this hiccup? I doubt it is congesting the network or server resources as I've been monitoring them and they seem low.

Also I used WireShark to monitor network traffic, and when I load up the page and it shows blank in the browser, I can see the HTML being sent from the server to my machine.

Any help / coding style criticism is much appreciated, source code below.

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

Without running your code locally, I would suggest you look into DB locking issues. If you are really updating your DB records a number of times a second, and trying to load you query page ever three seconds (your timeout is set to 3000, which is three seconds). If your query page takes longer than three seconds to load because of DB locking issues then your browser may having blocking issues, as it is waiting for the response from one request while firing a new ajax request.

You could try putting some timeout code in your php query page.

Lloyd
Thank you for the tip about DB locking. A few Google searches and I checked my DB locks and there were hopping between 2000 ~ 4000!After making the lock settings a bit less strict I got them down to 20 ~ 90. I'm going to monitor the page for about another day to look at it when the market is at it's busiest and trading is occurring rapidly, though it already feels a bit more reliable.
BOMEz