Сообщение при изменении файла.
Здравствуйте. Подскажите как можно реализовать, такую штуку... есть файл csv, и выводится содержимое в таблицы через пхп, и этот файл часто обновляется (1 раз в 30 минут), как можно сделать функцию, которая бы следила за изменением файла csv и если такое случилось, выдовало сообщение что перезагрузите страницу, файл обновился...
Может где-то такое есть в интернете, но я сколько не искал, ничего внятного не могу найти... Я понимаю что надо смотреть на дату изменения, но как это реализовать незнаю :help: |
Делаете по таймеру xhr-запрос (ajax) на сервер, к некоторому скрипту(php), который проверяет изменение файла. Запрос делаете например раз в минуту.
|
Я это примерно понял...
$file = "file.txt"; $mtime = filemtime($file); while (true) { clearstatcache(); if ($mtime < filemtime($file)) { echo "Состояние изменилось!"; break; } usleep(200000); // 0.2 сек } пхп скрипт должен быть примерно такой? как сделать xhr-запрос а то я в этом вообще не бум-бум :) |
Нет, скрипт не должен работать бесперебойно. Пришел 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, как мне теперь впихнуть сюда проверку изменения файла не пойму... я так понимаю в этот файл нужно передавать время последнего изменения когда открылась страница, в этом файле нужно сравнить какое было, и какое сейчас, если изменилось то выдать например тот же алерт... |
Во многом уже сам разобрался, сделал то что хотел, только назрел вопрос, у меня есть 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); } |
кроссбраузерный 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}, |
Сделал так, незнаю насколько это корректно, но работает, обновляется каждые 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: |
Ребят , привет. 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, как узнать что файл обновился? Вот у тебя файл, все что ты можешь узнать - время последнего обновления файла. Как узнать что файл обновился только что (со времени последней проверки)?
|
Часовой пояс GMT +3, время: 18:44. |