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

时间:2015-02-26 22:01:33

标签: javascript

情况: 我正在使用php和AJAX读取.txt文件的内容我将内容加载到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>

1 个答案:

答案 0 :(得分:2)

计算服务器端文件的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 )
?>

设置一个Javascript变量,例如&#39; fileHash&#39;:

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:

来自Wikipedia:

  

304未修改       表示自请求标头If-Modified-Since或指定的版本以来未对资源进行修改   如果 - 无 - 匹配。这意味着没有必要重新发送   资源,因为客户端仍然有以前下载的副本。

看起来你已经为你的GET请求添加了一个timestamp参数 - 我认为这是阻止你的浏览器缓存文本文件的旧副本:如果你选择上面的方法,你应该从你的GET请求中删除它 - 因为这会在网络服务器上显示您每次都要求提供新文档。