Кеширование в PHP. Memcache

Сегодня я расскажу о кешировании при помощи MemCache в PHP. Для начала узнаем что такое MemCache (надеюсь вы знаете что такое PHP, иначе эта статья не для Вас).

Memcached (читается мемкэ́шт) — алгоритм кэширования различных объектов в оперативной памяти. Позволяет, используя специальное API (для Perl, PHP, Python, Java и др.), сохранить в ОЗУ блок данных, сопоставленный с определённым символьным ключом.

Сервер memcached был разработан для сайта LiveJournal, имеющего более миллиона посетителей в сутки. Его применение снизило загрузку серверов баз данных в разы.

В API memcached есть только базовые функции: выбор сервера, установка и разрыв соединения, добавление, удаление, обновление и получение объекта. Для каждого объекта устанавливается время жизни, от 1 секунды до бесконечности. При переполнении памяти более старые объекты автоматически удаляются. Для PHP также есть уже готовые библиотеки PECL для работы с memcached, которые дают дополнительную функциональность.

Установка memcache под Windows

  1. Скачиваем сервер memcached (memcached-1.2.1-win32.zip)
  2. Распаковываем полученный архив на диск, например, в c:\memcache\
  3. Далее запускаем из командной строки: c:\memcache\memcached.exe -d install, тем самым устанавливая memcached как сервис.
  4. Теперь, осталось только запустить этот сервис: c:\memcache\memcached.exe -d start
  5. Все, memcache установнен на вашей машине и уже работает. Список всех доступных команд получаем так: c:\memcache\memcached.exe -h

Установка модуля для PHP (опять же под Windows)

Здесь тоже все предельно просто.

  1. Скачиваем расширение для установленной у вас версии PHP
  2. Копируем полученный файл php_memcache.dll в директорию расширений для PHP. Например, у меня это C:\server\usr\local\php5\ext\
  3. Добавляем в файл php.ini строку extension = php_memcache.dll, в раздел Dynamic Extensions.
  4. Перезапускаем сервер. Все, memcache установлен! Данный факт можно проверить при помощи функции phpinfo();

Установка под Linux

А линуксоиды и сами справятся с установкой. Один совет, устанавливайте из репозитария – меньше гемороя будет. :)

Например, для Debian(Ubuntu):

  1. apt-get install memcached libmemcache0 php5-memcache

и будет вам счастье.

Создание класса

Подготовительный этап окончен, теперь приступаем к программированию. Напишем мы класс для работы с memcached. Вот сам код:

  1. <?php
  2.  
  3. class CACHE_MemCache {
  4. private $memcache;
  5. private $timeLife;
  6. private $compress;
  7.  
  8. /**
  9. *
  10. * @param string $host – хост сервера memcached
  11. * @param int $port – порт сервера memcached
  12. * @param int $compress – [0,1], сжимать или нет данные перед
  13. * помещением в память
  14. */
  15. public function __construct($host, $port = 11211, $compress = 0)
  16. {
  17. $this->memcache = new Memcache;
  18. $this->memcache->connect($host, $port);
  19. $this->compress = ($compress) ? MEMCACHE_COMPRESSED : 0;
  20. }
  21.  
  22. public function load($valueID, $timeLife)
  23. {
  24. $this->timeLife = $timeLife;
  25. return $this->memcache->get($valueID);
  26. }
  27.  
  28. public function save($valueID, $value)
  29. {
  30. return $this->memcache->set($valueID, $value, $this->compress, $this->timeLife);
  31. }
  32.  
  33. public function delete($valueID)
  34. {
  35. $this->memcache->delete($valueID);
  36. }
  37.  
  38. public function __destruct()
  39. {
  40. $this->memcache->close();
  41. }
  42. }
  43.  
  44. ?>

Честно говоря обьяснять то и нечего, но чуток поясню.

  1. public function __construct($host, $port = 11211, $compress = 0)

Создает обьект по хосту, порту ($host, $port) а так же указывает нужно нам сжатие или нет.

  1. public function load($valueID, $timeLife)

Пробует загрузить данные по ключу $valueID с интервалом жизни $timeLife (в секундах). Если не получится – вернет false.

  1. public function save($valueID, $value)

Сохранение данных $value по ключу $valueID

  1. public function delete($valueID)

Удаление данных по ключу $valueID

  1. public function __destruct()

Деструктор обьекта, закрывает подключение к memcached серверу.

Использование класса

Все. Теперь на уже настроенной машине пишем можем тестировать наш класс

  1. $cache = new CACHE_MemCache(’127.0.0.1′, 11211);
  2.  
  3. if ($data = $cache->load(‘key_data’, 60*60)){
  4. return $data;
  5. } else {
  6. //тут мы берем данные или из бази (или от куда нам надо)
  7. // $data пришла
  8. //сохраняем в мемкеш, поскольку он оказался уже чист
  9. $cache->save(‘key_data’, $data);
  10. return $data;
  11. }

Вот и все. Если данные по ключу key_data сохранились (хранятся час в нашем случае), то мы просто возращаем их, иначе – обращаемся к базе данных (или файлу, где они хранятся), записываем данные по ключу в memcache и возращаем данные.

Удачи в программировании!!!

29. сентября 2008 by Alexey Vasiliev
Categories: memcache, PHP | Tags: , | 2 комментария

Comments (2)

  1. Аффтар, пеши исчо!
    (так тебя там спамят? =)) )

    по теме:
    мемкеш рулит))
    ты б тогда уже примеры написал не только для пхп )))

  2. Знакомся – http://akismet.com/. Надеюсь поможет.