2

私は、地元のスポーツ コミュニティの最新のスコアを表示するためのオンライン jQuery スライドショーに取り組んでいます。スライドは、Powerpoint プレゼンテーションから作成された画像であり、Windows プログラムの Autover を使用して、Centos6 サーバー上のディレクトリと自動的に同期されます。

優れたユーザー エクスペリエンスのためには、画像が更新されたときにページが更新されると便利です (または、スコアが更新されたことを示すテキストを表示して、ユーザーが更新できるようにします)。ページを 10 分ごとに更新するためにメタ更新を設定できますが、それは理想的な解決策ではありません。

他のトピックを参照していると、Javascript だけを使用してサーバー ディレクトリを監視することはできないことがわかりました。

私の考えは、true(変更された)またはfalse(変更されていない)を返すphpスクリプトを作成し、javascriptを使用して5分ごとにスライドショーWebページからこのスクリプトを呼び出すことです。

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は必要ありません。

ディレクトリが365日間変更されない場合でも、クライアントは多くの役に立たない要求を発行するため、この設計はリソースの使用量(主に帯域幅だけでなく、着信要求の数が多いためCPUも)に不必要に重いことに注意してください。リソース使用量は、いわゆるサーバープッシュを導入することで明らかに最適化できます。クライアントはサーバーへの長い接続を維持し、何かが変更されると、サーバー自体が接続されているすべてのクライアントに新しいデータを配信します。

残念ながら、サーバー送信イベントは通常、環境サポートが不十分なためPHPで開発されないため、他のテクノロジー(cometサーバーの場合はgoogle、またはwebsocket対応サーバー)に切り替える必要があります。そのため、inotifyが機能することはありません。 PHPを使用します(PHPラッパーがある場合でも)。

于 2012-12-26T11:48:34.943 に答える
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 に答える
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 に答える