这篇日志主要记录了我编译安装memcached、php-memcache的过程。
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
Memcache官方网站:http://www.danga.com/memcached
到官方网站下载最新版本,编译安装之~
编译之前需要确保你的系统中有libevent及其开发包,如果没有的话…先安装吧。
1 2 3 4 5 |
tar xvf memcached-1.2.6.tar.gz cd memcached-1.2.6 ./configure --prefix=/usr/local/memcached make make install |
安装好了以后,先建立memcached运行临时目录:
1 2 |
mkdir -pv /var/run/memcached chown -R nobody:nobody /var/run/memcached |
然后就可以启动memcached的守护进程了:
1 |
/usr/local/memcached/bin/memcached -p 11211 -l 172.16.236.150 -d -u nobody -P /var/run/memcached/memcached.pid -m 64M -c 1024 |
几个参数的解释:
-p memcached监听的TCP端口
-l 监听的ip地址,172.16.236.150是我服务器的IP地址,如果你需要多个服务器都能够读取这台memcached的缓存数据,那么就必须设定这个ip
-d 以daemon方式运行,将程序放入后台
-u memcached的运行用户,我设定的是nobody
-P memcached的pid文件路径
-m memcached可以使用的最大内存数量
-c memcached同时可以接受的最大的连接数
如果你希望以socket方式来访问memcached,那么在启动的时候就必须去掉 -l和-p参数,并加上-s参数:
-s memcached的socket文件路径
下面安装php的extension,你可以在php的pcel项目站点找到memcache的扩展:http://pecl.php.net/package/memcache,目前最新版本是3.0.3
注意了,在pcel站点上有两个关于memcached的php扩展,一个叫memcache,一个叫memcached,看介绍,这两个扩展的功能都是一样的,但是后者似乎是今年才开始的项目,综合考虑,我还说选用了前者,毕竟开发时间长,以后找文档应该也会方便得多。
下载php-memcache之后,编译安装:
1 2 3 4 5 6 |
tar xvf memcache-3.0.3.tgz cd memcache-3.0.3 /usr/local/php5/bin/phpize ./configure --with-php-config=/usr/local/php5/bin/php-config --enable-memcache make make install |
按照我的环境,编译出来的memcache.so保存在 /usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/ 目录下,如果你的环境不一样,你得根据自己情况修改你的php.ini了。
接着要做的工作就是让php加载这个扩展,编辑你的php.ini,在适当位置(通常是最后,也可以是独立的一个ini文件)加入如下行:
1 |
extension=memcache.so |
然后重启你的phpfastcgi进程或者apache,运行一个phpinfo()来确认一下,正常的话你应该可以看到这个了:
现在,你已经可以在你的php程序中存取memcached中的缓存数据了,在php-memcache的文档中提供了相关的接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
class MemcachePool() { /** * 连接到memcached */ bool connect(string host, int tcp_port = 11211, int udp_port = 0, bool persistent = true, int weight = 1, int timeout = 1, int retry_interval = 15) /** * 增加一个memcached服务器 */ bool addServer(string host, int tcp_port = 11211, int udp_port = 0, bool persistent = true, int weigh t = 1, int timeout = 1, int retry_interval = 15, bool status = true) /** * 设置memcached参数(运行时的) */ bool setServerParams(string host, int tcp_port = 11211, int timeout = 1, int retry_interval = 15, boo l status = true) /** * 读取memcached中的数据 */ mixed get(mixed key, mixed &flags = null, mixed &cas = null) /** * 保存memcached数据,支持以数组方式的复合设置,例子: * $memcache->set(array('key1' => 'val1', 'key2' => 'val1'), null, 0, 60) */ bool add(mixed key, mixed var = null, int flag = 0, int exptime = 0) bool set(mixed key, mixed var = null, int flag = 0, int exptime = 0) bool replace(mixed key, mixed var = null, int flag = 0, int exptime = 0) /** * Compare-and-Swap, uses the CAS param from MemcachePool::get() */ bool cas(mixed key, mixed var = null, int flag = 0, int exptime = 0, int cas = 0) /** * Prepends/appends a value to an existing one */ bool append(mixed key, mixed var = null, int flag = 0, int exptime = 0) bool prepend(mixed key, mixed var = null, int flag = 0, int exptime = 0) /** * 删除缓存数据 * $memcache->delete(array('key1', 'key2')) */ bool delete(mixed key, int exptime = 0) /** * Supports multi-key operations, for example * $memcache->increment(array('key1', 'key2'), 1, 0, 0) * * The new defval (default value) and exptime (expiration time) are used * if the key doesn't already exist. They must be supplied (even if 0) for * this to be enabled. */ mixed increment(mixed key, int value = 1, int defval = 0, int exptime = 0) mixed decrement(mixed key, int value = 1, int defval = 0, int exptime = 0) /** * Assigns a pool-specific failure callback which will be called when * a request fails. May be null in order to disable callbacks. The callback * receive arguments like * * function mycallback($host, $tcp_port, $udp_port, $error, $errnum) * * 发生错误是的回调函数 */ bool setFailureCallback(function callback) } |
比如,一段最典型的代码可能就是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 |
$obj = new MemcachePool(); $obj->addServer('172.16.236.150'); if ( $obj->get('id') ) { echo 'Old value : '.$obj->get('id') ; if ( isset($_GET['id'] ) { $obj->set('id',$_GET['id'])); echo '<br />New value setted.'; } }else { $obj->add('id' , $_GET['id']); } unset($obj); |
基本工作已经做完了,当然为了让memcached运行得更舒服、为了系统的安全性,你还可以写一个脚本把memcached加入系统启动进程,并设置一下iptables等等,这些不是本文重点,就略去不说了~