Страница Ajax не обновляется последовательно - PullRequest
1 голос
/ 06 августа 2010

Я недавно начал изучать использование AJAX для небольшого проекта, и добился разумного успеха, хотя и не так гладко, как хотелось бы.

Базовая настройка - это приложения с именем ProphetX, которые взаимодействуютс Excel, чтобы показать цены на фондовом рынке.Цены обновляются по мере их изменения в Excel.Используя VBA, я сохраняю данные из электронной таблицы в БД SQL08 каждый раз, когда обновляется цена.Иногда это может происходить несколько раз в секунду.

Использование PHP на сервере Apache Я подключаюсь к базе данных SQL и загружаю данные в таблицы, а также функцию 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 Ответ

1 голос
/ 06 августа 2010

Без локального запуска кода я бы посоветовал вам изучить проблемы с блокировкой БД. Если вы действительно обновляете свои записи БД несколько раз в секунду и пытаетесь загрузить страницу запроса каждые три секунды (ваш тайм-аут установлен на 3000, что составляет три секунды). Если загрузка страницы запроса занимает более трех секунд из-за проблем с блокировкой БД, то в вашем браузере могут возникнуть проблемы с блокировкой, так как он ожидает ответа от одного запроса при запуске нового запроса ajax.

Вы можете попробовать добавить код таймаута на страницу запроса php.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...