11.02.2013, 17:17
|
Интересующийся
|
|
Регистрация: 23.01.2013
Сообщений: 19
|
|
Сообщение при изменении файла.
Здравствуйте. Подскажите как можно реализовать, такую штуку... есть файл csv, и выводится содержимое в таблицы через пхп, и этот файл часто обновляется (1 раз в 30 минут), как можно сделать функцию, которая бы следила за изменением файла csv и если такое случилось, выдовало сообщение что перезагрузите страницу, файл обновился...
Может где-то такое есть в интернете, но я сколько не искал, ничего внятного не могу найти...
Я понимаю что надо смотреть на дату изменения, но как это реализовать незнаю
|
|
11.02.2013, 17:27
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Делаете по таймеру xhr-запрос (ajax) на сервер, к некоторому скрипту(php), который проверяет изменение файла. Запрос делаете например раз в минуту.
|
|
11.02.2013, 17:57
|
Интересующийся
|
|
Регистрация: 23.01.2013
Сообщений: 19
|
|
Я это примерно понял...
$file = "file.txt";
$mtime = filemtime($file);
while (true) {
clearstatcache();
if ($mtime < filemtime($file)) {
echo "Состояние изменилось!";
break;
}
usleep(200000); // 0.2 сек
}
пхп скрипт должен быть примерно такой? как сделать xhr-запрос а то я в этом вообще не бум-бум
|
|
13.02.2013, 21:00
|
Интересующийся
|
|
Регистрация: 23.01.2013
Сообщений: 19
|
|
Почитал то что Вы мне порекомендовали, кое что понял кое что нет....
Вот что у меня получилось:
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, как мне теперь впихнуть сюда проверку изменения файла не пойму... я так понимаю в этот файл нужно передавать время последнего изменения когда открылась страница, в этом файле нужно сравнить какое было, и какое сейчас, если изменилось то выдать например тот же алерт...
|
|
13.02.2013, 22:08
|
Интересующийся
|
|
Регистрация: 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);
}
|
|
13.02.2013, 22:31
|
|
Профессор
|
|
Регистрация: 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},
|
|
14.02.2013, 03:05
|
Интересующийся
|
|
Регистрация: 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, спасибо что ткнул носом куда смотреть.
|
|
13.08.2013, 11:51
|
Новичок на форуме
|
|
Регистрация: 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.
|
|
13.08.2013, 14:09
|
|
Профессор
|
|
Регистрация: 11.09.2010
Сообщений: 8,804
|
|
Farsatanis, как узнать что файл обновился? Вот у тебя файл, все что ты можешь узнать - время последнего обновления файла. Как узнать что файл обновился только что (со времени последней проверки)?
|
|
|
|