2

我正在制作一个在线 jQuery 幻灯片,用于显示当地体育社区的最新分数。幻灯片是由 Powerpoint 演示文稿制作的图像,它们使用 Windows 程序 Autover 自动与我的 Centos6 服务器上的目录同步。

为了获得良好的用户体验,最好在更新图像时刷新页面(或显示一些分数已更新的文本并让用户刷新)。我可以设置元刷新,每 10 分钟刷新一次页面,但这不是一个理想的解决方案。

浏览其他主题我发现仅使用 Javascript 无法监控服务器目录。

我现在的想法是制作一个返回 true(已更改)或 false(未更改)的 php 脚本,并使用 javascript 每 5 分钟从幻灯片网页调用此脚本。

对于 php 脚本,我使用这些解决方案阅读了一些主题:

  • Inotify-tools(Centos 默认不安装)
  • FAM(可能已过时?)
  • 制作目录的 md5 散列,并将其与之前的散列进行比较。

以上哪种解决方案是最好的方法?有人可以为我提供一个 php 示例吗?不幸的是,我的 php 技能不是那么好。

4

4 回答 4

3

使用 PHP 函数stat可以获取目录的信息。

文件在这里: http: //php.net/manual/en/function.stat.php

例如,您可以获得修改时间和目录大小,如下所示:

dir_stat.php

<?php
$stat = stat('\path\images');
echo 'time: ' . $stat['mtime']; /* time of last modification (Unix timestamp) */
echo 'size: ' . $stat['size'];  /* size in bytes */
?>

在客户端,您可以检索目录信息并以固定的时间间隔进行比较。示例代码可能与 jQuery 类似。

<script language="javascript">

var myVar=setInterval(function(){chekUpdate()},5*60*1000); // at 5 minutes intervals
var stat_old = "";
function chekUpdate()
{
    $("#stat").load("/path/to/dir_stat.php",function(){
        var stat_new = $("#stat").html();
        if((stat_old != "") && (stat_old != stat_new)){
            refreshSlideShow();
        }
        stat_old = stat_new;
    });
}
function refreshSlideShow()
{
    // you can refresh your slideshow here.
}
</script>
<body>
<div id="stat">
</div>
</body>
于 2012-12-26T12:48:21.943 回答
1

这个想法是你每 N 分钟向服务器发出一个异步请求,服务器返回目录内容(例如 JSON 数组中的文件名):如果它们自上次更新以来发生了变化,你相应地修改你的 DOM。所以你只需要实现一个PHP服务来列出目标目录的内容并返回序列化的文件名列表。不需要哈希,也不需要 inotify。

请注意,这种设计在资源使用方面没有必要(主要是带宽,但由于传入请求的数量很大,还有 CPU),因为如果目录 365 天不更改,客户端仍然会发出大量无用的请求。资源使用显然可以通过引入所谓的服务器推送来优化:您的客户端可能会保持与服务器的长连接,并且当发生变化时,服务器本身会将新数据传递给所有连接的客户端。

不幸的是,由于环境支持不佳,服务器发送的事件通常不使用 PHP 开发,因此您必须切换到其他一些技术(谷歌用于彗星服务器,或支持 websocket 的服务器),这就是为什么 inotify 永远不会发挥作用的原因使用 PHP(即使它有一个 PHP 包装器)。

于 2012-12-26T11:48:34.943 回答
0

不需要 ajax 调用只需更新 src 并传递一个随机查询字符串以强制浏览器重新查找服务器上的图像并在浏览器窗口上更新它们

 <script type='text/javascript'>
        function updateImages()
        {
             document.getElementById('img_slide1_element_id').src = 'Slide1.JPG?' + Math.random();
             document.getElementById('img_slide2_element_id').src = 'Slide2.JPG?' + Math.random();
                 window.setTimeout(function(){
                   updateImages();
                 }, 60000 * 10);
        }
        window.setTimeout(function(){
            updateImages();
        }, 60000 * 10);
    </script>
于 2012-12-26T12:21:36.020 回答
0

这是我的尝试:

<?php

$filename = "plaatjes/Dia1.JPG";
$myFile = "plaatjes/timestamp";

if (file_exists($myFile)) {
    $fh = fopen($myFile, 'r');
    $theData = fread($fh, filesize($myFile));
    fclose($fh);
}
else {
    $theData = 'x'; }

if (file_exists($filename)) {
    $timestamp = date ("F d Y H:i:s.", filemtime($filename));

    if ($theData === $timestamp) {
    echo "True";
    }
    else {
            echo "False";
            $fh = fopen($myFile, 'w') or die("can't open file");
            fwrite($fh, $timestamp);
            fclose($fh);
    }
}

?>
于 2012-12-26T13:04:29.127 回答