version 0.1 发布 version 0.2 更新了关于二进制的描述,测试了下二进制支持,貌似扩展有bug,待验证。
###什么是memcached 通常来说,我所指的是memcached服务端程序。 memcached是一套缓存系统,当初是Danga Interactive为了LiveJournal所发展的,但被许多软件(如MediaWiki)所使用。这是一套开放源代码软件,以BSD license授权协议发布。
注意:memcached不能算是分布式缓存系统,因为每个缓存节点之间是相互不可感知的,要实现分布式缓存需要借助客户端实现,而实现分布式缓存的关键在于katama算法。
memcached缺乏认证以及安全管制,这代表应该将memcached服务器放置在防火墙后。
目前暂时略过memcached服务端的问题,主要来谈下php关于memcached服务器的扩展相关问题(即客户端)。
###关于php的memcache扩展 目前来说,大家所知的扩展是两个,一个是memcache扩展下载,一个是memcached扩展下载。 为了区分,通常我称呼两个扩展分别为:php-memcache和php-memcached。 PS:因为扩展名字的问题,总是有一些初学者把memcache扩展、memcached扩展和memcached服务搞混。
###关于两个php扩展的区别 很多人也上网搜过,每个人的说法都不尽相同,不过大部分还是认为:
memcache是完全在PHP框架内开发的,memecached是使用libmemcached的
memcached的方法比memcache的方法丰富
memached只支持OO接口,而 memcache则是OO和非OO两套接口并存
memcached 实现了更多的 memcached 协议
memcached 支持 Binary Protocol,而 memcache 不支持
大部分人都这么说,可能也因为网上在资料比较老旧的原因。而且官方手册更新也落后。 这些观点,有对也有错。以php-memcache来说,最新的版本是2013-04-07发布的3.0.8 beta。而php-memcache的Changelog 从3.0.0 alpha (2007-11-26) 就已经支持 Binary Protocol了。*关于二进制这块貌似有点bug。抽时间看下。
所以,不要信网上说的,手册有时候也不靠谱。后面我会讲。当然,我说的也不一定靠谱,都是一家之言。还是鼓励大家看源码。C语言看不懂,注释总可以看懂吧。
###关于php-memcache的两个类。 为什么说是两个类呢?不是就一个 new Memcache() 么? 其实还有一个很少人会用到的new MemcachePool() 类。当然手册上也没写,最新版的英文手册我也没看到。 不看源码是不知道还有这么个东东的。 关于Memcache和MemcachePool的区别。
字面意思理解可能觉得MemcachePool是持久链接,有连接池的那种。事实上,两个类都支持持久链接。 他们的区别: Memcache类只支持tcp链接,addServer方法支持failure_callback,连接缓存服务器的时候遇到错误,可以执行回调函数,摘掉故障缓存机。相关代码
mmc = php_mmc_pool_addserver(mmc_object, host, host_len, tcp_port, 0, weight, persistent, timeout, retry_interval, status, &pool TSRMLS_CC);
if (mmc == NULL) {
RETURN_FALSE;
}
if (failure_callback != NULL && Z_TYPE_P(failure_callback) != IS_NULL) {
php_mmc_set_failure_callback(pool, mmc_object, failure_callback TSRMLS_CC);
}
MemcachePool类支持tcp和udp。 相关代码
mmc = php_mmc_pool_addserver(mmc_object, host, host_len, tcp_port, udp_port, weight, persistent, timeout, retry_interval, status, NULL TSRMLS_CC);
if (mmc == NULL) {
RETURN_FALSE;
}
RETURN_TRUE;
MemcachePool类的connect方法支持weight 、timeout、retry_interval(服务器连接失败时重试的间隔时间) MemcachePool类没有pconnect方法。
主要差异就在connect、pconnect和addServer三个函数上。
关于MemcachePool类使用UDP的例子: 启动memcached服务端时 /usr/local/bin/memcached -d -m 256m -u root -p 11211 -U 11212 -U 就是打开UDP监听端口。以上参数仅供参考。
$mem = new MemcachePool();
/** {{{ proto bool MemcachePool::addServer(string host [, int tcp_port [, int udp_port [, bool persistent [, int weight [, double timeout [, int retry_interval [, bool status] ] ] ] ]) **/
$mem->addServer('192.168.1.100', 11211, 11212);
$mem->add('key:1', 'value1', false, 274900);
var_dump($mem->get('key:1'));
源码里注释还是很清楚的。