yii中使用memcache的实例分享

发布时间:2020-08-27编辑:脚本学堂
在php框架yii中使用memcache的方法,分享几个小例子,有需要的朋友参考下。

在yii中可以很方便的使用memcache配置。
在main.php的components中加入cache配置:

array(  
    'components'=>array(  
  
        'cache'=>array(  
            'class'=>'CMemCache',  
            'servers'=>array(  
                array(  
                    'host'=>'server1',  
                    'port'=>11211,  
                    'weight'=>60,  
                ),  
                array(  
                    'host'=>'server2',  
                    'port'=>11211,  
                    'weight'=>40,  
                ),  
            ),  
        ),  
    ),  
)

说明:
1)class指明所有缓存类,CMemCache即为memcache
2) 当要使用多个cache轮询时,可以给每个cache配权重(weight)。如果只有一个cache,不加这个配置就可以了。

二,使用
调用memcache的方法:

<?php
$key = 'people';   
$value = json_encode(array('name'=>'ball', 'age'=>'male'));   
$expire = 10;   
yii::app()->cache->set($key, $value, $expire);   
Yii::app()->cache->get($key);   
Yii::app()->cache->delete($key);  
?>

更多api请参阅yii手册CMemCache部分。

三,问题
当你统一使用yii的扩展对memcache进行存取时,不会有什么问题。但现实中会有这么一种情况:你在使用yii开发后台,但前台的同学并未用yii,而是使用了原生的memcache api对数据进行操作。这时会遇到一些问题。
如上文二中的例子,如果使用原生的memcache api,Memcache::get,用people作key是取不到值的!
原因是,yii的set对key和value都做了处理。默认情况下,对key加前缀并做md5变换,对value进行serialize()。这就难怪使用Memcache::get('people')取不到值了。

解决:
简单的方法,可以通过配置,让yii的memcache扩展不进行额外的"小动作"。

<?php
'cache' => array(      
    'class' => 'system.caching.CMemCache',   
    'servers' => array( array('host' => '127.0.0.1', 'port' => 11211)),  
    'keyPrefix' => '',   
    'hashKey' => false,   
    'serializer' => false)   
?>

其中:
keyPrefix:key的前缀,默认用CApplication::getId()方法生成。
hashKey:对key进行hash操作,默认md5
serializer:value的序列化方法,默认serialize
将这些都置空,扩展的行为就同原生Memcache一致了。

四,更多memcache方法调用
yii扩展中,只有memcache的最常用操作,并没有类似原生memcache的decrement和increment等操作。
不过可以使用扩展中的getMemCache方法获得原生memcache对像,然后就可以使用原生方法了。

<?php
$mem = Yii::app()->cache->getMemCache();  
$res = $mem->decrement($key);  
?>

使用原生方法时,最好设置上文(三)中提到的配置,不然同时使用yii的扩展方法和memcache的原生方法会产生错误。