PHP模块 Memcached功能多于Memcache

 更新时间:2011年06月14日 22:44:04   作者:  
PHP搭配Memcached已经是妇孺皆知的标配了。再提似乎让人觉得太“圡”了,不过有一些细节不见得人人都清楚
比如说PECL里有两个Memcached的模块,MemcacheMemcached,目前大部分PHP环境里使用的是名字里不带d的Memcache版本,这个版本释出的比较早,是一个原生版本,与之对应的带d的Memcached版本则是建立在libmemcached的基础上,所以说Memcached版本的功能更全一些。

安装Memcached版本的PHP模块

wget http://download.tangent.org/libmemcached-0.35.tar.gz
tar zxf libmemcached-0.35.tar.gz
cd libmemcached-0.35
./configure
make
make install

wget http://pecl.php.net/get/memcached-1.0.0.tgz
tar zxf memcached-1.0.0.tgz
cd memcached-1.0.0
phpize
./configure
make
make install

打开php.ini加上:

extension = "memcached.so"

这样安装就结束了,你可以通过下列命令来确认:

php -m | grep mem

演示Memcached版本的新功能

先虚构一个问题,假设counter初始值是一个整数,不使用increment方法,通过get/set完成每次加一。

在Memcache版本里,我们只能按照大致如下的方式来进行:

$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);

由于get/set这两个动作无法作为一个原子来操作,所以当多个进程同时处理时,会出现丢失的可能,更让人恼火的是,你根本就不知道什么时候出现丢失。

再看看Memcached版本里,我们是如何做的:

$md = new Memcached();
$md->addServer('localhost', 11211);
$v = $md->get('counter', null, $token)
$md->cas($token, 'counter', $v + 1);

cas是Memcached版本里提供的功能,说白了就是一个乐观锁的功能,如果你把$token的值var_dump出来,就会发现$token其实就是一个版本号,如果通过get得到的$token版本号在cas的时候不对应,就说明已经有别的操作更新了,此时cas操作会失败,至于如何继续操作,就看你自己了。

注:如果你想手动重现一下冲突的情况,可在get和cas之间sleep若干秒,并拷贝两份脚本,先后执行。

顺便说一句,推荐的Memcached版本模块的哈希设置如下:

$md->setOption(Memcached::OPT_DISTRIBUTION, Memcached::DISTRIBUTION_CONSISTENT);
$md->setOption(Memcached::OPT_HASH, Memcached::HASH_CRC);

总结

Memcached版本还有很多Memcache没有的功能,比如通过getByKey, setByKey等自动支持多个服务器,就不赘述了,该用哪个扩展已经不言自明了。

补充:http://code.google.com/p/memcached/wiki/PHPClientComparison

相关文章

  • php中获得视频时间总长度的另一种方法

    php中获得视频时间总长度的另一种方法

    当时获得视频长度是采用网上的通用的获得flv视频文件长度的方法,但是这个方法只对flv视频支持,其他格式的视频获取到的值就很差了
    2011-09-09
  • PHP Post获取不到非表单数据的问题解决办法

    PHP Post获取不到非表单数据的问题解决办法

    这篇文章主要介绍了PHP Post获取不到非表单数据的问题的解决办法以及代码分享,需要的朋友参考下。
    2018-02-02
  • php数组函数array_key_exists()小结

    php数组函数array_key_exists()小结

    本文给大家汇总介绍了php数组函数array_key_exists()的相关知识以及与in_array的性能对比,与isset的区别分析,非常的详细,有需要的小伙伴可以参考下。
    2015-12-12
  • PHPCMS的使用小结

    PHPCMS的使用小结

    前段时间仔细看了一下PHPCMS这套开源的系统,实现了程序与模板分离,觉得写得真的不错。本人很少关注开源系统,尤其是PHP的,觉得PHP本身就是一个宠大的函数库,不过几千个系统函数确实解决了不少问题。
    2010-09-09
  • discuz程序的PHP加密函数原理分析

    discuz程序的PHP加密函数原理分析

    康盛的 authcode 函数可以说对中国的PHP界作出了重大贡献。包括康盛自己的产品,以及大部分中国使用PHP的公司都用这个函数进行加密,authcode 是使用异或运算进行加密和解密。
    2011-08-08
  • php简单日历函数

    php简单日历函数

    这篇文章主要介绍了php简单日历函数,没有选择比较常见的用js生成的日历,而是用php输出了一个日历表格,感兴趣的小伙伴们可以参考一下
    2015-10-10
  • PHP获取域名的方法和技巧

    PHP获取域名的方法和技巧

    在Web开发中,获取域名相关信息,是一项必备的能力,而PHP天生地具有解析URI的能力,所以PHP获取域名也变得非常简单,在这里整理了一些,PHP获取域名的方法和技巧,需要的朋友可以参考下
    2023-08-08
  • php通过淘宝API查询IP地址归属等信息

    php通过淘宝API查询IP地址归属等信息

    这篇文章主要介绍了php通过淘宝API查询IP地址归属等信息的相关资料,需要的朋友可以参考下
    2015-12-12
  • PHP输入流php://input介绍

    PHP输入流php://input介绍

    在使用xml-rpc的时候,server端获取client数据,主要是通过php输入流input,而不是$_POST数组。所以,这里主要探讨php输入流php://input
    2012-09-09
  • php计算指定目录下文件占用空间的方法

    php计算指定目录下文件占用空间的方法

    这篇文章主要介绍了php计算指定目录下文件占用空间的方法,实例分析了php操作目录及文件的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03

最新评论