php-memcache扩展分析(一)

标签:

把之前在oschina上的博客搬运过来

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。抽时间看下。

关于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'));

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


评论已关闭