$f=fopen($cache,"a+b");
flock($f,LOCK_EX);
ftruncate($f,0);
fwrite($f,Serialize($Prg));
fflush($f); fclose($f);
return true; // процесс продолжается
}
// Иначе процесс закончился. Удалить файл состояния.
@unlink($cache);
return false;
}
?>
Я не буду приводить здесь реальный сценарий для построения карты сервера, потому что он слишком велик и, к тому же, довольно однообразен и неинтересен. Вся "изюминка" заключена именно в функции WalkSite(). Листинг 33.2 содержит небольшую "демонстрацию" ее возможностей. Сценарий собирает сведения о размере каждого файла сайта, печатая на каждом этапе имена обработанных объектов, а затем выводит сводную информацию.
Листинг 33.2. Демонстрация возможностей функции WalkSite(): demo.php
<?
// Подключаем библиотекаря "прямым" способом.
include "$DOCUMENT_ROOT/php/Librarian.phl";
// Подключаем модуль с функцией WalkSite().
Uses("SiteWalker");
// Эта функция будет вызываться для каждого файла на сервере.
// Ее задача — добавить обработанные данные из этого файла
// в массив $Result (формат определяется назначением этих данных).
function Walk($fname,&$Result)
{ // для диагностики выводим имя файла
print ">$fname<br>";
// в качестве примера — просто добавляем имя файла в массив
$Result[]="$fname: <b>".filesize($fname)."</b>";
}
// Если WalkSite() вернула false, значит, процесс закончился.
if(!WalkSite($DOCUMENT_ROOT,"Walk","map",0,$Result)) {
// В качестве примера просто выводим содержимое массива,
// сформированного вызовами функции Walk(). Реальный код
// должен был бы вырабатывать HTML-представление карты,
// данные которой накоплены в $Result.
print "<hr>";
print join("<br>\n",$Result);
} else {
// для примера заставляем страницу обновить саму себя,
// имитируя многократные посещения пользователей.