Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.02.2013, 17:17
Интересующийся
Отправить личное сообщение для Smip Посмотреть профиль Найти все сообщения от Smip
 
Регистрация: 23.01.2013
Сообщений: 19

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

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

Я понимаю что надо смотреть на дату изменения, но как это реализовать незнаю
Ответить с цитированием
  #2 (permalink)  
Старый 11.02.2013, 17:27
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Делаете по таймеру xhr-запрос (ajax) на сервер, к некоторому скрипту(php), который проверяет изменение файла. Запрос делаете например раз в минуту.
Ответить с цитированием
  #3 (permalink)  
Старый 11.02.2013, 17:57
Интересующийся
Отправить личное сообщение для Smip Посмотреть профиль Найти все сообщения от Smip
 
Регистрация: 23.01.2013
Сообщений: 19

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

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

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


пхп скрипт должен быть примерно такой? как сделать xhr-запрос а то я в этом вообще не бум-бум
Ответить с цитированием
  #4 (permalink)  
Старый 11.02.2013, 18:45
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Нет, скрипт не должен работать бесперебойно. Пришел xhr-запрос от браузера - скрипт проверил дату, выдал результат, завершился. И так каждую минуту, к примеру.
http://learn.javascript.ru/ajax-xmlh...зования
http://learn.javascript.ru/settimeout-setinterval
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2013, 21:00
Интересующийся
Отправить личное сообщение для Smip Посмотреть профиль Найти все сообщения от Smip
 
Регистрация: 23.01.2013
Сообщений: 19

Сообщение от danik.js Посмотреть сообщение
Нет, скрипт не должен работать бесперебойно. Пришел 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, как мне теперь впихнуть сюда проверку изменения файла не пойму... я так понимаю в этот файл нужно передавать время последнего изменения когда открылась страница, в этом файле нужно сравнить какое было, и какое сейчас, если изменилось то выдать например тот же алерт...
Ответить с цитированием
  #6 (permalink)  
Старый 13.02.2013, 22:08
Интересующийся
Отправить личное сообщение для Smip Посмотреть профиль Найти все сообщения от Smip
 
Регистрация: 23.01.2013
Сообщений: 19

Во многом уже сам разобрался, сделал то что хотел, только назрел вопрос, у меня есть 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);
}
Ответить с цитированием
  #7 (permalink)  
Старый 13.02.2013, 22:31
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

кроссбраузерный 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},
Ответить с цитированием
  #8 (permalink)  
Старый 14.02.2013, 03:05
Интересующийся
Отправить личное сообщение для Smip Посмотреть профиль Найти все сообщения от Smip
 
Регистрация: 23.01.2013
Сообщений: 19

Сделал так, незнаю насколько это корректно, но работает, обновляется каждые 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, спасибо что ткнул носом куда смотреть.
Ответить с цитированием
  #9 (permalink)  
Старый 13.08.2013, 11:51
Новичок на форуме
Отправить личное сообщение для Farsatanis Посмотреть профиль Найти все сообщения от Farsatanis
 
Регистрация: 13.08.2013
Сообщений: 3

Ребят , привет. 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>

Последний раз редактировалось Farsatanis, 13.08.2013 в 11:58.
Ответить с цитированием
  #10 (permalink)  
Старый 13.08.2013, 14:09
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
При изменении img.src отображается пред.картинка kuzya_vl Элементы интерфейса 1 05.01.2013 01:15
UI DataTable при изменении размеров окна браузера Sveta jQuery 3 19.11.2012 10:02
сообщение при захоже на сайт alerzo Events/DOM/Window 4 27.09.2011 23:10
Вызов вункции при изменении экрана и при загрузке страницы frost18 Общие вопросы Javascript 2 31.08.2011 22:28
Не та кодировка при изменении элементов DOM, загружаемых через ajax ShootNik Серверные языки и технологии 16 14.10.2010 09:55