2017-01-07 3 views
3

У меня есть страница, где я хочу сохранить значение из файла, обновленного все время.setTimeout перестает работать

У меня есть сценарий, сохраняющий некоторые данные для просмотра в Интернете в txt-файле, а затем я хочу показать эти данные в Интернете. Данные в текстовом файле обновляются каждые 20 секунд.

Он работает хорошо, как и раньше, через 3 минуты или около того, после чего страница останавливается. Есть идеи, почему это происходит?

function updatepot(elementid) { 
     var xmlhttp = new XMLHttpRequest(); 
     xmlhttp.onreadystatechange = function() { 
      if (this.readyState == 4 && this.status == 200) { 
       document.getElementById(elementid).innerHTML = this.responseText; 
      } 
     }; 
     xmlhttp.open("GET", "../readData.php?q=" + elementid, true); 
     xmlhttp.send(); 

} 

function updatePots() 
{ 
     updatepot("pot0"); 
} 
function keeprunning() 
{ 
    setTimeout(updatePots, 1000); 
    keeprunning(); 
} 


<?php  
// get the q parameter from URL 
$file = $_REQUEST["q"] . ".txt"; 
$myfile = fopen("potData/".$file, "r") or die("Unable to open file!"); 
$myData; 
while(!feof($myfile)) { 
    $myData = $myData . fgets($myfile); 
} 
fclose($myfile); 
echo $myData; 
?> 
+1

'fopen (" potData /".$ file, "r") 'Кстати, это уязвимость безопасности. '$ file' может содержать' ..', что означает поиск каталога, поэтому злоумышленник не ограничивается чтением файлов в каталоге 'potData'. Они могут читать любой файл '.txt' на диске, к которому имеет доступ читатель PHP, если они могут угадать относительный путь к файлу. –

+0

Хорошая точка. Я добавил все определенные пути к массиву в php-коде, а затем проверяю, содержит ли этот массив $ file – Jacob

ответ

4

Если вы хотите функцию запускать периодически, используйте setInterval вместо setTimeout - таким образом, вы не должны иметь дело с регулировкой интервала:

function updatepots() 
{ 
    updatepot("pot0"); 
} 

window.setInterval(updatePots, 1000); 
6

Ваш метод keepRunning вызывается немедленно, как только вызывается функция setTimeout. Это означает, что вместо того, чтобы вызывать каждую секунду, как вы, вероятно, намереваетесь, она называется постоянно (тысячи раз в секунду) - вы быстро столкнетесь с проблемами памяти, и все перестанет работать.

Чтобы это исправить, вызовите keepRunning в конце вашей функции updatePots:

function updatePots() 
{ 
     updatepot("pot0"); 
     keeprunning(); 
} 
function keeprunning() 
{ 
    setTimeout(updatePots, 1000); 
} 
0

вызов его таким образом:

function updatePots() 
{ 
    updatepot("pot0"); 
    keeprunning(); 
    setTimeout(updatePots, 1000); 
} 
Смежные вопросы