替代setInterval以查看文件是否已被修改?

时间:2013-12-03 13:44:39

标签: javascript php ajax

我正在尝试查看服务器上是否修改了文件。目前,我每秒都有setInterval检查。它使用AJAX来调用PHP脚本,该脚本根据JS认为应该是什么来检查文件长度。我的问题是,有更好/更有效的方法吗?

(我正在使用一个mutObserver来获取其他东西,这让我想知道是否还有类似的东西可以帮助解决这个问题......)

JS:

function checkFile() {
var fReader = new XMLHttpRequest();
var params = "MODE=CHECK&File=Data.txt";

fReader.open("POST","File.php",false);

fReader.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
fReader.setRequestHeader("Content-length", params.length);
fReader.setRequestHeader("Connection", "close");

fReader.send(params);

return JSON.parse(fReader.responseText).CHECK > myLength;
}

PHP:

switch($MODE) {

    case('CHECK'):
        if(file_exists($_POST['File'])){
            $return['CHECK'] = count(file($_POST['File']));
        }
        break;
    case('GET'):

        $lines = file($_POST['File']);
        $length=$_POST['LEN'];#This is the number of lines JS has.

        $count = count($lines);

        if ($length < $count) {
            $return['GET'] = array_slice($lines,$length);
        } else {
            #return all lines.
            $return['GET'] = $lines;
        }
        break;

...

}
echo json_encode($return);

我唯一的另一个想法是让AJAX异步检查文件并将响应拆分为单独的函数。 JS将发送一个文件计数(在参数中),PHP将检查该计数。如果它不同,则返回差异,否则返回null或“无变化”。目前,我正在检查上面的文件。如果它被改变了,我再次使用模式GET进行AJAX以实际获得更改......

想法?完全不同的方法?我对非常规方法持开放态度。 (我选择的浏览器是Chrome,我已经使用了扩展程序,所以我也可以在那里做一些事情......)。

谢谢, 戴夫

1 个答案:

答案 0 :(得分:2)

您使用的是投票。如果发生了变化,你会反复询问服务器。更好的解决方案是长轮询。您询问服务器一次,服务器仅在更改时返回。更好的解决方案可能是网络套接字。现在你应该专注于长轮询解决方案。

关于长轮询:

技巧在服务器的实现中,在文件发生变化之前不会返回。要让服务器确定文件是否已更改,您还可以在while循环中使用轮询,但优点是没有网络流量。可能还有其他方法可以使用PHP获取文件的状态,至少你把问题从检查远程文件的状态转到在本地检查它。