分类: LINUX
2010-06-22 16:44:29
Memcached &Php-memcache
Memcached 是由Danga Interactive 开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。
通过在内存里维护一个统一的巨大的Hash表,Memcached能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。
Memcached使用了libevent(在linux下最好使用epoll)来均衡任何数量的打开链接,使用非阻塞的网络I/O,对内部对象实现引用计数,使用自己的页块分配器和哈希表,因此虚拟内存不会产生碎片,并且虚拟内存分配的时间复杂度可以保证为o(1)。
Memcached的缓存是一种分布式的,可以让不同主机上的多个用户同时访问,因此解决了共享内存只能单机应用的局限,更不会出现使用数据库做类似事情的时候,磁盘开销和阻塞的发生。
环境
Centos 5.5,2.6.18
源码包
memcached-1[1].4.5.tar.gz
memcache-2[1].2.5.tgz
首先服务器端memcached需要libevent库的支持,事先需要安装好libevent库,详情请Google之。
#tar xzvf memcached-1[1].4.5.tar.gz
#cd memcached-1.4.5
#./configure
#make && make install
#cd ..
帮助
#/usr/local/bin/memcached –h
启动
#/usr/local/bin/memcached –d –m 10 –u root –l 127.0.0.1 –p 10000 –c 256 –P /tmp/memcached.pid
-d:启动一个守护进程,daemon
-m:分配给memcached使用的内存数量,单位是MB,此处是10MB
-u:运行memcached的用户,此处是root
-l:监听的服务器ip地址,此处为监听本机localhost
-p:监听的端口号,此处为10000
-c:最大运行的并发连接数,默认值是1024,此处为256
-P:memcached的pid文件
终止
#kill -9 `cat /tmp/memcached.pid`
需要注意的是关掉selinux
#getenforce
#setenforce 0
也可以启动多个memcached守护进程,但端口号不能重复。
#tar xzvf memcache-2[1].2.5.tgz
#cd memcache-2.2.5
#./configure
#make && make install
编辑php的配置文件php.ini
#echo “extension=memcache.so”>>/usr/local/lib/php.ini
由于memcache会用到libevent库,所以需要
#touch /etc/ld.so.conf.d/libevent-i386.conf
#echo “/usr/local/lib”>>/etc/ld.so.conf.d/libevent-i386.conf
#ldconfig
服务器端开启nginx,memcached,php-cgi
#/usr/bin/nginx
#/usr/local/bin/php-cgi –b 127.0.0.1:9000 &
#/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 10000 -c 256 -P /tmp/memcached.pid
#ps –ef
root 18631 1 0 Jun18 ? 00:00:00 nginx: master process /usr/bin/nginx
root 18727 1 0 Jun18 ? 00:00:00 /usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 10000 -c 256 -P /tmp/memcached.pid
nobody 18774 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18775 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18776 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18777 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18778 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18779 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18780 18631 0 Jun18 ? 00:00:00 nginx: worker process
nobody 18781 18631 0 Jun18 ? 00:00:00 nginx: worker process
root 18854 13705 0 Jun18 pts/1 00:00:00 /usr/local/bin/php-cgi -b 127.0.0.1:9000
#netstat –anpt
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 18854/php-cgi
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1935/portmap
tcp 0 0 127.0.0.1:10000 0.0.0.0:* LISTEN 18727/memcached
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 18631/nginx
tcp 0 0 0.0.0.0:881 0.0.0.0:* LISTEN 1971/rpc.statd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 2223/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 2262/sendmail: acce
tcp 0 0 :::22 :::* LISTEN 2210/sshd
tcp 0 0 :::4730 :::* LISTEN 11676/gearmand
tcp 0 0 ::ffff:192.168.159.129:22 ::ffff:192.168.159.1:1066 ESTABLISHED 13703/1
可以看到后台进程都成功启动
Memcache客户端包含两组接口,一组是面向过程的接口,一组是面向对象的接口,具体可以参考php手册关于memcache functions这部分,为了简单方便,使用面向对象的方法,便于维护和编写代码。
Memcache面向对象常用接口如下:
Memcache::connect—打开一个到Memcache的连接
Memcache::pconnect—打开一个到Memcache的长连接
Memcache::close—关闭一个Memcache的连接
Memcache::set—保存数据到Memcache服务器上
Memcache::get—提取一个保存在Memcache服务器上的数据
Memcache::replace—替换一个已经存在Memcache服务器上的项目
Memcache::flush—刷新所有Memcache服务器上保存的项目
Memcache::getStats—获取当前Memcache服务器的状态
在/usr/local/nginx/html目录下创建memcache_test.php,内容如下:
#!/usr/local/bin/php
//connect
$mem = new Memcache;
$mem->connect('localhost',10000);
//save object
$mem->set('key1','This is first value',0,60);
$val = $mem->get('key1');
echo "Get key1 value:".$val."
";
//replace
$mem->replace('key1','this is replace value',0,60);
$val = $mem->get('key1');
echo "Get key1 value:".$val."
";
//save array
$arr = array('aaa','bbb','ccc','ddd');
$mem->set('key2',$arr,0,60);
$val2 = $mem->get('key2');
echo "get key2 value:";
print_r($val2);
echo "
";
//delete op
$mem->delete('key1');
$val = $mem->get('key1');
echo "get key1 value:".$val."
";
//flush
$mem->flush();
$val2=$mem->get('key2');
echo "get key2 value:".$val2."
";
print_r($val2);
echo "
";
//close
$mem->close();
?>
然后打开浏览器,地址栏输入(xxx.xxx.xxx.xxx为你的服务器的地址),如果出现下面的运行结构,表明memcached和php-memcache的测试成功
Get key1 value:This is first value
Get key1 value:this is replace value
get key2 value:Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
get key1 value:
get key2 value: