memcached и memcache

Thank you for reading this post, don't forget to subscribe!

Memcached — свя­зу­ю­щее про­грамм­ное обес­пе­че­ние, реа­ли­зу­ю­щее сер­вис кеши­ро­ва­ния дан­ных в опе­ра­тив­ной памя­ти на осно­ве пара­диг­мы хеш-таблицы

Это про­грамм­ное обес­пе­че­ние, пред­на­зна­чен­ное для кеши­ро­ва­ния дан­ных в опе­ра­тив­ной памя­ти. В про­ек­ции веб-раз­ра­бот­ки это может помочь так: без кеши­ро­ва­ния один и тот же код будет гене­ри­ро­вать­ся на сер­ве­ре зано­во для каж­до­го посе­ти­те­ля сай­та. На гене­ра­цию ухо­дят ресур­сы хостин­га. Если посе­ти­те­лей ста­но­вит­ся мно­го, это замет­ным обра­зом ска­зы­ва­ет­ся на про­из­во­ди­тель­но­сти системы.
С помо­щью Memcached воз­мож­но один раз сге­не­ри­ро­вать код сай­та и хра­нить его резуль­тат в опе­ра­тив­ной памя­ти, и когда оче­ред­ной посе­ти­тель обра­тит­ся к сай­ту, то хостинг, вме­сто того, что­бы гене­ри­ро­вать всё зано­во, отдаст копию (кеш), хра­ня­щу­ю­ся в опе­ра­тив­ной памя­ти. Логич­но, что чем боль­ше нагруз­ка на сайт, тем боль­ше поль­зы от Memcached.

Если у вас не высо­ко­на­гру­жен­ный про­ект, то сто­ит поду­мать над тем, сто­ит ли исполь­зо­вать Memcached, ведь на под­клю­че­ние к нему ухо­дит допол­ни­тель­ное вре­мя. Поду­май­те, будет ли это оправданно.
Ещё Memcached плох тем, как бы это ни зву­ча­ло стран­но, что он отъ­еда­ет опе­ра­тив­ную память. Допу­стим, если вы отве­ли 200Mb под него, то счи­тай­те, что 200Mb уже нет на вашем хостин­ге. Так что, на это тоже сто­ит обра­тить внимание.
Под Memcached чаще пони­ма­ют сер­вер, когда как memcache — это рас­ши­ре­ние PHP. Хотя, есть и memcached — рас­ши­ре­ние PHP.

Когда не стоит использовать Memcached

Кеши­ро­ва­ние сни­жа­ет гиб­кость при­ло­же­ний, поэто­му на началь­ных эта­пах раз­ви­тия про­ек­та не нуж­но уде­лять это­му слиш­ком мно­го вни­ма­ния. Не забы­вай­те о пра­виль­ном под­хо­де, а имен­но, про исполь­зо­ва­ние функ­ций и клас­сов при рабо­те с дан­ны­ми, созда­ние обёр­ток при рабо­те с внеш­ним API. Остав­ляй­те воз­мож­ность быст­ро­го внед­ре­ния memcached или ино­го кеши­ру­ю­ще­го мето­да в код.

Чем отличаются memcached и memcache

Под Memcached чаще пони­ма­ют кеши­ру­ю­щий сер­вер, когда как memcache — это рас­ши­ре­ние PHP, пред­на­зна­чен­ное для рабо­ты с этим сер­ве­ром. Хотя, есть и memcached — рас­ши­ре­ние PHP.
Что­бы не запу­тать­ся, рас­пи­шем подробнее

  • Кеши­ру­ю­щий сер­вер Memcached
  • Рас­ши­ре­ние Memcache
  • Рас­ши­ре­ние Memcached

Раз­ли­чия меж­ду эти­ми дву­мя рас­ши­ре­ния небольшие

  • Memcache стар­ше: его раз­ра­бот­ка нача­лась в 2004 году. Memcached раз­ра­ба­ты­ва­ет­ся с 2009
  • Memcache исполь­зу­ет­ся мно­го чаще, чем Memcached.
  • Memcache огра­ни­чен­ней Memcached и не исполь­зу­ет воз­мож­но­сти сер­ве­ра Memcached в пол­ную силу (соб­ствен­но, поэто­му и нача­лась раз­ра­бот­ка рас­ши­ре­ния Memcached).
  • Одна­ко, поэто­му Memcache лег­че и про­из­во­ди­тель­ней Memcached (судя по заяв­ле­ни­ям спе­ци­а­ли­стов, раз­ни­ца поряд­ка 10%)

Чем отличаются memcached и memcache

Под Memcached чаще пони­ма­ют кеши­ру­ю­щий сер­вер, когда как memcache — это рас­ши­ре­ние PHP, пред­на­зна­чен­ное для рабо­ты с этим сер­ве­ром. Хотя, есть и memcached — рас­ши­ре­ние PHP.
Что­бы не запу­тать­ся, рас­пи­шем подробнее

  • Кеши­ру­ю­щий сер­вер Memcached
  • Рас­ши­ре­ние Memcache
  • Рас­ши­ре­ние Memcached

Раз­ли­чия меж­ду эти­ми дву­мя рас­ши­ре­ния небольшие

  • Memcache стар­ше: его раз­ра­бот­ка нача­лась в 2004 году. Memcached раз­ра­ба­ты­ва­ет­ся с 2009
  • Memcache исполь­зу­ет­ся мно­го чаще, чем Memcached.
  • Memcache огра­ни­чен­ней Memcached и не исполь­зу­ет воз­мож­но­сти сер­ве­ра Memcached в пол­ную силу (соб­ствен­но, поэто­му и нача­лась раз­ра­бот­ка рас­ши­ре­ния Memcached).
  • Одна­ко, поэто­му Memcache лег­че и про­из­во­ди­тель­ней Memcached (судя по заяв­ле­ни­ям спе­ци­а­ли­стов, раз­ни­ца поряд­ка 10%)

Что лучше использовать, Memcache или Memcached

Если функ­ци­о­на­ла Memcache хва­та­ет (а в боль­шин­стве слу­ча­ев так и быва­ет), то исполь­зуй­те Memcache, он быст­рее и лег­че. Если нуж­ны допол­ни­тель­ные воз­мож­но­сти, Memcached — ваш выбор.

Установка memcache в PHP

pecl install memcache

если pecl не уста­нов­лен то:

yum install php-pear php-devel zlib-devel
yum install pecl
после чего запускаем
pecl install memcache

После это­го про­пи­сы­ва­ем нуж­ный путь и рас­ши­ре­ние в php.ini
extension_dir = "/usr/lib/php/modules/memcache.so"
extension = memcache.so

после пере­за­пус­ка­ем apache
/etc/init.d/httpd restart

Установка memcacheD сервера

yum install memcached

Открой­те файл /etc/sysconfig/memcached:

nano /etc/sysconfig/memcached

Най­ди­те пара­метр  OPTIONS="" и впи­ши­те в кавыч­ки -l 127.0.0.1. В ито­ге у вас долж­но получиться:

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="64"

OPTIONS="-l 127.0.0.1"

MAXCONN="2048" Мак­си­маль­ное коли­че­ство подключений
CACHESIZE="4096" Коли­че­ство фак­ти­че­ской ОЗУ на сервере

Добав­ля­ем memcached в автозагрузку
chkconfig memcached on

Запус­ка­ем memcached и пере­за­пус­ку­ем apache
service memcached start
service httpd restart

Про­ве­ря­ем рабо­то­спо­соб­ность служ­бы (оши­бок быть не должно)
php -i |grep memcache
/etc/php.d/memcache.ini,
memcache
memcache support => enabled
memcache.allow_failover => 1 => 1
memcache.chunk_size => 8192 => 8192
memcache.default_port => 11211 => 11211
memcache.default_timeout_ms => 1000 => 1000
memcache.hash_function => crc32 => crc32
memcache.hash_strategy => standard => standard
memcache.max_failover_attempts => 20 => 20
Registered save handlers => files user memcache

 

Если у вас при выпол­не­нии коман­ды php -i |grep memcache выла­зят ошиб­ки , то здесь необ­хо­ди­мо пере­со­брать модуль рас­ши­ре­ния php-pecl-memcache, вручную:
1. Сна­ча­ла уда­лим php-pecl-memcache из системы
# yum remove php-pecl-memcache

2. Теперь при­сту­пим к уста­нов­ке модуля:

Ска­ча­ем модуль к себе в папочку
# wget http://pecl.php.net/get/memcache-2.2.5.tgz

Разар­хи­ви­ру­ем
# tar -xvf memcache-2.2.5.tgz
# cd memcache-2.2.5

Ском­пи­ли­ру­ем (долж­ны быть уста­нов­ле­ны биб­лио­те­ки gcc и gcc-c++)
# phpize && ./configure --enable-memcache && make && make install

Если не ком­пи­ли­ру­ет­ся и руга­ет­ся на отсут­ствие ZLIB, то доуста­но­ви­те его – yum install zlib-devel (либо yum install openssl-devel)

Доба­вим в php.ini, строч­ку extension = memcache.so, для акти­ва­ции модуля
# echo «extension = memcache.so» >> /etc/php.ini

 

Закрываем Memcached от доступа извне

Как вы види­те, memcached висит на 11211 пор­ту по умол­ча­нию. Так как в memcached нет встро­ен­ных меха­низ­мов аутен­ти­фи­ка­ции, то выхо­дит, что любой может под­со­еди­нить­ся извне и исполь­зо­вать его в сво­их целях. Что­бы избе­жать это­го, вы може­те либо закрыть порт 11211 с помо­щью фаер­во­ла, либо скон­фи­гу­ри­ро­вать memcached-сер­вер, что­бы он мог исполь­зо­вать­ся толь­ко с локаль­но­го хоста. Ниже опи­сан послед­ний способ.

  1. Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл 
    1
    nano /etc/sysconfig/memcached
  2. Добав­ля­ем строку 
    OPTIONS="-l 127.0.0.1"
  3. Пере­за­гру­жа­ем memcached 
    1
    service memcached restart

    или

    1
    /etc/init.d/memcached restart

И сно­ва проверяем

1
netstat -tap | grep memcached

В ито­ге мы долж­ны уви­деть подобное

1
tcp 0  0 localhost.localdo:11211 *:*  LISTEN     13092/memcached

Так­же, после всех изме­не­ний не забудь­те пере­за­пу­стить Apache

 

Увеличиваем объём рабочей памяти Memcached

По умол­ча­нию, в Memcached отве­де­но на исполь­зо­ва­ние 64 мега­бай­та опе­ра­тив­ной памя­ти. Я уве­ли­чу до 1024, вы исхо­ди­те из пара­мет­ров ваше­го сервера

  1. Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл 
    1
    nano /etc/sysconfig/memcached
  2. Нахо­дим значение 
    1
    CACHESIZE="64"
  3. Меня­ем его на 
    1
    CACHESIZE="128"
  4. Пере­за­пус­ка­ем memcached 
    1
    service memcached restart

 

Пере­хо­дим к уста­нов­ке биб­лио­те­ки php для рабо­ты с memcached. Для это­го выпол­ни­те команду:

yum install php-pecl-memcache

Пере­за­гру­зи­те сервер:

service httpd restart

Хранение сессий PHP в Memcached

Если одним сер­ве­ром или кла­сте­ром Memcached поль­зу­ют­ся несколь­ко раз­ных сай­тов, то они могут пере­хва­ты­вать сес­сии друг дру­га и полу­чать доступ к акка­ун­там их поль­зо­ва­те­лей, что пред­став­ля­ет собой потен­ци­аль­ную опасность

Мож­но уско­рить php, пере­не­ся хра­ни­ли­ще сес­сий из hdd в опе­ра­тив­ную память с помо­щью memcached

Вы долж­ны знать, какое рас­ши­ре­ние php вы исполь­зу­е­те, memcache или memcached. Меж­ду ними есть раз­ни­ца, а уточ­нить, что сто­ит у вас, мож­но с помо­щью phpinfo(), тут есть тон­кость в настрой­ках, будь­те внимательны

 

Способ для расширения memcache

Смот­рим где лежит memcache.ini
php -i | grep memcache | grep ini
/etc/php.d/40-memcache.ini

  1. Открыть /etc/php.d/40-memcache.ini
  2. Доба­вить
    1
    2
    session.save_handler = memcache
    session.save_path = "tcp://127.0.0.1:11211"
  3. Пере­за­гру­зить apache 
    1
    service httpd restart

Способ для расширения memcacheD

  1. Открыть  /etc/php.d/40-memcache.ini
  2. Доба­вить
    1
    2
    session.save_handler = memcached
    session.save_path = "127.0.0.1:11211"
  3. Пере­за­гру­зить apache 
    1
    service httpd restart

     

Проверка phpinfo

Теперь нуж­но про­ве­рить, что име­ем на выхо­де. Для это­го, откры­ва­ем стра­ни­цу с phpinfo() и ищем в коде session.save_path в столб­це с локаль­ны­ми зна­че­ни­я­ми. В зна­че­нии долж­но быть tcp://127.0.0.1:11211 или 127.0.0.1:11211. Если зна­че­ния не поме­ня­лись, смот­ри­те кон­фиг доме­на в Апа­че  и ищем
php_admin_value session.save_path

Кста­ти, так­же вы може­те вос­поль­зо­вать­ся дирек­ти­вой php_value, что­бы настра­и­вать не весь сер­вер гло­баль­но, а толь­ко кон­крет­ные сай­ты. Для это­го, вы може­те отре­дак­ти­ро­вать .htaccess в корне ваше­го сайта

1
2
php_value session.save_handler "memcache"
php_value session.save_path "tcp://127.0.0.1:11211"

 

Как проверить работу Memcached

Созда­дим в корне сай­та фай­лик memcachetest.php и запи­шем туда сле­ду­ю­щий код

<?php

if (!class_exists("Memcache")) exit("Memcached не установлен");
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or exit("Невозможно под­клю­чить­ся к сер­ве­ру Memcached");

$version = $memcache->getVersion();
echo "Server's version: ".$version."<br/>\n";

$tmp_object = new stdClass;
$tmp_object->str_attr = 'test';
$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_object, false, 10) or die ("Не полу­чи­лось оста­вить запись в Memcached");
echo "Запи­сы­ва­ем дан­ные в кеш Memcached (дан­ные будут хра­нить­ся 10 секунд)<br/>\n";

$get_result = $memcache->get('key');
echo "Дан­ные, запи­сан­ные в Memcached:<br/>\n";

var_dump($get_result);

?>

Теперь оста­лось про­ве­рить резуль­та­ты: http://example.com/memcachetest.php
Если всё сде­ла­ли пра­виль­но, уви­ди­те что-то вроде:

Server's version: 1.4.4
Запи­сы­ва­ем дан­ные в кеш Memcached (дан­ные будут хра­нить­ся 10 секунд)
Дан­ные, запи­сан­ные в Memcached:
object(stdClass)#3 (2) { ["str_attr"]=> string(4) "test" ["int_attr"]=> int(123) }

phpMemcachedAdmin — мониторинг, статистика и управление Memcached

phpMemcachedAdmin — это про­грамм­ное обес­пе­че­ние, предо­став­ля­ю­щее веб-интер­фейс для мони­то­рин­га и управ­ле­ния сер­ви­сом Memcached на Linux. Поз­во­ля­ет видеть в реаль­ном вре­ме­ни ста­ти­сти­ку для всех под­дер­жи­ва­е­мых сер­ве­ром опе­ра­ций: get, set, delete, increment, decrement, reclaimed, evictions, cas, а так­же сер­вер­ную ста­ти­сти­ку: сеть, пози­ции, рабо­чую вер­сию вку­пе с чар­та­ми и внут­рен­ней сер­вер­ной конфигурацией.

Установка и настройка phpMemcachedAdmin

Тут мож­но пой­ти несколь­ки­ми путя­ми: выде­лить отдель­ный домен или под­до­мен под рабо­ту это­го сер­ви­са. А мож­но сде­лать под­ди­рек­то­рию в рабо­чем сай­те и поста­вить пароль на неё или настро­ить огра­ни­че­ние по IP. Я опи­шу послед­ний спо­соб с уста­нов­кой паро­ля на пап­ку как более простой.

допу­стим, у нас есть сайт http://test.t

cd /var/www/user1/site/test.t

Созда­ём дирек­то­рию и пере­хо­дим в неё

1
mkdir phpMemcachedAdmin && cd phpMemcachedAdmin

Ска­чи­ва­ем послед­нюю вер­сию дистрибутива

wget https://www.dropbox.com/s/z9688ktr3vy8jii/phpMemcachedAdmin-1.2.2-r262.tar.gz?dl=0
или отсюда:
phpMemcachedAdmin-1.2.2-r262.tar

Рас­па­ко­вы­ва­ем:
tar -xvzf phpMemcachedAdmin-1.2.2-r262.tar.gz

Рекур­сив­но выстав­ля­ем нуж­ные пра­ва досту­па в теку­щей директории

1
2
find ./ -type f -exec chmod 0644 {} \;
find ./ -type d -exec chmod 0755 {} \;

Созда­ём .htaccess для авто­ри­за­ции по паро­лю (в стро­ку 4 вно­си­те свой логин)

1
2
3
4
AuthType Basic
AuthName "Private Area"
AuthUserFile .htpasswd
Require user memcachedmanager

Созда­ём .htpasswd

1
htpasswd -c .htpasswd memcachedmanager

Вво­ди­те свой пароль.

На этом всё. Логин на ката­лог memcachedmanager, если вы не меня­ли его. Откры­ва­е­те http://test.t/phpMemcachedAdmin (домен меня­е­те на свой), вво­ди­те логин/пароль и пользуетесь