php-memcache扩展分析(一)

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扩展的区别 很多人也上网搜过,每个人的说法都不尽相同,不过大部分还是认为:

  1. memcache是完全在PHP框架内开发的,memecached是使用libmemcached的
  2. memcached的方法比memcache的方法丰富
  3. memached只支持OO接口,而 memcache则是OO和非OO两套接口并存
  4. memcached 实现了更多的 memcached 协议
  5. 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,连接缓存服务器的时候遇到错误,可以执行回调函数,摘掉故障缓存机。相关代码

<!-- lang: cpp -->
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。 相关代码

<!-- lang: c -->
    	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监听端口。以上参数仅供参考。

<!-- lang: php -->
$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'));

源码里注释还是很清楚的。

转载于:https://my.oschina.net/imoses/blog/357304

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值