При регулярном обновлении сайта нередко возникает ситуация , когда при обновлении связь обрывается и приходиться начинать сначала обновление. При обновлении же сайта состоящего из множества каталогов , вполне вероятно что некоторые файлы не будут обновлены или закачаны вообще.
При наличии на вашем сайте PHP существует достаточно простое решение проблеммы : на вашем сайте (не имеет значения на какой платформе он размещен) и на вашем "рабочем" (локальном) компьютере размещается скрипт, который дает возможность получить информацию о размещенных файлах и их размерах.
После получения информации от скриптов сбора информации на локальном месте также запускается анализа результатов выполнения "локального" и "удаленного" скриптов и появляется возможность точно синхронизировать веб-каталоги.
Итак рассмотрим требования к , программе, позволяющей делать подобную синхронизацию :
Программа , должна давать однотипную информацию о размещенных файлах и каталогах на различных платформах. Как минимум Я рассматривал запуск скрипта ,сбора информации, на FreeBSD и Windows.
В эталонном веб-каталоге программа должна давать статистику о несоответствии веб-каталогов и о типе несоответствия.
Результаты выполнения программы на удаленной машине должны быть доступны для получения в виде файла.
Эти минимальные требования , успешно выполняет программа , написанная на PHP. Благодаря наличию версий как для UNIX так и для Windows , достигается универсальность работы - и при этом потенциально исключается возможность возникновения ошибок , связанных с различной работой , собирающих информацию, программ на различных платформах.
Рассмотрим часть программы (которая полностью доступна для скачивания в разделе "Загрузка/PHP" сайта "Программы для бизнеса"), которая ответственна за сбор информации о веб-каталоге.
Скрипт для сбора информации о веб-каталоге (sh.php)
Как видим , программа состоит из класса , реализующего нужную нам функциональность.
Функция класса function find($in_dir) реализует сбор информации о веб каталоге и помещает ее в ассоциативные массивы. Ключом массива является путь в конкретному файлу , благодаря этому достигается одинаковое представление информации на различных платформах и отпадает необходимость в явной сортировке.
Функция класса function prnt() выводит, собранную в массивах информацию в лог-файл $db_fname = "sync.zip" ;
Итак для синхронизации удаленного веб-каталога с локальным - необходимо , в удаленном веб-каталоге поместить скрипт , сбора информации в каталог удаленного веб-сайта и вызвать его через браузер. При запуске скрипта в окне браузера вы увидите ссылку на файл который необходимо скачать в локальный веб-каталог и назвать sync_vov.zip .
После чего необходимо запустить локальный скрипт , только уже анализа информации,(из веб каталога в котором вы только что разместили лог-файл с удаленного сервера). Этот скрипт создаст локальный лог-файл sync.zip и сравнит его содержимое с содержимым лог файла с удаленного сервера. Результат сравнения будет выдан на экран в виде списка отсутствующих файлов (красным цветом) и списка файлов у которых отличаеться размер.
Вот фрагмент программы , реализующей сравнение удаленного и локального лог-файлов:
Скрипт для анализа информации о веб-каталогах (analis.php)
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, видится использование подсчета контрольной суммы в каждом файле на удаленной и локальной машине.