Установка Memcached
Установка, настройка и пример использования Memcached, позволяющего хранить результаты трудоемких расчетов в оперативной памяти.
Al-Sher
Возможно, многие встречались с тем, что некоторые скрипты потребляют очень много ресурсов сервера. Такое часто бывает на крупных и высоконагруженных проектах и именно поэтому, для ресурсоемких скриптов лучше где-нибудь хранить результат выполнения.
Если хранить данные на жестком диске, то мы упремся в возможности HDD/SSD/RAID, то есть в систему хранения данных - это может так же негативно повлиять на скорость обработки данных. Именно по этой причине существует и востребован Memcached, который хранит результаты в оперативной памяти для наибыстрейшего ответа клиенту.
У всего есть свои негативные стороны. У memcached данной стороной является необходимость отключение swap и чуть большего размера оперативной памяти. Если вы берет сервер с запасом, то для вас отдать пару мегабайт для memcached не составит проблем.
Как я уже сказал, для работы memcached необходимо отключать swap. Данное действие связано с тем, что linux может просто "выкинуть" наш кэш в swap и мы, опять же, упремся в возможности системы хранения данных.
Установка Memcached
Для работы Memcached необходимо установить сервер с одноименным названием:
- Ubuntu/Debian
sudo apt-get install memcached
- CentOS
yum install memcached
Далее установим php модули:
- Ubuntu/Debian
sudo apt-get install php-memcached php-memcache
- CentOS
yum install php-memcached php-memcache
Настройка memcached
Все настройки memcached хранятся в файле /etc/memcached.conf. Давайте посмотрим те настройки, которые наиболее важны:
- флаг "-d" - отвечает за работу memcached как демон;
- logfile - файл логов;
- флаг "-m" - отвечает за отводимую оперативную память для нашего кэша;
- флаг "-p" - отвечает за прослушиваемый порт, желательно поменять;
- флаг "-u" - от чьего имени работает наш memcached сервер, желательно поменять;
- флаг "-l" - отвечает за прослушиваемый адрес.
После настройки memcached сервера его необходимо перезагрузить:
service memcached restart
Кстати, после установки модуля для php, php желательно так же перезагрузить:
service php-fpm restart
Проверим работу memcached-сервера:
netstat -tap | grep memcached
Пример работы
Давайте создадим скрипт, сохраняющий в кэш текущее время:
<?php
$memcached = new Memcache;
$memcached->connect('127.0.0.1',11211) or die("Error connect");
$time = @$memcached->get("time");
if(isset($time)) {
echo $time;
} else {
$memcached->set("time",time(),false,10);
echo $memcached->get("time");
}
$memcached->close();
?>
Теперь комментарии: для начала мы определяем класс memcached, благодаря которому и работает вся наша кэширующая система. Далее мы устанавливаем соединение с нашим сервером, указывая в функции connect ip адрес сервера и порт, по которому можно достучаться до memcached. После подключения к кэшируемому серверу нам необходимо проверить, а не записывали ли мы уже необходимую переменную. Данные переменной, находящейся в кэше, можно получить, обратившись к функции get класса memcached, передавая название переменной. Если переменная существует - выводим её из кэша. Если она отсутствует, то добавляем в кэш необходимую информацию, используя функцию set с параметрами(название переменной, содержимое, необходимость сжатия и время хранения(в секундах)) и выводим её. В конце работы с memcached нам необходимо закрыть соединение, путем вызова функции close. Данный пример будет выводить unix-метку времени с точностью до 10 секунд(время хранения кэша).
Дополнительные возможности
В Memcached предусмотрено сжатие данных, но оно будет замедлять процесс работы скриптов. Если для Вас скорость работы намного важнее, чем занимаемое место кэшем, то отключайте его. Так же memcached может работать с пулом серверов, что позволяет распределить нагрузку. Для добавления нового сервера используется функция addServer. Данная функция так же требует ip и порт memcached-сервера. Возможно, во время работы с данными, вам необходимо заменить или удалить содержимое переменной, находящейся в кэше. Не вижу смысла заново прописывать set, ведь для этого существуют функции replace и delete. Для функции delete достаточно будет ввести переменную, а вот replace принимает всё те же параметры, что и set.
Заключение
На этом я хочу закончить данную статью, если у Вас возникли вопросы, то задавайте их в комментариях и я постараюсь Вам помочь :)