Теперь, когда вы знаете, как защитить страницу, можно приступить к запросу защищенной страницы. Как было сказано ранее, функция fopen позволяет задавать имя пользователя и пароль в качестве части URL, но можно столкнуться и с более сложной ситуацией, в которой понадобится обратиться к функции fsockopen. Необходим заголовок запроса аутентификации. Значением этого заголовка являются разделенные двоеточием имя пользователя и его пароль. В соответствии со спецификацией HTTP эта строка представлена в кодировке base64.
Сценарий в листинге 24.2 обращается к сценарию в листинге 24.1. Для того чтобы он заработал на вашем Web-сервере, может потребоваться изменить URI. Сценарий предполагает, что вы установили все примеры на Web-сервере в каталоге /corephp/ listings. Если у вас вызывает недоумение то, что каждая строка завершается rn, хочу напомнить, что все строки, отправленные на HTTP-серверы, должны завершаться символами "возврат каретки" и "перевод строки".

Листинг 24.2. Запрос защищенного документа

<html> <head>
^^^хЛистинг 24.2</title>
</head>
<body>
<pre>
<?php
// Открыть сокет
if(!($fp = fsockopen("localhost", 80)))
{
print("Открыть сокет невозможно!<br>n"); exit;
}
// запросить документ
fputs($fp, "HEAD /corephp/listings/24-1.php HTTP/1.0rn"); // отправить имя пользователя и его пароль fputs($fp, "Authorization: Basic " . base64_encode("leon:secret") .
"rn");
// завершить запрос fputs($fp, "rn"); // вывести ответ сервера fpassthru($fp);
?>
</pre>
</body>
</html> 
24.2. Управление кэш-памятью браузера
Одним из ограничений, влияющих на создание динамических Web-страниц, является поведение кэш-памяти. Браузеры имеют свою собственную кэш-память и по умолчанию могут проверять новую версию страницы только один раз во время одного сеанса. Кроме того, некоторые провайдеры услуг Internet имеют свою собственную кэш-память. Это делается для того, чтобы избежать излишней передачи страниц. Однако если содержимое вашей страницы может измениться после получения каждого запроса, появление старой страницы будет раздражать. Разрабатывая Web-узел электронной коммерции, необходимо помнить, что повторная обработка каждой страницы является критичной.
С другой стороны, ваша страница может динамически создавать страницу с информацией, которая может не меняться слишком часто. Мой опыт подтверждает то, что имеет смысл сохранять URL, представляющие собой обычные HTML-файлы и не имеющие переменных, которые следуют за знаком вопроса. Хотя PHP может использовать и URL. Если информация на таких страницах меняется редко, об этом необходимо сообщить менеджеру кэш-памяти.
Протокол HTTP 1.1 описывается в документе RFC 2616, который представляет несколько заголовков, предназначенных для управления кэш-памятью. В листинге 24.3 показано, какие заголовки необходимо отсылать для того, чтобы предотвратить кэширование страниц. Заголовок Last-Modified содержит информацию о времени последней модификации документа, и установка его времени, равным текущему, сообщает браузеру о том, что версия этой страницы является свежей. Заголовок Expires сообщает браузеру о том, когда данный документ устареет и будет запрошен повторно. И опять используется текущее время, в надежде, что браузер будет хранить документ вне кэш-памяти. Вероятно, самый главный заголовок, Cache-Control, сообщает браузеру, каким образом можно кэшировать страницу. В этом случае мы сообщаем, чтобы страница не кэшировалась. Четвертый заголовок не предназначен для старых браузеров, которые работают только с протоколом HTTP 1.0. Попробуйте быстро перезагрузить сценарий из листинга 24.3, и вы увидите, как изменяется дата.

| Листинг 24.3. Отправка заголовков для предотвращения кэширования_
<?php
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Expires: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate "); header("Cache-Control: post-check=0, pre-check=0", false); header("Pragma: no-cache");
?>
<html> <head>
^^^хЛистинг 24.3</title>
</head>
<body>
Текущее время <?php print(date("D, d M Y H:i:s")); ?><br>
</body>
</html>