Обновить страницу при изменении содержимого каталога

Я работаю над онлайн-слайд-шоу jQuery для показа последних результатов для местного спортивного сообщества. Слайды – это изображения, сделанные из презентации Powerpoint, которые автоматически синхронизируются с каталогом на моем сервере Centos6, используя программу Windows Autover.

Для хорошего пользовательского интерфейса было бы здорово, когда страница обновится, когда изображения будут обновлены (или покажите какой-то текст, который будет обновлен, и пусть пользователь обновится). Я мог бы установить мета-обновление, чтобы обновлять страницу каждые 10 минут, но это не идеальное решение.

Просмотрев другие темы, я узнал, что невозможно контролировать каталог сервера, используя только Javascript.

Моя идея – создать php-скрипт, который возвращает true (изменил) или false (не изменен), и вызовет этот скрипт с веб-страницы слайд-шоу каждые 5 минут с помощью javascript.

Для скрипта php я прочитал несколько тем, используя эти решения:

  • Inotify-tools (который не установлен по умолчанию для Centos)
  • FAM (может быть устаревшим?)
  • Создание хэша md5 в каталоге и сравнение его с предыдущим хэшем.

Какое из вышеперечисленных решений – лучший способ? Может ли кто-нибудь предоставить мне пример php? К сожалению, мои навыки PHP не так хороши.

Solutions Collecting From Web of "Обновить страницу при изменении содержимого каталога"

С помощью stat функции PHP вы можете получить информацию о каталоге.

Документ находится здесь: 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> 

Идея заключается в том, что каждый асинхронный запрос на сервер обрабатывается каждые N минут, а сервер возвращает содержимое каталога (например, имена файлов в массиве JSON): если они изменились с момента последнего обновления, вы соответствующим образом изменяете свой DOM. Таким образом, вам нужно только реализовать службу PHP, чтобы отобразить содержимое целевого каталога и вернуть список сериализованных имен файлов. Никаких хешей и не требуется.

Обратите внимание, что этот дизайн не нужен для использования ресурсов (в основном, для полосы пропускания, а также для процессора из-за большого количества входящих запросов), потому что, если каталог не изменяется в течение 365 дней, клиент все же оставляет много бесполезных запросов. Очевидно, что использование ресурсов может быть оптимизировано путем внедрения так называемого push-сервера: ваш клиент может поддерживать длительное соединение с сервером, а когда что-то меняется, сам сервер доставляет свежие данные всем подключенным клиентам.

К сожалению, события, отправленные сервером, обычно не разрабатываются на PHP из-за плохой поддержки среды, поэтому вам придется переключиться на некоторые другие технологии (google для кометных серверов или серверов, поддерживающих websocket), и поэтому inotify никогда не придет в игру с PHP (даже если у него есть PHP-обертка).

никаким вызовам 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> 

Вот моя попытка:

 <?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 YH: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); } } ?>