Ajax页面不会一致地更新

时间:2010-08-06 14:14:09

标签: php sql ajax apache

我最近开始在一个小项目中使用AJAX进行探索,虽然它没有我想要的那么顺利,但我已经取得了相当的成功。

基本设置是名为ProphetX的应用程序,它与Excel连接以显示股票市场价格。价格在Excel中更改时会更新。使用VBA每次价格更新时,我都会将电子表格中的数据保存到SQL08数据库中。这有时可能是每秒几次。

在Apache服务器上使用PHP我连接到SQL DB并将数据加载到表中,并使用javascript函数每秒更新一次信息。但是我注意到,如果你已经把它打开了,有时页面就会挂起,或者如果你把它拉起来,就会加载一个空白的屏幕,特别是在数据快速更新时。所以我的问题是:我的代码中是否有可能导致此打嗝的内容?我怀疑它是在堵塞网络或服务器资源,因为我一直在监视它们,它们看起来很低。

我还使用WireShark来监控网络流量,当我加载页面并在浏览器中显示空白时,我可以看到HTML从服务器发送到我的机器。

非常感谢任何帮助/编码风格的批评,源代码如下。

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

1 个答案:

答案 0 :(得分:1)

如果不在本地运行代码,我建议你研究数据库锁定问题。如果你真的每秒更新你的数据库记录几次,并试图加载你的查询页面三秒钟(你的超时设置为3000,这是三秒)。如果由于数据库锁定问题导致查询页面加载时间超过三秒,那么您的浏览器可能会遇到阻塞问题,因为它在发出新的ajax请求时正在等待来自一个请求的响应。

您可以尝试在php查询页面中添加一些超时代码。