This Might Be Useful

Уменьшаем нагрузку на сервер - кэширование данных для ускорения генерации страницы

Представьте себе проект, в котором достаточно сложная структура базы данных. Да и собственно данных много. И для генерации страницы постоянно необходимо примерно одним и тем же образом вытягивать и обрабатывать массу информации. В моем случае это дело занимало до 25 секунд на весьма неслабой машине. Для оптимизации процесса было принято решение кэшировать данные. Само собой, это снимает только часть проблем. Но ведь кэш можно еще и генерировать автоматически, верно? :).
В общем, ниже я приведу небольшой класс, сделанный за несколько минут. Кэширует массив, в котором хранится основной dataset. По умолчанию считается, что данного REQUEST_URI dataset постоянен. Но есть параметры для изменения такого поведения.

PHP:
  1. class Cache {
  2. var $cache_folder;
  3.  
  4. function Cache($cachedir='cache/') {
  5.   $this->cache_folder = $cachedir;
  6. }
  7.  
  8. function GetCacheFileName($custom_filename=false) {
  9.   if ($custom_filename !== false) {
  10.     return $this->cache_folder.$custom_filename;
  11.   }
  12.   else {
  13.     return $this->cache_folder.md5($_SERVER['REQUEST_URI']);
  14.   }
  15. } // GetCacheFileName
  16.  
  17. function IsCached($custom_filename=false) {
  18.   return file_exists($this->GetCacheFileName($custom_filename));
  19. } // IsCached
  20.  
  21. function SaveToCache($data, $custom_filename=false) {
  22.   $h = fopen($this->GetCacheFileName($custom_filename), 'w');
  23.   fwrite($h, serialize($data));
  24.   fclose($h);
  25. } // SaveToCache
  26.  
  27. function GetFromCache($custom_filename=false) {
  28.   if ($this->IsCached($custom_filename)) {
  29.     $h = fopen($this->GetCacheFileName($custom_filename), 'r');
  30.     $info = fread($h, filesize($this->GetCacheFileName($custom_filename)));
  31.     fclose($h);
  32.     return unserialize($info);
  33.   }
  34.   else {
  35.     return false;
  36.   }
  37. } // GetFromCache
  38.  
  39. function ClearCache() {
  40.   if ($handle = opendir($this->cache_folder)) {
  41.     while (false !== ($file = readdir($handle))) {
  42.       if ($file != "." && $file != "..") {
  43.         unlink($this->cache_folder.$file);
  44.       }
  45.     }
  46.     closedir($handle);
  47.   }
  48. } // ClearCache
  49.  
  50. } // class Cache

Затем где-то в коде можно написать примерно следующее:

PHP:
  1. $the_data = GetFromCache();
  2. if ($the_data === false) {
  3.   // ...
  4.   // что-то делаем и заполняем переменную $the_data
  5.   // ...
  6.   SaveToCache($the_data);
  7. }

P.S. Я знаю, что можно кэшировать уже сгенерированный HTML. Но это хуже. Так как менее гибко.
P.P.S. Я знаю, что этот класс очень несовершенен. Но он простой, быстрый и потребовал на свое создание несколько минут. И пользоваться удобно :)

· Page break в HTML-документе
· Создание постраничной навигации: два варианта
· Основы масштабирования (web-проектов)
· Отдаем pdf-файл браузеру. Да так, чтобы MSIE его тоже принимал.
· Создание PDF-файлов с помощью PHP и FPDF

- Коментировать
- Trackback

2 Responses to “Уменьшаем нагрузку на сервер - кэширование данных для ускорения генерации страницы”


  1. d1pr3d Says:

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

  2. Filosoff Says:

    d1pr3d @ 02.07.2008, 09:30 #

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

    угу. можно тогда добавить еще сборщик мусора. и иногда его запускать.

Leave a Reply