Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Сообщение при изменении файла. (https://javascript.ru/forum/events/35467-soobshhenie-pri-izmenenii-fajjla.html)

Smip 11.02.2013 17:17

Сообщение при изменении файла.
 
Здравствуйте. Подскажите как можно реализовать, такую штуку... есть файл csv, и выводится содержимое в таблицы через пхп, и этот файл часто обновляется (1 раз в 30 минут), как можно сделать функцию, которая бы следила за изменением файла csv и если такое случилось, выдовало сообщение что перезагрузите страницу, файл обновился...

Может где-то такое есть в интернете, но я сколько не искал, ничего внятного не могу найти...

Я понимаю что надо смотреть на дату изменения, но как это реализовать незнаю :help:

danik.js 11.02.2013 17:27

Делаете по таймеру xhr-запрос (ajax) на сервер, к некоторому скрипту(php), который проверяет изменение файла. Запрос делаете например раз в минуту.

Smip 11.02.2013 17:57

Я это примерно понял...

$file = "file.txt";
$mtime = filemtime($file);

while (true) {
  clearstatcache();
  if ($mtime < filemtime($file)) {
    echo "Состояние изменилось!";
    break;
  }
 
  usleep(200000); // 0.2 сек
 
}


пхп скрипт должен быть примерно такой? как сделать xhr-запрос а то я в этом вообще не бум-бум :)

danik.js 11.02.2013 18:45

Нет, скрипт не должен работать бесперебойно. Пришел xhr-запрос от браузера - скрипт проверил дату, выдал результат, завершился. И так каждую минуту, к примеру.
http://learn.javascript.ru/ajax-xmlh...зования
http://learn.javascript.ru/settimeout-setinterval

Smip 13.02.2013 21:00

Цитата:

Сообщение от danik.js (Сообщение 233215)
Нет, скрипт не должен работать бесперебойно. Пришел xhr-запрос от браузера - скрипт проверил дату, выдал результат, завершился. И так каждую минуту, к примеру.
http://learn.javascript.ru/ajax-xmlh...зования
http://learn.javascript.ru/settimeout-setinterval

Почитал то что Вы мне порекомендовали, кое что понял кое что нет....
Вот что у меня получилось:

function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

function checkchanges(){
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', '/test.php?r='+Math.random(), true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       alert(xmlhttp.responseText);
         }
  }
};
xmlhttp.send(null);
}
  jQuery(document).ready(function(){
  var timer = setInterval(function() {  checkchanges(); }, 5000);
    });


Функцию function getXmlHttp() нашёл в интернете, как там сказано обеспечивает кроссбраузерность...

Получается что я запускаю данный скрипт, когда документ загрузился, и он исполняется в данном случае каждые 5 секунд... Если ответ успешный то выводится алерт в котором текст файла test.php, как мне теперь впихнуть сюда проверку изменения файла не пойму... я так понимаю в этот файл нужно передавать время последнего изменения когда открылась страница, в этом файле нужно сравнить какое было, и какое сейчас, если изменилось то выдать например тот же алерт...

Smip 13.02.2013 22:08

Во многом уже сам разобрался, сделал то что хотел, только назрел вопрос, у меня есть 10 страниц, на которых нужно таким способом проверять изменения разных файлов.... как можно передавать в серверный скрипт название файла который мы проверяем.... чтобы не создавать для каждого файла разные серверные скрипты... сейчас этот скрипт выглядит вот так:
<?php 
$file = "file.txt";
clearstatcache();
echo (filemtime($file));
?>


а xhr выглядит вот так:

function checkchanges($mtime){
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', '/bd/test.php?r='+Math.random(), true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       if($mtime != xmlhttp.responseText) {
       alert("Файл изменился, обновите страницу!");
       }
         }
  }
};
xmlhttp.send(null);
}

danik.js 13.02.2013 22:31

кроссбраузерный xhr уже вшит в jQuery :)

$(document).ready(function(){
    function checkchanges(){
        $.ajax({
            url: 'test.php',
            data: {file: 'file.txt'},
            complete: function(response) {
                alert(response);
                setTimeout(checkchanges, 5000);
            }
        });
    }
    setTimeout(checkchanges, 5000);
});


<?php
$file = (string) $_REQUEST['file'];


Где хранить время последнего изменения... Ну либо в БД, либо в файлике (правда тут наверно возникнет проблема при одновременной записи из нескольких экземпляров скрипта), либо может в сессию. Либо при генерации страницы опеределять время последнего изменения файла, и отмечать ввиде javascript-переменной.

var lastModified = <?=filemtime($file)?>;

...
$.ajax({
            url: 'test.php',
            data: {file: 'file.txt', since: lastModified},

Smip 14.02.2013 03:05

Сделал так, незнаю насколько это корректно, но работает, обновляется каждые 30 секунд, может кому-то пригодится. Основной файл:

$mtime = filemtime("file.txt");
echo "<script>var timer = setInterval(function() { checkchanges($mtime); }, 30000);</script>"; 

<script type="text/javascript">
function getXmlHttp(){
  var xmlhttp;
  try {
    xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
    try {
      xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (E) {
      xmlhttp = false;
    }
  }
  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
    xmlhttp = new XMLHttpRequest();
  }
  return xmlhttp;
}

function checkchanges($mtime){
var xmlhttp = getXmlHttp()
xmlhttp.open('GET', '/test.php?r='+Math.random()+"&f=file.txt", true);
xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4) {
     if(xmlhttp.status == 200) {
       if($mtime != xmlhttp.responseText) {
       alert("Файл обновился, пожалуйста, перезагрузите страницу!");
       clearInterval(timer);
       }
         }
  }
};
xmlhttp.send(null);
}
</script>


И файл test.php:

<?php 
$file = $_GET['f'];
clearstatcache();
echo (filemtime($file));
?>


danik.js, спасибо что ткнул носом куда смотреть. :dance:

Farsatanis 13.08.2013 11:51

Ребят , привет. I need help как говрится . Есть страничка выводящая текст из файла. Нужно сделать так , чтобы при обновлении содержимого файла страничка моментально отображала изменения. я хз как сделать. Пытаюсь использоовать приведенный выше код чтобы ловить момент когда файл изменяется.
Но чутка не догоняю. Вот тут "Основной файл" у вас. И как я понимаю это вроде должен быть html весь. А тут в начале вот эта php-ка. ТАк и должно быть?

$mtime = filemtime("file.txt");
echo "<script>var timer = setInterval(function() { checkchanges($mtime); }, 30000);</script>";


И вот собственно страничка моя ,отображающая содержимое файла:

<!DOCTYPE HTML>
<html>
<head>
    <title>View file</title>
      
</head>   
<body>
<script src="/static/jquery.js" type="text/javascript"></script>
<pre style ="background:beige;text-align:center;font-size:20px">{{loglines}}</pre>
</body> 
</html>

danik.js 13.08.2013 14:09

Farsatanis, как узнать что файл обновился? Вот у тебя файл, все что ты можешь узнать - время последнего обновления файла. Как узнать что файл обновился только что (со времени последней проверки)?


Часовой пояс GMT +3, время: 18:44.