• Страница 1 из 1
  • 1
Форум » Другое » Разработка сайтов » Как установить memcache?
Как установить memcache?
Driver86Дата: Среда, 2012-03-14, 00:47:18 | Сообщение # 1
Нет аватара у Driver86
CyberMan
Администраторы
Сообщений: 545
Репутация: 14
Не на форуме
Для любого веб-сайта критичной для его посетителя является такая характеристика, как время отклика сервера. И чем дольше отвечает браузеру ваш сайт, тем меньше терпения будет у его пользователя. Следовательно, необходимо минимизировать время отклика, а для этого необходимо уменьшать то самое время, которое требует сервер на формирование ответа пользователю, а ответ пользователю часто нуждается в получении данных из каких-то внешних ресурсов, например баз данных вроде MySQL. И этими ресурсами могут быть как базы данных, так и любые другие относительно медленные источники данных. Тут-то и пора подумать о кешировании этих данных.

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

Memcached был реализован Брэдом Фитцпатриком (Brad Fitzpatrick) во время своей работы над проектом ЖивойЖурнал (LiveJournal). Он использовался для уменьшения нагрузок на базы данных от запросов при формировании ответа браузеру пользователя. Сегодня, если верить словам специалистов, memcached нашел своё применение в таких гигантских проектах, как Wikipedia, YouTube, Facebook и многие другие.

Memcached задуман так, что время выполнения любой операции не зависит от количества ключей, которые хранит memcached. Используется асинхронный ввод-вывод, не используются нити, что обеспечивает дополнительный прирост производительности и меньшие требования к ресурсам. По-этому, можно смело сказать, что время отклика сервера memcached определяется только сетевыми издержками, и такие характеристики позволяют использовать memcached в высоконагруженных веб-проектах. Рассмотрим ниже, как установить memcached и использовать его в популярном веб-языке PHP.

Мы будем ставить memcached на ОС Linux. В остальных ОС всё примерно аналогично.

Качаем putty, запускаем, подключаемся к своему серверу. Эта программка позволит управлять нашим сервером из командной строки путём SSH. Далее рассмотрим эти команды...

Переходим в /usr/local:

Code
cd /usr/local

Создаем директорию memcached:

Code
mkdir memcached

Переходим в директорию memcached:

Code
cd memcached

Загрузим дистрибутив с сайта производителя (информацию о последних релизах можно найти по адресу http://memcached.org/):

Code
wget http://memcached.googlecode.com/files/memcached-1.4.5.tar.gz

Распаковываем:

Code
tar -xvjf ./memcached-1.4.5.tar.gz

Переходим в директорию memcached-1.4.5:

Code
cd memcached-1.4.5

Собираем memcached:

Code
phpize
./configure

Инсталлируем memcached:

Code
make && make install

Устанавливаем PHP-клиент PECL memcache, позволяющий нам работать с только что установленным сервером memcached (см. http://pecl.php.net/package/memcache):

Code
cd /usr/local/src
mkdir memcache
cd memcache
wget http://pecl.php.net/get/memcache-2.2.6.tgz
tar zxvf ./memcache-2.2.6.tgz
cd memcache-2.2.6
phpize
./configure
make && make install

Откройте свой файл php.ini и где-то в его самом низу добавьте эту строчку

Code
extension = memcache.so

Открыть файл можно с помощью любого текстового редактора, например vi. Сохраняем. Перезагружаем Apache... Дабы удостовериться, что всё установилось, запустите в PHP функцию phpinfo(); - найдите там упоминание про memcached! Обратите внимание, что после установки создастся скрипт в /etc/init.d/memcached для его автоматического запуска.

О том, как использовать memcached в PHP, читаем тут: http://php.net/manual/en/book.memcache.php

Пример использования (использую этот код в одном из своих проектов):

Code
$memcache = new Memcache;
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");

function readcache($key){
  global $memcache;
  return $memcache->get($key);
}

function writecache($key, $value){
  global $memcache;
  $memcache->set($key, $value, false, 3600);
  return true;
}

Выполните приведённый выше код. Если вы получите ошибку, значит, memcached не прописан с автозапуском вместе с Apache. Для запуска выполняем команду:

Code
memcached -d -m 2048 -l 127.0.0.1 -p 11211

-d запустить как димон
-m количество отведённой памяти в Мб
-l адрес который надо слушать
-p порт который надо слушать

Хорошо это или плохо, но у сервера memcached нет конфигурационных файлов, все необходимые параметры передаются серверу при запуски через командную строку.

Возможен случай, когда при выполнении этой команды мы получим сообщение вида Error о неком "libevent". Лечится это установкой последнего:

Code
wget http://monkey.org/~provos/libevent-2.0.10-stable.tar.gz

tar -xvjf libevent-2.0.10-stable.tar.gz
cd libevent-2.0.10-stable
./configure && make && make install


Официальный сайт libevent: http://monkey.org/~provos/libevent/

Так... Заставим memcached запускаться автоматически!

Создаём файл

Code
touch /etc/memcached.conf

Прописываем в него этот код:

Code
#Memory a usar
-m 512
# default port
-p 11211
# user to run daemon nobody/apache/www-data
-u nobody
# only listen locally
-l 127.0.0.1

и сохраняем; затем создаём startup-файл:

Code
touch /etc/init.d/memcached
chmod +x /etc/init.d/memcached

Вставляем в этот файл следующий код:

Code
#!/bin/bash
#
# memcached This shell script takes care of starting and stopping
# standalone memcached.
#
# chkconfig: - 80 12
# description: memcached is a high-performance, distributed memory
# object caching system, generic in nature, but
# intended for use in speeding up dynamic web
# applications by alleviating database load.
# processname: memcached
# config: /etc/memcached.conf
# Source function library.
. /etc/rc.d/init.d/functions
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DAEMON=/usr/local/bin/memcached
DAEMONBOOTSTRAP=/usr/local/bin/start-memcached
DAEMONCONF=/etc/memcached.conf
NAME=memcached
DESC=memcached
PIDFILE=/var/run/$NAME.pid
[ -x $DAEMON ] || exit 0
[ -x $DAEMONBOOTSTRAP ] || exit 0
RETVAL=0
start() {
  echo -n $"Starting $DESC: "
  daemon $DAEMONBOOTSTRAP $DAEMONCONF
  RETVAL=$?
  [ $RETVAL -eq 0 ] && touch $PIDFILE
  echo
  return $RETVAL
}
stop() {
  echo -n $"Shutting down $DESC: "
  killproc $NAME
  RETVAL=$?
  echo
  [ $RETVAL -eq 0 ] && rm -f $PIDFILE
  return $RETVAL
}
# See how we were called.
case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart|reload)
  stop
  start
  RETVAL=$?
  ;;
  status)
  status $prog
  RETVAL=$?
  ;;
  *)
  echo $"Usage: $0 {start|stop|restart|status}"
  exit 1
esac
exit $RETVAL

Создаём ещё файл:

Code
touch /usr/local/bin/start-memcached
chmod +x /usr/local/bin/start-memcached

Вставляем в него этот код и сохраняем:

Code
#!/usr/bin/perl -w
# start-memcached
# 2003/2004 - Jay Bonci <jaybonci@debian.org>
# This script handles the parsing of the /etc/memcached.conf file
# and was originally created for the Debian distribution.
# Anyone may use this little script under the same terms as
# memcached itself.
use strict;
if ($> != 0 and $< != 0) {
  print STDERR "Only root wants to run start-memcached.\n";
  exit;
}
my $etcfile = shift || "/etc/memcached.conf";
my $params = [];
my $etchandle;  
# This script assumes that memcached is located at /usr/bin/memcached, and
# that the pidfile is writable at /var/run/memcached.pid
my $memcached = "/usr/local/bin/memcached";
my $pidfile = "/var/run/memcached.pid";
# If we don't get a valid logfile parameter in the /etc/memcached.conf file,
# we'll just throw away all of our in-daemon output. We need to re-tie it so
# that non-bash shells will not hang on logout. Thanks to Michael Renner for  
# the tip
my $fd_reopened = "/dev/null";
sub handle_logfile {
  my ($logfile) = @_;
  $fd_reopened = $logfile;
}
sub reopen_logfile {
  my ($logfile) = @_;
  open *STDERR, ">>$logfile";
  open *STDOUT, ">>$logfile";
  open *STDIN, ">>/dev/null";
  $fd_reopened = $logfile;
}
# This is set up in place here to support other non -[a-z] directives
my $conf_directives = {
  "logfile" => \&handle_logfile
};
if (open $etchandle, $etcfile) {
  foreach my $line (<$etchandle>) {
  $line =~ s/\#.*//go;
  $line = join ' ', split ' ', $line;
  next unless $line;
  next if $line =~ /^\-[dh]/o;
  if ($line =~ /^[^\-]/o) {
  my ($directive, $arg) = $line =~ /^(.*?)\s+(.*)/;  
  $conf_directives->{$directive}->($arg);
  next;
  }
  push @$params, $line;
  }
}
unshift @$params, "-u root" unless (grep $_ eq '-u', @$params);
$params = join " ", @$params;
if (-e $pidfile) {
  open PIDHANDLE, "$pidfile";
  my $localpid = <PIDHANDLE>;
  close PIDHANDLE;
  chomp $localpid;
  if (-d "/proc/$localpid") {
  print STDERR "memcached is already running.\n";  
  exit;
  } else {
  `rm -f $localpid`;
  }
}
my $pid = fork();
if ($pid == 0) {
  reopen_logfile($fd_reopened);
  exec "$memcached $params";
  exit(0);
} elsif (open PIDHANDLE,">$pidfile") {
  print PIDHANDLE $pid;
  close PIDHANDLE;
} else {
  print STDERR "Can't write pidfile to $pidfile.\n";
}

Всё... проверяем нашу работу:

Code
/etc/init.d/memcached restart

после выполнения этой команды мы должны увидеть следующее:

Code
Shutting down memcached:                      [  OK  ]
Starting memcached:                                [  OK  ]



 
Форум » Другое » Разработка сайтов » Как установить memcache?
  • Страница 1 из 1
  • 1
Поиск: