Перед нами стоит задача - уменьшить нагрузку нашего web-проекта. Одним из самых малозатратных способов является использование memcache для хранения повторных частей ваших страниц.
Разберём классический случай. На каждой странице нашего сайта есть много однотипных блоков - облако тегов, последние новости, рекомендуемые материалы, последние комментарии, последнее обновление в каталоге товаров. Эти блоки по существу динамические но не совсем. Например каталог товаров меняется очень редко, например раз в день или раз в месяц. Последние новости скажем раз в пару часов. В любом случае при вызове каждой такой страницы нам требуется сделать порой по 10-20 запросов к базе.
Но ничто по сути не измениться если мы будем делать выборку последних товаров, формировать часть html кода и складывать это в кеш, скажем на 30 минут, а по истечении этого срока - повторить операцию. На протежении этих 30 минут мы будем показывать состояние нашего кеша. В случае с “последними коментариями” - можем кешировать скажем на пол минуты. Как ни крути, но это эффективно, если за эти пол минуты мы не раз воспользуемся нашим кешем вместо того, чтобы делать множественные запросы к базе, собирая на PHP части HTML, подставляя переменные в строки,выполняя циклы и итд.
Остаётся только один вопрос, где хранить наш кеш, другими словами какую технологию использовать для кеширования. Есть нескольок вариантов, всё они имеют свои плюсы и минусы, вот некоторые из них:
Установим необходимое ПО. Нам нужен непосредственно сам memcache-сервер ака memcached и PECL-модуль для PHP.
Пример установки я привожу в Gentoo Linux (в других системах процесс установки отличается, но суть остаётся прежней)
emerge -av net-misc/memcached dev-php5/pecl-memcache
Если есть желание, можно поднастроить memcache, указав ему предел памяти и TCP-порт, который должен прослушивать демон.
Соединяемся
Сохраняем значение на 60 секунд
Стоит заметить, что memcache доступен всем, кому он не запрещён. Поэтому если вы используете один memcache-сервер для нескольких проектов, то при указании имени name желательно указывать какой нибудь префикс, а то рискуете перетереть данные другого сайта.
После того как мы записали данные в кеш, пробуем их получить
В случае если мы обращаемся за данными, которые уже были удалены по истечении времени мы получим false. Так же стоит заметить, что если memcached будет остановлен и запущен заново,то все данные он потеряет. Поэтому стоит придерживаться следующей логики
Думаю базис я вам рассказал, в memcache есть ещё и другой функионал, который вы можете найти в офицальной документации.
Регистрация доменов RU за 195р!!!
Cпасибо за статью! все никак руки не доходили на мемкэша, теперь обязательно попробую
Отличный пример для начинающих. Сейчас как раз ищу мощную систему кэширования.
Жду статью о сравнении производительности и потребления ресурсов других систем кэширования.
Пример жизненный, полезный, но код я бы подоптимизировал так скажем:
$name = ‘webnext.posts.last’;
$v = $memcache→get($name);
if ($v === false)
{
$v = getLastPosts($rs);
$memcache->set($name, $v, 0, 60);
}
echo $v;
Минус пару строк. и минус одна переменная =) ну да я такой…
You start getting talent points at level 10. These points make you have greater [url=http://www.baycoo.com]wow powerleveling[/url]. Don’t be afraid to use your talent points. While it does cost money to change them later, you can change them and it’s does not cost a lot to change them once or twice. Generally, it’s better to concentrate on one «tree» of talents. Pick the tree that seems most like your «Style».