Уменьшаем нагрузку на сервер - кэширование данных для ускорения генерации страницы
Представьте себе проект, в котором достаточно сложная структура базы данных. Да и собственно данных много. И для генерации страницы постоянно необходимо примерно одним и тем же образом вытягивать и обрабатывать массу информации. В моем случае это дело занимало до 25 секунд на весьма неслабой машине. Для оптимизации процесса было принято решение кэшировать данные. Само собой, это снимает только часть проблем. Но ведь кэш можно еще и генерировать автоматически, верно? :).
В общем, ниже я приведу небольшой класс, сделанный за несколько минут. Кэширует массив, в котором хранится основной dataset. По умолчанию считается, что данного REQUEST_URI dataset постоянен. Но есть параметры для изменения такого поведения.
-
class Cache {
-
var $cache_folder;
-
-
function Cache($cachedir='cache/') {
-
$this->cache_folder = $cachedir;
-
}
-
-
function GetCacheFileName($custom_filename=false) {
-
if ($custom_filename !== false) {
-
return $this->cache_folder.$custom_filename;
-
}
-
else {
-
}
-
} // GetCacheFileName
-
-
function IsCached($custom_filename=false) {
-
} // IsCached
-
-
function SaveToCache($data, $custom_filename=false) {
-
} // SaveToCache
-
-
function GetFromCache($custom_filename=false) {
-
if ($this->IsCached($custom_filename)) {
-
}
-
else {
-
return false;
-
}
-
} // GetFromCache
-
-
function ClearCache() {
-
if ($file != "." && $file != "..") {
-
}
-
}
-
}
-
} // ClearCache
-
-
} // class Cache
Затем где-то в коде можно написать примерно следующее:
-
$the_data = GetFromCache();
-
if ($the_data === false) {
-
// ...
-
// что-то делаем и заполняем переменную $the_data
-
// ...
-
SaveToCache($the_data);
-
}
P.S. Я знаю, что можно кэшировать уже сгенерированный HTML. Но это хуже. Так как менее гибко.
P.P.S. Я знаю, что этот класс очень несовершенен. Но он простой, быстрый и потребовал на свое создание несколько минут. И пользоваться удобно :)


July 2nd, 2008 at 09:30 Quote
А если разные датасеты имеют разный срок актуальности, то такой кеш рождает промблемы, я его дополнял тем, что в имя каждого скешенного файла добавлял его время валидности в секундах, и потом при чтении или очистки, пользовался этими данными.
July 2nd, 2008 at 09:34 Quote
d1pr3d @ 02.07.2008, 09:30 #
угу. можно тогда добавить еще сборщик мусора. и иногда его запускать.