文件更改时刷新页面

时间:2017-01-02 19:38:24

标签: javascript php

我希望javascript在对服务器上的页面文件进行修改时刷新页面。

我使用api.php(见下文)来获取文件的文件修改时间并将其作为json返回。

因此从api.php获取数据没有问题,但如何将旧值与javascript中的新值进行比较并刷新页面(如果是这种情况)。

这是我到目前为止所做的:

var oldVar = 0; 

setInterval(function(){ 
$.getJSON('api.php', function(data) {
    console.log(data);

    var obj = data;

    var filedate = obj.filedate;



    if (oldVar != filedate) {
            location.reload();
    };

    var oldVar = filedate;


});
}, 1000); // 1 second

显然这会使页面每秒刷新一次,但我不知道如何继续。

这是我用于获取数据的PHP代码,我使用filemtime来检查服务器上的文件修改时间。

<?php

     $filename = "test.php";

     if (file_exists($filename)) {
          $dateFile = date("s", filemtime($filename));
          $dateOfFile = array('filedate' => "$dateFile"); 

          echo json_encode($dateOfFile);    
     }

?>

2 个答案:

答案 0 :(得分:1)

<强>的JavaScript

var interval = setInterval(function(){ 
    $.getJSON('api.php', function(data) {
        if (getCookie('old_modification') != data.filedate) {
            window.location.reload();
        };

        setCookie('old_modification', data.filedate);
    });
}, 1000);

function setCookie(name, value) {
    var cookie_string = name + "=" + encodeURI(value);
    document.cookie = cookie_string;
}

function getCookie(cookie_name) {
    var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)');
    return results ? unescape(results[2]) : null;
}

if(getCookie('old_modification') === null) {
    setCookie('old_modification', 0);
}

<强> PHP

$filename = "test.php";

if (file_exists($filename)) {
    echo json_encode(array(
        'filedate' => filemtime($filename)
    )); 
}

由于您每次都在重新加载页面,因此oldVar值始终设置为0,并且当您使用从中接收的数据检查其值时,它不会生效计时器中的AJAX。

在这里,您需要一些存储来保存和更新旧值。我更喜欢为此目的使用cookie。我没有其他选择,除了另一个选项是更新页面的某个部分而不是重新加载页面本身。

我使用this引用来获取和设置使用JavaScript的cookie,因为它比我的简单易用,并根据您的要求对其进行了一些更改。

回到PHP部分,我不确定为什么在s函数中使用date格式。它只能从文件的修改时间开始几秒钟,这是不可靠的,因为在某些时候秒可能是相同的。例如,您在11:30:50修改文件并再次在11:31:50修改文件,它将在重新加载页面时生效。此外,我知道这是一种非常罕见的情况。尽管如此,坚持使用filemtime,因为它会返回unix时间戳,并且不会随时变得相同。

希望它有所帮助!

答案 1 :(得分:0)

您正在使用date("s", ...),它只返回时间的秒部分 - 即现在我的时区是11:42:16,因此会返回值"16"。您想要的是自纪元以来的总秒数,您可以使用date()函数获得,但使用time()返回整数会更容易。

同样在您的JS代码中,您使用var重新定义变量 - 不要这样做。 :)