» » Ускоряем и кешируем - memcache

Ускоряем и кешируем - memcache

2-04-2015, 05:00
Автор: .
Просмотров: 1 010
Комментариев: 0
Версия для печати
 

Ускоряем и кешируем  - memcache

 

Сегодня пришла пора ускорить тяжелый сайт. Попробовать сделать это не файловым кешем, а замечательной штукой memcache. Далее будут сведения об установке и пара тестовых утилит..
1. Подключаем дополнительный репозиторий REMI, который не потребуется в случае, если вы используете Fedora 17, Fedora 16, Fedora 15, Fedora 14, Fedora 13, Fedora 12 или RHEL 6:

 
# rpm -Uvh http://dl.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm


# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-5.rpm
 


2. Теперь, когда мы подключили дополнительные репозитории можно устанавливать Memcache:


Для Fedora 17/16/15/14/13/12, CentOS/Red Hat (RHEL) 6.3/6.2/6.1/6
# yum install memcached



Для CentOS/Red Hat (RHEL) 5.8
# yum —enablerepo=remi install memcached



3. Далее необходимо внести изменения в конфигурационный файл memcache:


Правим файл: /etc/sysconfig/memcached
 
PORT='11211'


USER='memcached'


MAXCONN='2048' 
 


″ Параметр отвечает за максимальное количество подключений


CACHESIZE='4096'



″ Укажите четверть от количества фактической ОЗУ на сервере


OPTIONS='127.0.0.1'



″ Либо можно ничего не указывать


4. Добавим memcached в автозагрузку и запустим. Также перезапустим apache:


Выполним последовательно команды
 
# chkconfig memcached on


# service memcached start


# service httpd restart
 


5. Теперь проверим статус работы:


Команда /etc/init.d/memcached status выведет примерно следующее
memcached (pid 17302) is running…

Команда netstat -anp | grep 11211 покажет примерно следующее
tcp        0     0 0.0.0.0:11211      0.0.0.0:*           LISTEN      17302/memcached tcp        0     0 :::11211                    :::*                        LISTEN      17302/memcached udp       0     0 0.0.0.0:11211      0.0.0.0:*                                 17302/memcached udp       0     0 :::11211                    :::*                                              17302/memcached

На экране не очень ровно, но суть ясна. Значит всё ОК. Вроде бы и всё, но есть ещё пара ньюансов.

6. Если Memcached будет использоваться другими локальными серверами, то необходимо внести изменения в iptables:

 
Правим файл /etc/sysconfig/iptables добавив следующее
-A INPUT -m state —state NEW -m tcp -p tcp —dport 11211 -j ACCEPT
 

Перезапустим iptables

service iptables restart

или

/etc/init.d/iptables restart

7. В заключении давайте ещё установим Memcache и/или Memcached PHP Module:

Установка Memcache
# yum install php-pecl-memcache

Установка Memcached
# yum install php-pecl-memcached

Последний шаг прописать extension в файле php.ini

Правим в конце файл php.ini
extension = "memcache.so”

Сохраняем. Ну и не забываем перезапустить apache…

Если всё правильно, то вывод команды php -i | grep memcache должен показать примерно следующее:

 
 


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 sqlite memcache
 
 
 
 
Один нюанс - если несколько сайтов использует память для хранения кэша, то кэш необходимо уникализировать.
Для разделения кэша в памяти необходимо создать системный параметр cache_prefix и присвоить ему уникальное значение.
 
 

 
Тестовая утилита номер раз:
	<?
	
	
	$ops = 100000;
	
	
	$m = new Memcache();
	$m->addServer('localhost', 11211);
	
	
	$md = new Memcached();
	$md->addServer('localhost', 11211);
	
	
	echo "Test operations: {$ops}";
	echo "<h3>get test</h3>";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ ) $m->get( md5(rand(1000, 99999)) );
	echo "Memcache: " . ($res['memcache']['set'] = microtime(true) - $s ) . "<br />";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ ) $md->get( md5(rand(1000, 99999)) );
	echo "Memcached: " . ($res['memcached']['set'] = microtime(true) - $s );
	
	
	echo "<h3>set test</h3>";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ ) $m->set(md5(rand(1000, 99999)), 2);
	echo "Memcache: " . ($res['memcache']['get'] = microtime(true) - $s ) . "<br />";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ ) $md->set(md5(rand(1000, 99999)), 2);
	echo "Memcached: " . ($res['memcached']['get'] = microtime(true) - $s );
	
	
	echo "<h3>delete test</h3>";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ ) $m->delete(md5(rand(1000, 99999)));
	echo "Memcache: " . ($res['memcache']['delete'] = microtime(true) - $s ) . "<br />";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ ) $md->delete(md5(rand(1000, 99999)));
	echo "Memcached: " . ($res['memcached']['delete'] = microtime(true) - $s );
	
	
	echo "<h3>combined test</h3>";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ )
	{
	$key = md5(rand(1000, 99999));
	$m->set($key, 2);
	$m->get($key);
	$m->delete($key);
	}
	echo "Memcache: " . ($res['memcache']['combined'] = microtime(true) - $s ) . "<br />";
	
	
	$s = microtime(true);
	for ( $i = 0; $i < $ops; $i++ )
	{
	$key = md5(rand(1000, 99999));
	$md->set($key, 2);
	$md->get($key);
	$md->delete($key);
	}
	echo "Memcached: " . ($res['memcached']['combined'] = microtime(true) - $s );
	

 
Номер два:
 убедись, что php-gd есть в системе
<?php
	function LoadCPU()
	{
	//Функция, которая должна зугрузить процессор
	 
	//Создадим изображение 800x600
	$image = imagecreate(800, 600);
	 
	//Белый фоновый цвет
	$color = imagecolorallocate($image, 255, 255, 255);
	 
	//Чёрный
	$color2 = imagecolorallocate($image, 0, 0, 0);
	 
	for ($i = 0; $i < 10000; $i++) {
	//Расставим 10 000 точек в случайном порядке
	imagesetpixel($image, rand(0, 800), rand(0,600), $color2);
	}
	 
	//Выбрасываем указатель
	return $image;
	}
	 
	 
	//Создаём новый объект Memcache
	$memcache_obj = new Memcache;
	 
	//Соединяемся с нашим сервером
	$memcache_obj->connect('127.0.0.1', 11211) or die("Could not connect");
	 
	//Попытаемся получить объект с ключом image
	$image_bin = @$memcache_obj->get('image');
	 
	if(empty($image_bin)) {
	 
	//Если в кэше нет картинки, сгенерируем её и закэшируем
	imagepng(LoadCPU(),getcwd().'/tmp.png',9);
	$image_bin = file_get_contents(getcwd().'/tmp.png');
	unlink(getcwd().'/tmp.png');
	$memcache_obj->set('image', $image_bin, false, 30);
	}
	 
	//Выведем картинку из кэша
	header('Content-type: image/png');
	echo $image_bin;
	 
	//Закрываем соединение с сервером Memcached
	$memcache_obj->close();
	?>

 
 

 

Для тестирования и небольших манипуляций есть утилита memcache.zip [7,78 Kb] (cкачиваний: 8)
Смени логин и пароль для входа. В этом скрипте в строках:

	define('ADMIN_USERNAME','memcache');     // Admin Username
	define('ADMIN_PASSWORD','password');      // Admin Password
 
 ну и все файлы скопом: memcache-test-tools.zip [9,12 Kb] (cкачиваний: 9)

 

 
Рейтинг статьи:
  
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.