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

Автор: Topol Вторник, Апрель 17th, 2012 Нет комментариев

Рубрика: Программирование

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

 

При наличии на вашем сайте 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, видится использование подсчета контрольной суммы в каждом файле на удаленной и локальной машине.

 Источник: woweb.ru

Оставить комментарий

Чтобы оставлять комментарии Вы должны быть авторизованы.

Похожие посты