2013-09-12 5 views
0

У меня есть PHP-код, который извлекает текст из базы данных и показывает его в div как ссылки. Я обновляю DIV каждые 3000 миллисекунд, а использование процессора на несколько процентов выше на самом обновлении. После 20-25 минут постоянных обновлений, когда я нажимаю на одну из ссылок, для открытия этой страницы требуется около 20 секунд, а между тем вкладка браузера замерзает. Появляется больше обновлений - больше времени, необходимого для открытия ссылки, а также при открытии большего количества ссылок (при открытии 10-15 ссылок он становится медленнее, чем 10-12 секунд, чтобы открыть следующую страницу). Когда браузер пытается открыть ссылку, 1 поток процессора полностью загружен. Вот код (упрощенный):высокая загрузка процессора после JavaScript setInterval

<div id="map1"></div> 

<script src="http://code.jquery.com/jquery-2.0.3.min.js"></script> 
<div id="map1"> 

<?PHP 


if (isset($_GET['m'])) {  

    $selectback = "SELECT parentid FROM MAP_LINK WHERE sysid = " . $_GET['m']; 
    ................ 
    $rowb = ibase_fetch_row($query);   

    echo "<h6><a href=\"#\" id=\"back" . $rowb[0] . "\">BACK</a></h6><h4> 
    <script> 
     $('a#back" . $rowb[0] . "').click(function() { 
      clearInterval(auto_refresh);  
       $(\"#map1\").load(\"test2.php?m=" . $rowb[0] . "\"); 

       auto_refresh = setInterval(function(){ 
       $(\"#map1\").load(\"test2.php?m=" . $rowb[0] . "\");}, 3000); 

       }); 
       </script>"; 





    $select = "SELECT sysid FROM MAP_LINK WHERE parentid = " . $_GET['m']; 
    .........................................     

    $x = 0; 
    while ($x < $total_rows) { 
     $x++; 
     $row = ibase_fetch_row($query); 
     echo "<br><a href=\"#\" id=\"" . $row[0] . "\">Link # " . $row[0] . "</a> 
     <script> 
       $('a#" . $row[0] . "').click(function() { 
       clearInterval(auto_refresh);  
       $(\"#map1\").load(\"test2.php?m=" . $row[0] . "\"); 

       auto_refresh = setInterval(function(){ 
       $(\"#map1\").load(\"test2.php?m=" . $row[0] . "\");}, 3000); 

       }); 
     </script>"; 

    } 
} else { 
    echo "<script> 
$(document).ready(function(){ 
$(\"#map1\").load('test2.php?m=56'); 
auto_refresh = setInterval(function(){ 
$(\"#map1\").load(\"test2.php?m=56\");}, 3000); 
});</script>"; 
} 
?> 

Это примерно тот же код, который у меня есть. База данных состоит из 4 таблиц, из которых извлекаются данные. Первые 6-7 щелчков мгновенно открывают следующую страницу без задержки, задержки начинаются после 10-го щелчка и становятся больше с каждым дополнительным щелчком или обновлением.

Мой вопрос: Как я могу открыть его немедленно или хотя бы быстрее? В коде есть ошибка. Он работает, но он много использует процессор и становится достаточно медленным, чтобы не перемещаться по странице.

Спасибо!

+1

Возможно http://en.wikipedia.org/wiki/Reentrancy_(computing) Не используйте setInterval, используйте SetTimeout что повторно передает цикл после завершения работы. Это гарантирует, что функция никогда не сможет повторно войти. – asawyer

+0

Вы повторяете интервалы внутри цикла while, который знает, сколько интервалов вы используете одновременно? – adeneo

+0

Вы запускаете auto_refresh каждый раз +1, если вы нажмете его. – zer02

ответ

0

Late на помощь, но вы можете попробовать сцепление setTimeouts вместе, как это:

function refreshments() { 
    setTimeout(function(){ 
     //Do stuff 
     refreshments(); 
    }, 1000); 
} 

refreshments(); 
Смежные вопросы