| |
возможностей. Сценарий собирает сведения о размере каж-
дого файла сайта, печатая на каждом этапе имена обработанных объектов, а затем
выводит сводную информацию.
Листинг 33.2. Демонстрация возможностей функции WalkSite(): demo.php
// Подключаем библиотекаря "прямым" способом.
include "$DOCUMENT_ROOT/php/Librarian.phl";
// Подключаем модуль с функцией WalkSite().
Uses("SiteWalker");
// Эта функция будет вызываться для каждого файла на сервере.
// Ее задача — добавить обработанные данные из этого файла
// в массив $Result (формат определяется назначением этих данных).
function Walk($fname,&$Result)
{ // для диагностики выводим имя файла
Часть V. Приемы программирования на PHP 500
print ">$fname ";
// в качестве примера — просто добавляем имя файла в массив
$Result[]="$fname: ".filesize($fname)."";
}
// Если WalkSite() вернула false, значит, процесс закончился.
if(!WalkSite($DOCUMENT_ROOT,"Walk","map",0,$Result)) {
// В качестве примера просто выводим содержимое массива,
// сформированного вызовами функции Walk(). Реальный код
// должен был бы вырабатывать HTML-представление карты,
// данные которой накоплены в $Result.
print " ";
print join(" \n",$Result);
} else {
// для примера заставляем страницу обновить саму себя,
// имитируя многократные посещения пользователей.
print "";
}
?>
В этом сценарии функции WalkSite() передается 0 как значение размера кванта
времени, в течение которого можно собирать данные о сайте. Это означает, что
фай-
лы будут обрабатываться по одному при каждом запросе.
В реальном коде карты сервера, конечно, это не так — нужно указывать приемлемый
промежуток времени, чтобы в него "уложилась" обработка сразу нескольких страниц.
Чем меньше будет этот промежуток, тем менее заметным для пользователя станет
замедление, связанное с работой сценария, но тем значительнее будут "накладные
расходы", вызванные работой функций сериализации. Так что тут нужно выбирать
некоторый "средний" вариант. Проще всего это сделать опытным путем — например,
так, чтобы примерно за час при известной посещаемости успевала перестроиться
вся
карта сервера.
Функция WalkSite() из листинга 33.2 работает с файлами, устанавливая на
них рекомендательные блокировки. Этот процесс хоть и позволяет обойти про-
блемы с разделением доступа к файлам, немного сложен для понимания. Он
подробно описан в главе 15 части IV.
Использование самопереадресации
Термин самопереадресация (или, в английском варианте, self-redirect) означает
свой-
ство сценария подавать в браузер клиента запрос, заставляющий его (браузер)
заново
Глава 33. Разные советы 501
выполнить и загрузить этот сценарий с сервера. Звучит, как языческое заклинание,
не
правда ли? Пожалуй, с первого взгляда не совсем ясно, зачем же может
понадобиться
эта хваленая самопереадресация в Web-программировании.
Рассмотрим пример. Предположим, у нас имеется сценарий — гостевая книга напо-
добие той, эскиз которой мы рассматривали в главе 30. С точки зрения
пользователя
сценарий представляет собой страницу с адресом
http://www.ourserver.ru/book/index.html. Если набрать этот адрес в браузе-
ре, появится, во-первых, форма с предложением добавить новое сообщение в книгу,
а
во-вторых, список ранее добавленных "посланий". В атрибуте action тэга |
|