Главная » Полезные статьи » Язык PHP » Синхронизация веб-каталогов на PHP
Распечатать статью

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

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

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

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

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

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

Скрипт для сбора информации о веб-каталоге (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;$ia_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»; } } 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>Keys in $fn1:».count($ka1).»</p>»; $ka2=array_keys($a2_size); echo «<p>Keys in $fn2:».count($ka2).»</p>»; $counter=0; for ($i=0;$i<count($ka1);$i++) { Вывод информации $counter++; } …skipped…

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

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

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

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

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

Похожие статьи