// 20121112-初识memcached
// 教四楼 B503
// gipsa
我在做一个网站时遇到了这样的问题,我需要在一个会话中保存一些与用户相关的信息,当然,首先我选择了使用SESSION和COOKIE。
但是COOKIE的大小受限,经常无存存下这些数据,SESSION中倒是能存下,不过这会给服务器增加不小的负担。
当我向资深人士咨询这个问题时,我得到了一个词“memcache(d)”。我这样写,是因为我不记得当时的回答到底是"memcache"还是"memcached"了。
当我下决心学习使用她时, 我才意识到不记得最后一个字母是件多么糟糕的事情——我在PHP手册中看到了两个扩展:memcache和memcached。
第一个问题:memcache还是memcached
======================================
如上所述PHP手册中有两个扩展
如果事先没有其他了解的话,光看手册好像很难明白两者的区别。不然也不会有人在stackoverflow上问两者的区别了。
在参考分析了一些博文,加以手册佐证,我得到了以下信息:
1. memcached扩展比memcache扩展出现的晚,这往往意味着前者更先进一些。
2. memcached扩展需要libmemcached库的支持,memcache扩展需要zlib库的支持,zlib库往往已经包含在PHP安装包中了,而libmemcached库却并非如此。
3. memcached扩展的功能更强大,能更好的处理分布式应用中容易遇到的一些问题,如数据同步问题等。
详见(引用:stackoverflow上的一个问答)
综上,我决定使用memcached扩展。
第二个问题:安装
======================================
如上所言,memcached扩展需要libmemcached客户端库的支持。
有一篇参考博文()说,应该先下载安装libmemcached。
于是
sudo apt-get install libmemcached6
然后思考怎么安装memcached。
看到手册中写道:安装此PECL 扩展相关的信息可在手册中标题为 PECL 扩展的安装 章节中找到。
于是跳到相关章节,看到如下内容:
» PECL 是通过 » PEAR 打包系统来的 PHP 扩展库仓库,本章内容示范了怎样取得并安装 PECL 扩展。
于是按照手册指导,下载pecl
sudo apt-get install php-pear
然后
pear memcached
提示
No releases available for package "pear.php.net/memcached" - package pecl/memcached can be installed with "pecl install memcached"
install failed
按照提示
sudo pecl install memcached
然后开始下载memcached-2.1.0.tgz
接着是编译模块和检测安装环境,在长长的一串 checking xxx 之后,出现了如下error:
checking for libmemcached location... configure: error: memcached support requires libmemcached 1.0.x. Use --with-libmemcached-dir= to specify the prefix where libmemcached headers and library are located
ERROR: `/tmp/pear/temp/memcached/configure' failed
按照提示指定libmemcached6的路径:
sudo pecl install memcached --with-libmemecached-dir=/usr/lib/
报错信息依旧如上。
(此处存疑:我指定的路径是否正确?)
不解之时我尝试了一下:
apt-get install php5-memcached
结果安装成功,测试如下:
php -m | grep mem
memcached
安装总结
--------------
其实,在用apt-get 安装php5-memcached时,apt-get会自动检测依赖关系,如果机器上没有安装libmemcached,则会自动安装之。
所以,使用apt-get的话,直接安装php5-memcached即可。
自己手动安装,则需要自己解决依赖关系等。
关于配置文件
--------------
按照最初参考的博文以及手册所言,应该在安装好libmemcached库和PHP的memcached模块之后,再手工编辑php.ini文件,增加如下一行
extension=memcached.so
但是,我分别编辑了两个php.ini文件,却发现对模块的加载基本上没有任何影响。
后来发现,使用apt-get install php5-memcached时,会在/etc/php5/conf.d/目录下产生一个子配置文件memcached.ini。
这个文件中这么一行:
extension=memcached.so
当使用apt-get remove php5-memcached时,又会自动将此行注释掉。
安装完毕,开始试用
=========================================
ini_set("display_errors", 1);
/* 创建一个Memcached对象 */
$mcd = new Memcached();
/* 添加一个服务器到服务器池中
* Memcached支持分布式缓存,可以指定多个缓存服务器
* 每个服务器用一个服务器key确定
*/
$mcd->addServer('localhost', 11211);
/* set()方法,向缓存中存入一个键值对 */
var_dump($mcd->set('name', 'laruence'));
/* add()方法,向缓存中添加一个键值对,类似set()方法,
* 但是,如果要添加的key已经存在,则添加失败
*/
var_dump($mcd->add('gend', 'male'));
var_dump($mcd->add('gend', 'female'));
$arr = array('a', 'b', 'd', 'e');
var_dump($mcd->set('array', $arr));
echo '
';
';
/* 向已经存在的键值对的值添加一段字符串,当 Memcached::OPT_COMPRESSION开启时,添加将失败 */
$mcd->append('name','.Wu');
/* 从缓存中提取一个键值对 */
var_dump($mcd->get('name'));
var_dump($mcd->get('gend'));
var_dump($mcd->get('array'));
/* 由于memcached支持分布式存储,以上方法都有一个对应的可以指定服务器的版本 xxxByKey() */
echo '
';
';
/* 获取当前服务器池中的服务器列表 */
var_dump($mcd->getServerList());
echo '
';
';
/* 获取当前的服务器统计信息 */
var_dump($mcd->getStats());
/* 还有一个有特点的方法此处没有演示 cas()方法,compare and set
* 改方法可以解决多服务器读写的问题
*/
?>
初识memcached暂到此。