Купи доменное имя для своего блога, персональной web-странички или нового интернет проекта по выгодным ценам. Зарегистрировать домен в зоне .RU за 195 руб.

Промежуточное кэширование данных в PHP. Часть 1. Memcache

Перед нами стоит задача - уменьшить нагрузку нашего web-проекта. Одним из самых малозатратных способов является использование memcache для хранения повторных частей ваших страниц.

Разберём классический случай. На каждой странице нашего сайта есть много однотипных блоков - облако тегов, последние новости, рекомендуемые материалы, последние комментарии, последнее обновление в каталоге товаров. Эти блоки по существу динамические но не совсем. Например каталог товаров меняется очень редко, например раз в день или раз в месяц. Последние новости скажем раз в пару часов. В любом случае при вызове каждой такой страницы нам требуется сделать порой по 10-20 запросов к базе.

Но ничто по сути не измениться если мы будем делать выборку последних товаров, формировать часть html кода и складывать это в кеш, скажем на 30 минут, а по истечении этого срока - повторить операцию. На протежении этих 30 минут мы будем показывать состояние нашего кеша. В случае с “последними коментариями” - можем кешировать скажем на пол минуты. Как ни крути, но это эффективно, если за эти пол минуты мы не раз воспользуемся нашим кешем вместо того, чтобы делать множественные запросы к базе, собирая на PHP части HTML, подставляя переменные в строки,выполняя циклы и итд.

Остаётся только один вопрос, где хранить наш кеш, другими словами какую технологию использовать для кеширования. Есть нескольок вариантов, всё они имеют свои плюсы и минусы, вот некоторые из них:

  • Плоские файлы на NFS
  • Механизмы APC
  • Простые БД, как например sqlite или же даже хранить в основной базе, но в качестве агрегата
  • Memcache

Memcached

Это очень удобное и масштабируемое решением. Memcached - это демон, запускаемый на сервере приложений. Он позволяет хранить в себе текстовые данные на определённый срок. Доступ к данным осуществляется по строковым идентификаторам и работает всё очень быстро, так-как memcached хранит данные исключительно в оперативной памяти.

Установим необходимое ПО. Нам нужен непосредственно сам memcache-сервер ака memcached и PECL-модуль для PHP.

Пример установки я привожу в Gentoo Linux (в других системах процесс установки отличается, но суть остаётся прежней)

emerge -av net-misc/memcached dev-php5/pecl-memcache

Если есть желание, можно поднастроить memcache, указав ему предел памяти и TCP-порт, который должен прослушивать демон.

Пробуем поюзать

Соединяемся

$memcache = new Memcache();
$memcache->pconnect('127.0.0.1', 11211);

Сохраняем значение на 60 секунд

$name = 'mysite_myvalue';
$value = 'Hello, World!';
$expire = 60;
$memcache->set($name, $value, 0, $expire);

Стоит заметить, что memcache доступен всем, кому он не запрещён. Поэтому если вы используете один memcache-сервер для нескольких проектов, то при указании имени name желательно указывать какой нибудь префикс, а то рискуете перетереть данные другого сайта.

После того как мы записали данные в кеш, пробуем их получить

$memcache->get($name);

В случае если мы обращаемся за данными, которые уже были удалены по истечении времени мы получим false. Так же стоит заметить, что если memcached будет остановлен и запущен заново,то все данные он потеряет. Поэтому стоит придерживаться следующей логики

$name = 'webnext.posts.last';
$v = $memcache->get($name);
if ($v === false)
{
        echo $s = getLastPosts($rs);
        $memcache->set($name, $s, 0, 60);
}
else
{
        echo $v;
}

Думаю базис я вам рассказал, в memcache есть ещё и другой функионал, который вы можете найти в офицальной документации.

Регистрация доменов RU за 195р!!!
Совместно с регистратором onreg.ru мы проводим акцию! Купи домен для своего блога или нового интернет проекта по выгодным ценам. Так домен в зоне RU стоит всего 195 рублей. При покупке нескольких доменов, возможны скидки. На onreg.ru есть система тикетов, через которую мы всегда готовы ответить на все ваши вопросы и предложения.


Комментарии
  • sms-send — 29.09.2007 #1
    спасибо, оч хорошо для вводной статьи =)
  • Vir — 12.02.2008 #2
    Отлично! Все объяснено очень просто, и очень доходчиво. Однозначно буду использовать. Спасибо.
  • Antalika — 30.08.2008 #3


    Cпасибо за статью! все никак руки не доходили на мемкэша, теперь обязательно попробую

  • Вячеслав — 03.01.2009 #4

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

  • Вадим — 29.01.2010 #5

    Пример жизненный, полезный, но код я бы подоптимизировал так скажем:

    $name = ‘webnext.posts.last’;

    $v = $memcache→get($name);

    if ($v === false)

    {

          $v = getLastPosts($rs);
          $memcache->set($name, $v, 0, 60);

    }

    echo $v;

    Минус пару строк. и минус одна переменная =) ну да я такой…

  • dsagreh — 11.06.2010 #6

    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».

Оставить комментарий
Ваше имя:
E-mail:
Сайт (блог):
Сообщение:
Если вы не робот, введите код: