apache+php+memcached+mysql 访问加速方案
Memcache简单介绍:
Memcached 是一个自由和开放源码、高性能、分布的内存对象缓存系统。可用于加速动态web应用程序,减轻数据库的负载。通过在内存里维护一个统一的巨大的hash表,能够来存储各种格式的数据,包括图像、视频、文件以及数据库查询的结果等。
这里的memcache要跟php中的memcache区别开来,php中的memcache是php的支持扩展,而memcached是服务端主程序文件,服务端安装程序,如果要使用memcache来缓存系统,memcache和memcached都要安装。Memcache是一种内存缓存,把经常存取的数据或者对象,缓存在内存中,内存中缓存的这些数据是通过API的方式被存取的,数据就像是一个大的hash表,通过缓存常用的数据或者对象,以此来减轻数据库的压力,提高网站的响应速度。通俗的讲,客户端发出请求到达memcache,如果请求的数据存在memcache中,那么就直接将请求的数据返回,不再对数据进行任何操作。如果请求的数据不存在memcache中,那就去查询数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcache中。每次更新数据库的同时,更新memcache中的数据,保证memcache 中的数据与数据库中的数据一致。
memcache的简单原理示意图
-------------------------------------
安装配置
简单的介绍完了原理,开始安装配置,基础是lamp,这里就不介绍了
memcache 、memcached
[root@localhost softs]# wget http://memcached.googlecode.com/files/memcached-1.4.13.tar.gz
[root@localhost softs]# wget http://pecl.php.net/get/memcache-2.2.6.tgz
[root@localhost softs]# ls memcache* -l
-rw-r--r-- 1 root root 35957 Oct 4 2010 memcache-2.2.6.tgz ------------------memcache的php扩展
-rw-r--r-- 1 root root 320751 Feb 3 2012 memcached-1.4.13.tar.gz ----------------------memcache服务端软件
安装memcached
安装该软件时需要libevent的支持,为了防止软件版本太低,所以不建议yum安装
安装libevent
[root@localhost softs]# wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz
[root@localhost softs]# tar xf libevent-2.0.21-stable.tar.gz -C /usr/src/
[root@localhost softs]# cd /usr/src/libevent-2.0.21-stable/
[root@localhost libevent-2.0.21-stable]# ./configure && make && make install
安装 memcached
[root@localhost softs]# tar xf memcached-1.4.13.tar.gz -C /usr/src/
[root@localhost softs]# cd /usr/src/memcached-1.4.13/
[root@localhost memcached-1.4.13]# ./configure --with-libevent=/usr/local && make && make install
[root@localhost run]# memcached -m 32m -p 11211 -d -u root -P /var/run/memcached.pid -c 256 ----------启动memcached进程
-p 使用的tcp端口,默认为11211;-m最大内存块,默认为64M;-d 作为守护进程在后台运行;-c最大运行的并发数,默认为1024;-P设置保存memcached的pid文件;
-u 表示运行memcached的用户,默认不能由root启动,所以当前用户为root时,必须要指定;-l 是监听服务器的地址,如果有多个地址的话。
[root@localhost memcached-1.4.13]# ps -e | grep mem
16499 ? 00:00:00 memcached
[root@localhost memcached-1.4.13]# netstat -tunlp | grep mem
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 16499/memcached
udp 0 0 0.0.0.0:11211 0.0.0.0:* 16499/memcached
[root@localhost memcached-1.4.13]#
关闭memcached
[root@localhost run]# cat /var/run/memcached.pid
16532
[root@localhost run]# kill -9 16532
安装php的memcache扩展
[root@localhost softs]# tar xf memcache-2.2.6.tgz -C /usr/src/
[root@localhost softs]# cd /usr/src/memcache-2.2.6/
[root@localhost memcache-2.2.6]# ls
CREDITS memcache.php
README memcache_consistent_hash.c
config.m4 memcache_queue.c
config.w32 memcache_queue.h
config9.m4 memcache_session.c
example.php memcache_standard_hash.c
memcache.c php_memcache.h
memcache.dsp
[root@localhost memcache-2.2.6]# phpize
Configuring for:
PHP Api Version: 20090626
Zend Module Api No: 20090626
Zend Extension Api No: 220090626
[root@localhost memcache-2.2.6]# ls
CREDITS config.sub memcache.php
Makefile.global config.w32 memcache_consistent_hash.c
README config9.m4 memcache_queue.c
acinclude.m4 configure memcache_queue.h
aclocal.m4 configure.in memcache_session.c
autom4te.cache example.php memcache_standard_hash.c
build install-sh missing
config.guess ltmain.sh mkinstalldirs
config.h.in memcache.c php_memcache.h
config.m4 memcache.dsp run-tests.php
[root@localhost memcache-2.2.6]#
[root@localhost memcache-2.2.6]# ./configure --enable-memcache --with-php-config=/usr/local/bin/php-config
[root@localhost memcache-2.2.6]# make
[root@localhost memcache-2.2.6]# make install
Installing shared extensions: /usr/local/lib/php/extensions/no-debug-zts-20090626/
[root@localhost memcache-2.2.6]# cd modules/
[root@localhost modules]# ls
memcache.so
[root@localhost modules]# pwd
/usr/src/memcache-2.2.6/modules
接下来修改php配置文件php.ini
[root@localhost lib]# vi php.ini
extension="/usr/local/lib/php/extensions/no-debug-zts-20090626/"
extension=memcache.so ---------------在文件中加上这两行
测试memcache的php扩展是否安装成功
[root@localhost lib]# memcached -m 32m -p 11211 -u root -P /var/run/memcached.pid -c 256 -d
[root@localhost lib]# /etc/init.d/apache start
[root@localhost ~]# cd /www/ --------------------/www是我的apache的Document Root
[root@localhost www]# vi mem_test.php
<?php
$mem=new Memcache;
$mem->connect("127.0.0.1",11211);
$mem->set('hello','world',0,60);
$val=$mem->get('hello');
echo $val;
?>
[root@localhost www]# elinks --dump 127.0.0.1/mem_test.php
world
如果可以看到world,那你的memcachephp扩展就成功了
-------------------------------------
memcache与php的配合使用
php与memcache结合测试代码
[root@localhost www]# vi php-mem.php
<?php
//connect
$mem = new Memcache; --------初始化一个memcache对象
$mem->connect('localhost',11211); ---------------连接到memcache服务器,IP及端口
//save data
$mem->set('key1','this is first value',0,60); -------key 数据的key,用来定位一个数据;第二个参数是需要保存的数据内容;第三个参数是标记,一般为0,第四个参数是混村的有效时间,超时就会被清除。
$val = $mem->get('key1'); -------------get就是要获取数据,获取key1数据
echo "Get key1 value:".$val."<br/>";
//replace data
$mem->replace('key1','this is replace value',0,60);
$val = $mem->get('key1');
echo "Get key1 value:".$val."<br/>";
//save data group
$arr = array('aa','bb','cc');
$val = $mem->get('key1');
echo "Get key1 value:".$val."<br/>";
//replace data
$mem->replace('key1','this is replace value',0,60); -------------替换key1
$val = $mem->get('key1'); -------------保存key1
echo "Get key1 value:".$val."<br/>";
//save data group
$arr = array('aa','bb','cc');
$mem->set('key2',$arr,0,60);
$val2 = $mem->get('key2');
echo "Get key2 value:";
print_r($val2);
echo "<br/>";
//delete data
$mem->delete('key1'); -----------删除key1
$val=$mem->get('key1');--------------保存key1
echo "get key1 value:".$val."<br/>";
//close connetions
$mem->close(); --------关闭
?>
"php-mem.php" [New] 36L, 678C written
[root@localhost www]# elinks --dump 127.0.0.1/php-mem.php
Get key1 value:this is first value
Get key1 value:this is replace value
Get key2 value:Array ( [0] => aa [1] => bb [2] => cc )
get key1 value:
现在就成功了。