Полезное для программистов:

Фриланс
Новости
Статьи
   
Рубрики:


Псевдо-кэширование на сервере

Поиск:
Всем веб-разработчикам знакомо понятие пользовательского кэша – возможность пользователей сохранять у себя веб-страницы и не грузить их с сервера при каждом обращении. Да, это было актуально лет 7-8 назад, когда интернет в большинстве своем использовал статичный вид хранения информации, тобишь html'ки.

Сегодня, когда, практически везде используется динамическое создание контента с помощью серверных языков программирования, разработчики стараются сделать так, чтобы с максимальной вероятностью не писать ничего в пользовательский кэш.

Как правило в PHP для этого достаточно пользователю послать следующую группу заголовков:

Код
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . 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");


Да, таким образом, практически полностью блокируется запись в пользовательский кэш. Но, в итоге мы получаем более существенную нагрузку на сервер, что не есть хорошо.

Предположим, у нас есть большой новостной сайт. Очевидно, что новость – статичная информация, которая по сути своей изменяется 3-4 раза, при этом давай-те зададимся вопросом, сколько раз эта новость будет запрошена пользователем, т.е. сколько раз будет запускаться скрипт, обращающийся к Базе Данных, выводящий новость и т.п. Все это – очевидно – лишняя нагрузка на сервер. Как этого избежать?

В принципе, есть два варианта.

Первый заключается в координально ином функциональном строении движка. Мы должны будет делать сайт полностью на html файлах, генерируя их при добавлении или редактировании новости. Минус этого подхода, что он сильно ограничит возможности нашего движка и сайта в целом. Нам уже не будет так легко сменить дизайн или в «шапке» вставить новый логотип. Т.е. система получается не универсальной.

Второй вариант заключается в организации псевдо кэша на сервере. Итак, пусть у нас используется mod_rewrite и REQUEST_URI конечной новости имеет вид: /2005/12/12/news.html. Понятно, что все это не физический путь, а лишь параметр скрипту.

Грубо говоря подход заключается в следующем: пользователь обращается к какой-то информации на сайте, если она есть в статическом виде, т.е. есть определенный файл в папке cache, то скрипт просто «отдает» этот файл пользователю не выполняя каждый ра обращений к БД и прочих операций. При этом, важно отметить, что, при любом изменении информации в административной панеле мы должны будем удалить этот файл.

Теперь, создадим папку /cache в корне веб-сайта, и запретим доступ к ее содержимому при обращении из браузера, при этом должен быть доступ для php скриптов на нашем сервере.

Затем, нам надо реализовать в административной панеле следующее.. При любом изменении контента конечной новости мы в любом случае знаем ее REQUEST_URI. Так вот, пр изменении из этой папки мы будем удалять следующий файл (делая, естественно проверку на его существование). Идеальный вариант имя кэш файла – REQUEST_URI с замененным символом «/» на «_» и расширением .cache. Если, вы не используете mod_rewrite, а работаете с параметрами QUERY_STRING, то в таком случае, надо будет заменять в именах файлов «&» на «_».

Вернемся к пользовательской части нашего движка.
Код
if( file_exists( «.......» ) )
{
readfile( «........» )
exit;
}

ob_start();

// Тут идет работа скрипта. Т.е., если файла нет,
// то пользователю будет сгенерирована страница с информацией.

Print $content;

$str = ob_get_contents(); // получаем в переменную то, что сгенерировал скрипт.

/* Создаем кэш файл */
$f = fopen( «.......» , «w» );
fwrite( $f , $str );
fclose( $f );

ob_end_flush();


Вот, в принципе и все. Но тут я бы хотел заострить внимание читателей на двух вопросах.
Первый. Как правило, новость хоть и статична, но представлена в динамической странице, т.е., к примеру, у нас есть какая-ть правая колонка, где регулярно что-то обновляется. Само собой полностью использовать вышеуказанный способ мы не можем, т.к. он кэшит полностью ВСЮ страницу. Что же делать? Тут надо несколько усложнять, и делать кэш частичный, т.е. все что было описано выше надо проделать только над той частью, которая генерирует основной контент. Пусть у нас есть модуль, которым мы в скрипте генерируем содержимое области контента. Вот это мы и будем сохранять в кеше, оставляя остальные области на совести генератора страницы.

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

Момент второй. Есть определенные части сайты, которые всегда являются динамическими. К примеру страница с рэйтингом каким-ть. Понятно, что кэшить ее нет смысле. Отсюда вывод, что имеет смысл сделать для каждого используемого модуля параметр: «Использовать кэш или нет». Если надо использовать, то испольльзуем, если нет, то полностью генерируем страницы данного модуля скриптом.
Автор: Mal Hack
Сайт: http://mal-hack.net






Просмотров: 3640

 

 

Новые статьи:


Популярные:
  1. Как сделать цикличным проигрывание MIDI-файла?
  2. Создание AVI файла из рисунков
  3. Как устройство "отключить в данной конфигурации"?
  4. Kто в данный момент присоединен через Сеть?
  5. Как узнать количество доступной памяти?
  6. Как реализовать в RichEdit разноцветный текст?
  7. Как скрыть свое приложение от ProcessViewer
  8. Как программно нажать/скрыть/показ кнопку "Start"?
  9. Модуль работы с ресурсами в PE файлах
10. Функции вызова диалоговых окон выбора
11. Проверка граматики средствами Word'а из Delphi.
12. Модуль для упрощенного вызова сообщений
13. Функции для записи и чтение своих данных в, ЕХЕ- файле
14. Рекурсивный просмотр директорий
15. Network Traffic Monitor
16. Разные модули
17. Универсальная функция для обращения к любым экспортируем функциям DLL
18. Библиотека от VladS
19. Протектор для UPX'а
20. Еще об ICQ, сообщения по контакт листу?
21. Использование открытых интерфейсов
22. Теория и практика использования RTTI
23. Работа с TApplication
24. Примеры использования Drag and Drop для различных визуальных компонентов
25. Что такое порт? Правила для работы с портами
26. Симфония на клавиатуре
27. Загрузка DLL
28. Исправление автоинкремента
29. Взаимодействие с чужими окнами
30. Проверить дубляжи в столбце


 

 

 
 
На главную