Блог инженера-программиста / шапку скоро поменяю /

Синхронизируем папки

Понадобилось мне по работе синхронизировать папки на удаленном компьютере. Ситуация такая: дома есть компьютер (под Windows XP), на котором установлен Nod32. У компьютера выделенный белый IP, к которому привязан сайт site.ru, в папке site.ru/nod32 складываются обновления для антивируса (локальное зеркало).

На работе несколько компьютерных классов, где нужно обновлять антивирус Nod32. Настраивать для каждого обновление с site.ru не хочется, поэтому нужно создать локальную версию последних обновлений Nod32 в локальной сети университета.

Есть сервер под Linux, вот он то и будет выполнять роль локального сервера обновлений, но сначала нужно сделать автоматическую синхронизацию папок site.ru/nod32 с локальной upd.univer/nod/. Для этого повесил php-скрипт на домашнем компьютере, который отдает список файлов текущего каталога и их md5:

1
2
3
4
5
6
7
8
9
10
11
<?php
if ($handle = opendir('.')) {
    while (false !== ($file = readdir($handle))) {
        if ($file != "." && $file != ".." && $file!="index.php" && $file!="update.ver") {
            echo "$file*".md5(@file_get_contents($file))."|";
        }
    }
    echo "update.ver*".md5(@file_get_contents("update.ver"));
    closedir($handle);
}
?>

Из списка убираются папки («.», «..», сам файл «index.php» и «update.ver» — его добавлю в конце).
На сервере университета создаю php-скрипт следующего содержания:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
  error_reporting(0);
  $servadr="http://site.ru/nod32/";
  $fileplace=dirname(__FILE__)."/nod/";
  $nod32=@file_get_contents($servadr."index.php");
  if ($nod32)
  {
    $nod32=explode("|",$nod32);
    foreach($nod32 as $fn)
    {
      $zz=explode("*",$fn);
      if (!file_exists($fileplace.$zz[0]) || md5(@file_get_contents($fileplace.$zz[0])) != $zz[1])
      {
        $tmpfl=@file_get_contents($servadr.$zz[0]);
        if ($tmpfl) @file_put_contents($fileplace.$zz[0],$tmpfl);
      }
    }
  }
?>

Скрипт обращается к site.ru, берет оттуда список файлов и их md5, сравнивает md5 каждого файла с тем, который лежит в локальной папке и в случае различия закачивает файл с site.ru в локальный каталог.

Осталось создать cron-задачу для регулярной автоматической синхронизации баз. Чтоб выполнить php скрипт через крон нужна команда  /usr/local/bin/php -q полный_путь_до скрипта >/dev/null (в таком случае не будет никаких писем администратору даже при ошибках).

Комментарии на: "Синхронизируем папки" (4)

  1. Была такая же ситуация — решается использованием sitecopy (синхронизирует локальные папки, локальную папку с удаленным сервером и наоборот)

  2. Добрый вечер!
    У меня возник ещё один вопрос. Мне необходимо сделать список файлов в виде ссылок и иконок директорий, которые находятся в папке htdocs Apache. Я знаю, что это можно сделать довольно легко, удалив из этой папки все файлы, находящиеся там, и поместить туда все, что необходимо вывести в виде списка в браузере. Затем в адресной строке нужно ввести localhost и список выводится в браузер. Но! При создании связки Apache+PHP+MySQL такой способ уже не проходит. Подскажите, пожалуйста, как мне нужно поступить в этом случае.

    • Инженер said:

      А при чем этот вопрос к данной статье о синхронизации папок? Возможно, вопрос относится к статье http://otadmina.ru/ustanovka-apache-php-mysql-pod-windows/

      По делу: Попробуйте в нужной папке создать файл .htaccess (обратите внимание на точку в начале) со следующим содержимым:

      1
      2
      allow from all
      Options +Indexes

      и удалите в этом каталоге файлы index.php, index.html, index.htm — после этого в браузере должен выводиться стандартный список файлов директории.

      После прочтения если будут дополнительные вопросы — напишите, пожалуйста, свой предыдущий комментарий и новый вопрос в комментариях к соответствующей статье — я туда перенесу свой ответ и попытаюсь помочь.

      Если все так как Вам нужно — просто напишите это здесь и я удалю все не подходящие к статье комментарии.

  3. Забыл упомянуть, что для этого я создавал файл .htaccess с командой Options Indexes FollowSymLinks и помещал его в эту директорию.