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