PHP搭配Memcached已经是妇孺皆知的标配了。再提似乎让人觉得太“圡”了,不过有一些细节不见得人人都清楚,比如说PECL里有两个Memcached的模块,Memcache和Memcached,目前大部分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
今天安装libmemcached安装时出错。找了下原因得到解决方法
报错片断
----------------------------------------------------------------------------------------------------------
CC clients/ms_stats.o
CC clients/ms_task.o
CC clients/ms_thread.o
CCLD clients/memslap
clients/ms_conn.o: In function `ms_get_
udp_request_id':
/var/go2packages/libmemcached-0.37/clients/ms_conn.c:184: undefined reference to `__sync_fetch_and_add_4'
clients/ms_conn.o: In function `ms_reconn_socks':
/var/go2packages/libmemcached-0.37/clients/ms_conn.c:1055: undefined reference to `__sync_fetch_and_add_4'
clients/ms_conn.o: In function `ms_reconn':
/var/go2packages/libmemcached-0.37/clients/ms_conn.c:924: undefined reference to `__sync_fetch_and_add_4'
/var/go2packages/libmemcached-0.37/clients/ms_conn.c:960: undefined reference to `__sync_fetch_and_add_4'
clients/ms_thread.o: In function `ms_setup_thread':
/var/go2packages/libmemcached-0.37/clients/ms_thread.c:215: undefined reference to `__sync_fetch_and_add_4'
clients/ms_thread.o:/var/go2packages/libmemcached-0.37/clients/ms_thread.c:198: more undefined references to `__sync_fetch_and_add_4' follow
collect2: ld returned 1 exit status
make[2]: *** [clients/memslap] Error 1
make[2]: Leaving directory `/var/go2packages/libmemcached-0.37'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/var/go2packages/libmemcached-0.37'
make: *** [all] Error 2
--------------------------------------------------------------------------------------------------------------------------
解决方法:
./configure --disable-64bit CFLAGS="-O3 -march=i686"
分享到:
相关推荐
压缩包内包含: memcached-1.2.4.rar php_memcache-5.2-vc6-nts.rar ...php_memcache 是 PHP的扩展模块; memcached 是 php_memcache 的支持; nts 表示没有Not Thread Safety(非线程安全) vc6 表示使用 vc6.0 编译
比如说PECL里有两个Memcached的模块,Memcache和...安装Memcached版本的PHP模块wget http://download.tangent.org/libmemcached-0.35.tar.gztar zxf libmemcached-0.35.tar.gzcd libmemcached-0.35./configuremak
memcache:http://cn2.php.net/manual/en/book.memcache.php memcached:http://cn2.php.net/manual/en/book.memcached.php 2.Memcache是原生实现的,支持OO和非OO两套接口并存。而memcached是使用libmemcached
增加一行extension=php_memcache.dll memcached.exe添加为系统服务启动 ===================== 作为学习和开发之用已经非常完美了,现在PHP官方也已经停止更新php5.2系列,所以升级自己的继承环境已经是势在必行的...
memcache_php_cpanel 将Memcache PHP模块添加到cPanel EasyApache 上游模块: : 重要的是要注意,这只会安装PHP模块。 如果要连接到本地memcached服务器,则需要单独安装memcached。 如今,在大多数任何Linux发行版...
网上广泛流传着一篇文章,讲述php的两个扩展模块memcache和memcached的区别,其中特意强调了memcached与memcached一个很大的区别是memcached模块不支持长连接。以至于后来很多年我都认为memcached是不支持长连接的,...
php memcache[windows]用法实例,记得先将php_memcache.dll文件拷贝至php相应dll文件目录,配置好php.ini文件的memcache模块,运行程序前先运行memcached.exe文件。
web服务器的php session都给memcached ,这样你不管分发器把 ip连接分给哪个web服务器都不会有问题了,配置方法很简单,就在php的配置文件内增加一条语句就可以了,不过前提你需要装好memcache模块 1.设置session用...
增加一行extension=php_memcache.dll memcached.exe添加为系统服务启动 ===================== 作为学习和开发之用已经非常完美了,现在PHP官方也已经停止更新php5.2系列,所以升级自己的继承环境已经是势在必行的...
用于 memcached 扩展的 Kohana 3.3 模块(不是 memcache)。 请参阅。 执照: 你自由了: 分享——复制、分发和传播作品 混音——改编作品 在以下条件下: 署名 - 您必须以作者或许可人指定的方式对作品进行...
memcache 扩展,PHP5.2、5.3、5.4、5.5、5.6, 32、64 位,以及其他版本下载地址
Memcache模块提供了于memcached方便的面向过程及面向对象的接口,memcached是为了降低动态web应用 从数据库加载数据而产生的一种常驻进程缓存产品。 下载memcache官网 PHP Memcache下载地址 另外附上64位memcache ...
1.添加扩展包 php_memcache.dll 2.在PHP.INI添加 extension=php_memcache.dll 3.程序 复制代码 代码如下: <?php //创建一个mem对象.../* if($mem->set(‘key1’,”beijing”,MEMCACHE_COMPRESSED,60)){
具体配置文件项在/app/configs下|-db.php 数据库(Mysql)配置文件|-memcache.php 缓存(Memcache)配置文件|-route.php 路由配置文件|-smarty.php 模版引擎配置文件|-system.php 系统配置文件系统配置结构为一维数组,...
PHP 5.6.23,查询目前最稳定的版本是memcache-2.2.7。 1.下载并解压缩。 wget http://pecl.php.net/get/memcache-2.2.7.tgz tar zxvf memcache-2.2.7.tgz 2. 编译。根据实际情况使用phpize和php-config。 [root@...
memcache的官方主页:http://pecl.php.net/package/memcachememcached的官方主页:http://pecl.php.net/package/memcached以下是我安装Memcached版本的PHP模块的过程记录:wget ...memcachedm
memcache/2.2.5 高性能的分布式的内存对象缓存系统客户端。 Zend Debugger/5.2.15 PHP程序调试器,跟踪、调试和分析PHP程序的运行状况。 UPUPW PHP探针 支持服务器信息检测,PHP组件检测,PHP已编译模块检测,...
缓存支持:auto、apc、sqlite、files、memcached、redis、wincache、xcache、memcache。auto:自动模式。 缓存第二驱动 当你现在代码中使用的是memcached,然后代码转移到一个新服务器且不支持memcached,这时候...