我正在尝试查看服务器上是否修改了文件。目前,我每秒都有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,我已经使用了扩展程序,所以我也可以在那里做一些事情......)。
谢谢, 戴夫
答案 0 :(得分:2)
您使用的是投票。如果发生了变化,你会反复询问服务器。更好的解决方案是长轮询。您询问服务器一次,服务器仅在更改时返回。更好的解决方案可能是网络套接字。现在你应该专注于长轮询解决方案。
关于长轮询:
技巧在服务器的实现中,在文件发生变化之前不会返回。要让服务器确定文件是否已更改,您还可以在while循环中使用轮询,但优点是没有网络流量。可能还有其他方法可以使用PHP获取文件的状态,至少你把问题从检查远程文件的状态转到在本地检查它。