Отправляет email-рассылки с помощью сервиса Sendsay

Построй свой сайт на PHP!

  Все выпуски  

Построй свой сайт на PHP!


Информационный Канал Subscribe.Ru

Построй свой сайт на PHP!

искать в
Здравствуйте, уважаемые читатели.

Перед вами очередной выпуск рассылки "Построй свой сайт на PHP!", в котором вы можете найти окончание статьи "Кэширование в PHP".

Мне очень важно знать, какие материалы вы бы хотели видеть в рассылке. С предложениями по темам будущих выпусков вы можете обращаться ко мне по e-mail: wanderer@php.net (обратите внимание на то, что при отправке первого сообщения от вас требуется подтвердить свой адрес).

Кроме того, в связи с тем, что у многих читателей этой рассылки периодически возникают разного рода вопросы по PHP и связанным технологиям, мной была открыта почтовая конференция, в которой все эти вопросы можно (и нужно) обсудить. Для того, чтобы подписаться необходимо отправить пустое сообщение с темой 'subscribe' (без кавычек) на phpdev-request@never-invited.com. Вам придет ответ от почтового демона, содержащий строчку, которую вам необходимо будет отправить обратно для подтверждения статуса подписки. После этого вам придет уведомление о подписке, и вы сможете отправлять письма в конференцию с помощью адреса phpdev@never-invited.com

С уважением, Олег Шимчик aka The Wanderer. wanderer@php.net, ICQ#:233661333, Сайт

Кэширование в PHP - Часть 2

PEAR Cache

В пакет PEAR Cache вошла практически вся функциональность, необходимая для работы с кэшем, которую только можно представить. Пакет не привязан к какому-либо формату и месту хранения кэша. В комплекте с пакетом поставляется 8 типов контейнеров (PEAR/DB, ext/dbx, PEAR/MDB, PHPLib, msession, файловый кэш (кодированный и нет) и совместно используемая память). При необходимости можно написать свой собственный контейнер, если ни один из вышеперечисленных по какой-то причине вас не устраивает.

Примеры использования

Cache имеет тот же самый интерфейс, что и уже рассмотренный нами Cache_Lite, так что код, использующий оба пакета, в общем случае очень похож:

<?PHP
//Включаем код Cache в программу
require_once('Cache/Cache.php');

//Указываем, что хранить кэш необходимо в файлах в директории cache/
$cache = new Cache('file', array('cache_dir' => 'cache/') );
$id $cache->generateID('testentry');

//Кэш на месте?
if ($data $cache->get($id)) {
   
//Кэш получен. Выводим.
   
print "<font color=\"green\">Кэш обнаружен.</font><br />Данные: $data";

} else {
   
//Кэш не найден. Говорим об этом пользователю и кэшируем необходимые данные.
   
$data 'какие-то данные';
   
$cache->save($id$data);
   print 
'<font color="red">Кэш не найден.</font><br />';
}
?>

При первом запуске приведенного выше примера скрипт сообщит нам о том, что кэш не найден, и создаст этот самый кэш в директории cache/. Если заглянуть туда, то вы обнаружите поддиректорию default, в которой и находится файл с кэшем. Любопытный читатель может попытаться распознать в его содержимом исходную строку. При повторном же запуске скрипта будет показано сообщение о том, что кэш обнаружен, и закэшированная ранее строка ``какие-то данные`` предстанет перед нами во всей красе.

! Для удобства работы с кэшем предусмотрена возможно отнести данные к определенной группе. По умолчанию это группа ``default``. Однако, никто не мешает вам переназначить ее. К примеру, если вы хотите сохранить данные для группы ``news``, то это можно сделать следующим образом:

$cache->save($id$data, 'news');

Соответственно, теперь при получении кэша тожне нужно указывать группу, в которой находится кэш:

$data $cache->get($id, 'news');

Еще одна особенность PEAR Cache - это возможность кэширования изображений, сгенерированных вашим скриптом.

Надо отметить, что динамическая генерация изображений - достаточно трудоемкая задача, которая, при отсутствии кэширования и достаточно большой посещаемости, может запросто сьесть все ресурсы вашего сервера. Поэтому кэширование сгенерированных автоматически изображений может во многих случаях дать серьезный выигрыш в скорости. В пакете Cache существует отдельный класс Cache_Graphics, который позволяет решить данную проблему.

<?PHP
//Включаем код Cache_Graphics в программу.
include('Cache/Graphics.php');
/* Инициализируем новый экземпляр класса Cache_Graphics.
   Заметьте, что никаких входных параметров указывать не нужно. */
$cache = new Cache_Graphics();
// Назначаем директорию, в которой будет хранится кэш.
$cache->setCacheDir('cache');
// Создаем пустое изображение размером 100x50 пикселей.
$img ImageCreate(10050);

 
// генерируем идентификатор для нашего изображения
$id md5('mytestimage');
 
/* Проверяем, есть ли уже наше изображение в кэше.
   Обратите внимание на второй параметр: он указывает
   формат изображения и может принимать четыре различных
   значения: 'gif', 'jpg', 'png' и 'wbmp' */
if (!($link $cache->getImageLink($id'png'))) {
  
   
// Оказывается, что нашего изображения в кэше нет. Создаем его.
   
$background_color imagecolorallocate($img255255255);
   
$text_color imagecolorallocate($img000);
   
imagestring($img255,  "Hello, world!"$text_color);
   
// Генерируем изображение в формате png и получаем ссылку на него.
   
$link $cache->cacheImageLink($id$img'png');
 
 }
 
// Генерируем тег img, который покажет нам наше изображение.
 
$size getImageSize($link[0]);
 
printf('<img src="%s" %s>'$link[0], $size[3]);
?>

В приведенном выше примере мы генерируем изображение только один раз: при первом запросе. После этого скриптос просто выводится ссылка на уже сгенерированное изображение.

Еще одна возможность Cache, которую просто грешно обойти стороной, это возможность кэширования файлов, расположенных на удаленном хосте. Для того, чтобы воспользоваться этой возможностью, у вас в системе должны быть установлены PEAR-пакеты NET_URL и HTTP_Request:

<?php
//Включаем код HTTP_Request в нашу программу
require_once('Cache/HTTP_Request.php');

// Формируем запрос к удаленном хосту. Время жизни кэша - 1 час.
$cache = new Cache_HTTP_Request('http://php.net/'null'file'null3600);
// Посылаем запрос.
$cache->sendRequest();
// Тело ответа.
$body $cache->getResponseBody();
// Заголовки, полученные от удаленного хоста.
$header $cache->getResponseHeader();
// Код ответа.
$code $cache->getResponseCode();
// Выводим полученные данные.
print "<pre>";
print_r($header);
print 
"</pre>";
print 
$code."<br />\n";
print 
$body;
?>
! При создании экземпляра класса Cache_HTTP_Request доступны некоторые дополнительные настройки.

function Cache_HTTP_Request($url, $params, $container, $containerOptions, $expires, $mode);

Первый параметр - адрес страницы, копию которой вы желаете получить. Это единственный обязательный параметр. Второй параметр, ассоциативный массив $params, имеет следующий формат:

  • 'method' - используемый метод (GET, POST и т.д.)
  • 'http' - Используемая версия протокола HTTP (1.0 или 1.1);
  • 'user' - Имя пользователя, используемое при базовой аутентификации
  • 'pass' - Пароль, используемый при базовой аутентификации
  • 'proxy_host' - Адрес прокси-сервера
  • 'proxy_port' - Порт прокси-сервера
  • 'proxy_user' - Имя пользователя, используемое при аутентификации на прокси-сервере
  • 'proxy_pass' - Пароль, используемый при аутентификации на проксе-сервере

Третий и четвертый параметры соответственно тип контейнера, в котором буду храниться полученные данные, и массив с настройками контейнера. Следующий параметр указывает на то, что делать, если удаленный сервер недоступен. Возможные варианты (по умолчанию используется первый из них):

  • CACHE_HTTP_REQUEST_KEEP_LOCAL_COPY - оставить локальную копию.
  • CACHE_HTTP_REQUEST_RETURN_FALSE - вернуть false
  • CACHE_HTTP_REQUEST_RETURN_PEAR_ERROR - сгенерировать ошибку PEAR

И наконец последний параметр задает время жизни кэша в секундах. Значение по умолчанию составляет 3600 секунд (один час). В случае, когда это значение равно 0, кэш хранится до тех пор, пока пользователь сам не удалит его.

Итог

PEAR Cache - это достаточно мощный пакет для работы с кэшем, содержащий большое количество разнообразных возможностей. Трудно представить задачу, для которой его функциональности было бы недостаточно. Однако, в некоторых случаях за все это многообразие приходится платить быстродействием. PEAR Cache - это швейцарский нож. Вряд ли стоит использовать его в повседневной жизни (для этого за глаза хватит PEAR Cache_Lite), но в чуть более нестандартной ситуации он может серьезно помочь.

Кэширование клиентом

Прежде всего, давайте рассмотрим, как мы можем указать клиенту на то, что кэшировать нашу страницу не нужно. Итак, самый простой способ сделать это - это воспользоваться мета-тегами:

<meta http-equiv="Expires" content="Mon, 13 Jan 1996 09:00:00 GMT" />
<meta http-equiv="Pragma" content="no-cache" />

Однако данный способ имеет два существенных недостатка. Во-первых, если данных мета-тегов не было на странице изначально, и они появились позже, браузер просто проигнорирует их и будет продолжать ее кэширование. Во-вторых, большинство прокси-серверов не обращают внимание на непосредственно содержимое страницы и ориентируются только на отдаваемые сервером заголовки. Таким образом, они будут кэшировать страницу вне зависимости от того, что указано в мета-тегах. Поэтому гораздо лучше проделать все это из PHP:

<?php 
header
('Expires: Mon, 13 Jan 1996 09:00:00 GMT'); 
header('Cache-Control: no-store, no-cache, must-revalidate'); 
header('Cache-Control: post-check=0, pre-check=0'FALSE); 
header('Pragma: no-cache'); 
?>

Однако простое отключение кэша - это не решение проблемы. Вместо этого гораздо эффективней указывать на необходимость обновления через относительно небольшие промежутки времени, что может снизить нагрузку на сервер при просмотре сайта пользователем:

<?php 

$exp_time 
20;

header('Expires: ' gmdate('D, d M Y H:i:s'time() + $exp_time) . 'GMT'); 

print 
'Через двадцать секунд эта страница перестанет существовать<br />'
print 
'Дата (GMT): ' gmdate('H:i:s') . '<br />'
print 
'<a href="' $_SERVER['PHP_SELF'] . '">Перезагрузка</a><br />'
?>

Запустите приведенный выше пример и понажимайте ссылку "Перезагрузка" (кнопка "Обновить" в браузере автоматически обнуляет кэш). Через двадцать секунд вы получите новую страницу. Продолжать эксперимент можно до бесконечности.

Ссылки для дальнейшего ознакомления

 
Copyright © 2004-2006 Построй свой сайт на PHP!
Перепечатка возможна только с сохранением авторства.
Выпуск #12: 2006-01-22

Subscribe.Ru
Поддержка подписчиков
Другие рассылки этой тематики
Другие рассылки этого автора
Подписан адрес:
Код этой рассылки: comp.soft.prog.phpdev
Архив рассылки
Отписаться Вебом Почтой
Вспомнить пароль

В избранное