Портал для веб-мастера
Вход пользователей
Поиск статей
WoWeb.ru » Статьи » Программирование для Web » PHP

Синхронизация веб каталогов на PHP

Кириллов А.В.  

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

 

При наличии на вашем сайте PHP существует достаточно простое решение проблеммы : на вашем сайте (не имеет значения на какой платформе он размещен) и на вашем "рабочем" (локальном) компьютере размещается скрипт, который дает возможность получить информацию о размещенных файлах и их размерах.

 

После получения информации от скриптов сбора информации на локальном месте также запускается  анализа результатов выполнения "локального" и "удаленного" скриптов и появляется возможность точно синхронизировать веб-каталоги.

 

Итак рассмотрим требования к , программе, позволяющей делать подобную синхронизацию :

  • Программа , должна давать однотипную информацию о размещенных файлах и каталогах на различных платформах. Как минимум Я рассматривал запуск скрипта ,сбора информации, на  FreeBSD и  Windows. 

  • В эталонном веб-каталоге программа должна давать статистику о несоответствии веб-каталогов и о типе несоответствия.

  • Результаты выполнения программы на удаленной машине должны быть доступны для получения в виде файла.

 

Эти минимальные требования , успешно выполняет программа ,  написанная на PHP.  Благодаря наличию версий как для UNIX так и для Windows , достигается универсальность работы - и при этом потенциально исключается возможность возникновения ошибок , связанных с различной работой , собирающих информацию, программ на различных платформах.

 

Рассмотрим часть программы (которая полностью доступна для скачивания в разделе "Загрузка/PHP" сайта "Программы для бизнеса"), которая ответственна за сбор информации о веб-каталоге.

 

Скрипт для сбора информации о веб-каталоге (sh.php)

<?
class filess
{

function find($in_dir)
   {
...skipp...
        while($file = readdir($dir_handle))
        {
            if ($file!=".." && $file!="." && is_dir($in_dir."/".$file))
            {
                $this->find($in_dir."/".$file);
            }
            if (is_file($in_dir."/".$file) && $file!=".." && $file!=".")
            {
               $this->a_fname[$this->cofiles]=$file;
                $this->a_fsize[$this->cofiles]=filesize ($in_dir."/".$file);
                $this->a_fdir [$this->cofiles]=$in_dir;
                $this->cofiles++;
            }
        }
   }

function prnt()
{
    array_multisort
    (
      $this->a_fdir,SORT_DESC,
      $this->a_fsize,SORT_DESC,
      $this->a_fname,SORT_DESC
    );
    $a_size=0;

    $db_fname="sync.zip" ;
    if (file_exists($db_fname)) unlink ($db_fname);

    for ($i=0;$i<count($this->a_fname);$i++)
    { 
        $res_str="";
        $res_str=$this->a_fdir [$i]."/".
                 $this->a_fname[$i]."|".
                 $this->a_fsize[$i]."|".
                 $this->a_crc  [$i];
        WriteLine($db_fname,$res_str);
        $a_size+=$this->a_fsize[$i];
    }
...skipped...
}
}

 

Как видим , программа состоит из класса , реализующего нужную нам функциональность. 

 

Функция класса function find($in_dir) реализует сбор информации о веб каталоге и помещает ее в ассоциативные массивы. Ключом массива является путь в конкретному файлу  , благодаря этому достигается одинаковое представление информации на различных платформах и отпадает необходимость в явной сортировке.

 

Функция класса function prnt() выводит, собранную в массивах информацию в лог-файл $db_fname = "sync.zip" ;

 

Итак для синхронизации удаленного веб-каталога с локальным - необходимо , в удаленном веб-каталоге поместить скрипт , сбора информации в каталог удаленного веб-сайта и вызвать его через браузер. При запуске скрипта в окне браузера вы увидите ссылку на файл который необходимо скачать в локальный веб-каталог и назвать sync_vov.zip . 

 

После чего необходимо запустить локальный скрипт , только уже анализа информации,(из веб каталога в котором вы только что разместили лог-файл с удаленного сервера). Этот скрипт создаст локальный лог-файл sync.zip и сравнит его содержимое с содержимым лог файла с удаленного сервера. Результат сравнения будет выдан на экран в виде списка отсутствующих файлов (красным цветом) и списка файлов у которых отличаеться размер.

 

Вот фрагмент программы , реализующей сравнение удаленного и локального лог-файлов:

 

Скрипт для анализа информации о веб-каталогах (analis.php)

$fn1="sync.zip";
$fn2="sync_vov.zip";
$a_1=file($fn1);
$a_2=file($fn2);

for ($i=0;$i<count($a_1);$i++)
{
    if (preg_match("~^([^|]*)|([^|]*)|([^|]*)$~",$a_1[$i],$var))
    {
        $na_me=KillSpaces($var[1]);
        $a1_is  [$na_me]="is here";
        $a1_size[$na_me]=$var[2];
        $a1_crc [$na_me]=$var[3];
    }
    else
    {
        echo "Line: [".$a_1[$i]."] Did not match log file format !<br>";
    }
}

for ($i=0;$i<count($a_2);$i++)
{
    if (preg_match("~^([^|]*)|([^|]*)|([^|]*)$~",$a_2[$i],$var))
    {
        $na_me=KillSpaces($var[1]);
        $a2_is  [$na_me]="is here";
        $a2_size[$na_me]=$var[2];
        $a2_crc [$na_me]=$var[3];
    }
    else
    {
        echo "Line: [".$a_2[$i]."] Did not match log file format !<br>";
    }
}


$ka1=array_keys($a1_size);
echo "<p class=g>Keys in $fn1:".count($ka1)."</p>";

$ka2=array_keys($a2_size);
echo "<p class=g>Keys in $fn2:".count($ka2)."</p>";

$counter=0;
for ($i=0;$i<count($ka1);$i++)
{
 Вывод информации
 $counter++;
}
...skipped...

 

Как вы видите принцип работы анализатора логов состоит в заполнении двух ассоциативных массивов, информацией из лог файлов и их сравнении.  

Как дальнейшее развитие идеи синхронизации каталогов на PHP, видится использование подсчета контрольной суммы в каждом файле на удаленной и локальной машине.

Автор: Кириллов А.В. · Добавлена: 2002-07-04
Просмотров: 2889 · Рейтинг: 5.0

Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]

Категории раздела
Flash
Apache
WWW
PhotoShop
Веб-дизайн
Раскрутка и реклама
Базы данных
3D графика
Хостинг
Истории веб-мастеров
Web-технологии
Сетевая безопасность
Программирование для Web
Операционные системы

Новые статьи
Лучшие статьи
Популярные статьи
Комментируемые статьи
Разделы сайта
Скрипты
Статьи
Шрифты
Флэш исходники
HTML шаблоны
Партнерки
Клипарты
Смайлы
Фоны
Гифы
Иконки
Опрос сайта
Есть ли у вас свой сайт?
Всего ответов: 141129
Наша кнопка
WoWeb.ru - портал для веб-мастера