До сих пор я использовал кеш memcached. Однако в виду больших возможностей с Redis и лучшей экосистемы и на волне его популярности я решил перейти на него.
В интернете крайне мало материалов по настройке кеша для ZF2 и Doctrine 2. Если и есть материалы, то они не полные или не корректные. Поэтмоу я решил собрать свой опыт в этой статье.
Метка: memcached
Нюансы с настройкой memcached для php (debian).
Этот пост относится скорее к серверной части, чем к коду. Однако и к коду тоже. Сервер debian с php 5.4.
Настройка memcached в debian для php на нескольких серверах
Понадобилась настройка memcached (memcache) на 2 сервера. Задача оказалась не такой тривиальной. С доступом на localhost, где демон слушает по умолчанию, проблем не было. Однако на удаленный сервер достучаться не получалось. Сервера оба debian.
Возможно этот пост актуален только для меня и проблем может не возникать.
Домашняя страница проекта на code.google.
Для начала установка. Тут все просто:
1 2 3 4 5 6 7 8 |
Step 1. $ sudo apt-get install memcached Step 2. $ sudo apt-get install php5-memcached Step 3. $ sudo /etc/init.d/apache2 restart |
Взято с мануала по memcached на php.net. Хотя при установке туда не заглядывал.
После установки можно проверить слушается ли теперь порт 11211.
1 2 3 4 |
# netstat -tap | grep memcached tcp 0 0 localhost:11211 *:* LISTEN 13036/memcached |
Так же можно проверить настройки конфига.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#/etc/memcached.conf #Memcached будет работать, как демон -d #Лог будет складывать туда logfile /var/log/memcached.log #Отведём 256 мегабайт ОЗУ под хранилище -m 256 #Слушать будет этот порт -p 11211 #от какого пользователя запускать. тут не root для безопасности -u nobody #Слушаем localhost -l 127.0.0.1 |
После изменений конфига делаем:
1 2 3 |
/etc/init.d/memcached restart |
Примеры выше взяты с Хабра.
В коде php используется очень просто. В данном случае у меня создается класс CACHE с singlton, приведен кусок.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
class Cache { static private $instance = null; public $memcache; // по умолчанию время жизни кэша - сутки private $timelimit = 86400; // $config - набор параметров public function __construct($config = array()) { // если в конфиге указано время жизни кэша - берем его if ($config['timelimit']) $this->timelimit = $config['timelimit']; $this->memcache = new Memcached(); $this->memcache->addServer('localhost', 11211); $this->memcache->addServer('*.*.*.*', 11211); } public static function instance($config = array()) { if (self::$instance == null) self::$instance = new Cache($config); return self::$instance; } .................. //Потом можно $this->memcache->set("foo", "Hello!"); $this->memcache->set("bar", "Memcached..."); $arr = array( $this->memcache->get("foo"), $this->memcache->get("bar") ); |
И тут то и выяснилось, что на второй сервер обращения не доходят. Элементарная подмена в конфиге адреса прослушивания ничего не дала (-l *.*.*.*).
Диагностику помогут провести следующие ф-ии:
1. Показать есть ли процесс memcached
1 2 3 4 |
ps aux | grep memca nobody 21195 0.1 0.1 88884 23756 ? Sl 08:21 0:05 /usr/bin/memcached -v -m 1000 -p 11211 -u nobody -l *.*.*.*, 127.0.0.1 |
Тут мы видим, что процесс есть и запущен на нужном адресе. Памяти выделено 1000мб, пользователь nobody. 127.0.0.1 тут оказался лишним, memcached не поддерживает несколько ip.
2. Показать слушаемые порты
1 2 3 4 |
netstat -tap | grep memca tcp 0 0 razlet_second:11211 *:* LISTEN 21195/memcached |
Точно слушает.
3. Включить вывод ошибок в php. :) Ошибок не было.
4. Догадка о закрытом порте. Если не установлено, то ставим nmap. Проверяем localhost или ip.
1 2 3 4 |
sudo apt-get install nmap nmap -sT -O localhost |
Можно еще так проверить. Если нет соединения, то закрыт.
1 2 3 4 |
sudo apt-get install telnet telnet *.*.*.* 11211 |
Выдаст список открытых портов. В моем списке 11211 не оказалось. “Вот в чем собака зарыта”. :)
5. Смотрим iptables.
1 2 3 |
iptables -L |
Собственно есть еще много ключей, -nat например, но этого хватит. Выдаст список установленных для этого фаерволла правил. Еще можно так:
1 2 3 |
iptables-save |
Если без перенаправления, то в консоли выведутся правила. Через эту команду можно организовать сохранение настроек, т.к. после перезагрузки они сбросятся.
1 2 3 4 |
iptables-save > /etc/iprules.lst iptables-restore < /etc/iprules.lst |
Далее порт 11211 надо открыть, но только для одного IP адреса.
Тут мне пригодились следующие ф-ии:
1. Показать нумерованный список правил и удалить правило по номеру
1 2 3 4 |
iptables -L INPUT --line-numbers iptables -D INPUT номер |
2. закрыть все входящие, для которых нет правил на открытие
1 2 3 4 5 6 |
iptables -P INPUT DROP #открыть только для одного ИП и порта iptables -A INPUT -s 1.2.3.4 -p tcp --dport 11211 -j ACCEPT |
Еще примеры:
открыть все исходящие порты
iptables -P OUTPUT ACCEPT
открыть порт 80 для всех входящих соединений
iptables -A INPUT –dport 80 -j ACCEPT
открыть 22 и 5432 порты только для конкретного IP
iptables -A INPUT -m multiport –dports 22,5432 -s IP_ADDRESS -j ACCEPT
Так же не забудьте открыть другие нужные порты для нужных ИП.
Более подробная настройка iptables в этом посте, с примерами скриптов.
Еще можно подкрутить сессии в php.ini на использование с memcached.
1 2 3 4 5 6 7 8 |
[Session] ; Handler used to store/retrieve data. ; http://php.net/session.save-handler extension = memcache.so session.save_handler = memcache session.save_path = "tcp://127.0.0.1:11211" |
Для мониторинга была установлена утилита phpmemcachedadmin. В ней можно создать стек ваших серверов с memcached и смотреть статистику в приятном интерфейсе.