如何检查内容txt文件是否已更改

how to check if content txt file has changed

本文关键字:文件 txt 是否 何检查 检查      更新时间:2024-06-03

情况:我用php读取.txt文件的内容,用AJAX将内容加载到div中。javascript每5秒检查一次.txt文件并将内容放入div中。如果.txt文件的内容发生了变化(我在表单提交时就是这样做的),div的内容会在5秒钟后自动发生变化。为此;我使用一个有3个选项的复选框:状态:可用状态:忙状态:已暂停

上面的3行中有一行在.txt文件中。现在的情况是:每5秒检查一次.txt文件,每5秒刷新一次div。如果.txt文件的内容没有改变,有可能不刷新吗?

我怎样才能做到这一点?

javascript下方:

 function Ajax()
    {
        var
            $http,
            $self = arguments.callee;
        if (window.XMLHttpRequest) {
            $http = new XMLHttpRequest();
        } else if (window.ActiveXObject) {
            try {
                $http = new ActiveXObject('Msxml2.XMLHTTP');
            } catch(e) {
                $http = new ActiveXObject('Microsoft.XMLHTTP');
            }
        }
        if ($http) {
            $http.onreadystatechange = function()
            {
                if (/4|^complete$/.test($http.readyState)) {
                    document.getElementById('ReloadThis').innerHTML = $http.responseText;
                    setTimeout(function(){$self();}, 5000);
                }
            };
            $http.open('GET', 'loadtxt.php' + '?' + new Date().getTime(), true);
            $http.send(null);
        }
    }

Loadtxt.php

<?php
        //
        $file = "status.txt";
        $f = fopen($file, "r");
        while ( $line = fgets($f, 5000) ) {
        echo $line;
        }
?>

div:

<script type="text/javascript">
    setTimeout(function() {Ajax();}, 5000);
</script>
<div id="ReloadThis">Default text</div>

计算服务器端文件的HASH。请使用AJAX检查哈希(比如SHA1或MD5),并仅在哈希自上次查找以来发生更改时更新div?

也许服务器上的这个PHP函数可以在这里提供帮助?

string hash_file ( string $algo , string $filename [, bool $raw_output = false ] )

我在这个链接上找到了:http://php.net/manual/en/function.hash-file.php

所以像这样的事情(我无法测试这一点;所以这里非常欢迎编辑):

filehash.php:

<?php
    $file = "status.txt";
    echo hash_file( "SHA1", $file, $raw_output=false )
?>

设置类似"fileHash"的Javascript变量:

var fileHash;

使用对新PHP脚本的AJAX调用填充:

[...]
     $http.open('GET', 'filehash.php' , true);
     newFileHash=$http.responseText;
     if (fileHash!=newFileHash) { // file changed - so fetch contents
         [...]
         // check me here: can we just make use of $http twice here ?
         $http.open('GET', 'loadtxt.php' + '?' + new Date().getTime(), true);
         // update div.
         document.getElementById('ReloadThis').innerHTML =$http.responseText;
         fileHash=newFileHash;
     } 
     setTimeout(function(){$self();}, 5000);
[...]

备选建议:

你的网络服务器可能能够自动返回一个HTTP代码,声明文件自上次请求以来没有更改(通过与你的浏览器标题进行比较),例如HTTP 304:

来自维基百科:

304未修改指示自请求标头指定的版本以来未对资源进行过修改If modified since或如果不匹配。这意味着无需重新传输资源,因为客户端仍然有以前下载的副本。

看起来你已经在GET请求中添加了一个时间戳参数——我认为这会阻止你的浏览器缓存文本文件的旧副本:如果你选择了上面的方法,你应该从GET请求中删除它——因为这会在你每次请求新文档的Web服务器上显示出来。