На страницах этого блога уже было описано применение технологии memcache для кеширования веб страниц целиком. действительно, это очень удобная технология позволяет делать это очень быстро и надежно, при этом нет необходимости держать огромную папку закешированного содержимого. Все лежит в оперативной памяти.
Конечно, если памяти доступной для этого расширения не достаточно, то тут ничего не сделаешь. Но для выделенных сервером, как было в моем случае, это не проблема.
В этой статье я расскажу, как закешировать sql запросы к базе данных.
В любой нормальной системе, будь то CMS или фреймворк, есть срипт, который отвечает за запросы к базе данных. Мало кто из программистов в наше время пишет
mysql_query( 'select * from tablename' ) |
всегда есть некая прослойка. Если ее нет, то ее не сложно написать. В этой статье я буду ускорять CMS Joomla и при этом буду использовать свою прослойку uno, которая в свою очередь является прослойкой над Joomla прослойкой над PDO интерфейсом. Вот такие хитросплетения.
В uno есть несколько методов для выборки данных: getRows,getRows,count, getRowsBySQL,exists,getRowsBySQL
Вот их и нужно кешировать. Для этого в каждый метод, необходимо добавить параметр: $usecache = false. Далее, напишу, как это работает на примере только getRow. Предполагается, что у вас уже есть класс для работы с memcahe
static public function getRow( $table , $conditions =false, $colums = array ( '*' ), $order = false, $offset = 0, $usecache = false){ $key = md5(serialize( array ( $table , $conditions , $colums , $order , $offset ))); if ( $usecache and $result = mem::gi()->get( $key )) return $result ; $result = self::query( $table , $conditions , $colums , $order ,1, $offset )->loadAssoc(); if ( $usecache !==false ){ mem::gi()->set( $key , $result , $usecache ); } return $result ; } |
При использовании метода, в параметр $usecache, нужно подать количество секунд для хранения данных в memcache, по истечении которых, кеш нужно будет обновить.
В статичных сайтах, этим значением может быть очень больше число. Если сайт создан исключительно для продажи контекстной рекламы Google (Гугл), и представляет собой множество интересных постов, то там можно кешировать и при помощи файлов.
Но для динамичных порталов, в которых такое кеширование и имеет смысл делать, нужно предусмотреть обновление кеша.
К примеру, пользователь зарегистрировался. После этого, список ранее закешированных пользователей нужно обновить. Для этого в $usememcache нужно подать 0. Тогда кеш затрется.
Комментарии
По этому и не нужно.