在yii中使用memcache

yii中可以很方便的使用memcache

一.配置
在main.php的components中加入cache配置

[php] view plaincopy

  1. array(
  2. ‘components‘=>array(
  3. ‘cache‘=>array(
  4. ‘class‘=>‘CMemCache‘,
  5. ‘servers‘=>array(
  6. array(
  7. ‘host‘=>‘server1‘,
  8. ‘port‘=>11211,
  9. ‘weight‘=>60,
  10. ),
  11. array(
  12. ‘host‘=>‘server2‘,
  13. ‘port‘=>11211,
  14. ‘weight‘=>40,
  15. ),
  16. ),
  17. ),
  18. ),
  19. )

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

二.使用
调用memcache的方法也很简单

[php] view plaincopy

  1. $key = ‘people‘;
  2. $value = json_encode(array(‘name‘=>‘ball‘, ‘age‘=>‘male‘));
  3. $expire = 10;
  4. yii::app()->cache->set($key, $value, $expire);
  5. Yii::app()->cache->get($key);
  6. 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] view plaincopy

  1. ‘cache‘ => array(
  2. ‘class‘ => ‘system.caching.CMemCache‘,
  3. ‘servers‘ => array( array(‘host‘ => ‘127.0.0.1‘, ‘port‘ => 11211)),
  4. ‘keyPrefix‘ => ‘‘,
  5. ‘hashKey‘ => false,
  6. ‘serializer‘ => false)

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

四.更多memcache方法调用
yii的扩展中,只有memcache的最常用操作,并没有类似原生memcache的decrement和increment等操作。如果想要作用这些方法怎么办呢?可以使用扩展中的getMemCache方法获得原生memcache对像,然后就可以使用原生方法了。

[php] view plaincopy

  1. $mem = Yii::app()->cache->getMemCache();
  2. $res = $mem->decrement($key);

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

时间: 2024-12-28 12:49:34

在yii中使用memcache的相关文章

yii计划任务中使用memcache一个小问题

在主程序里使用memcache存储了键值,Yii::app()->memcache->set("key", $value, 600); 在主程序里任何地方都可以使用Yii::app()->memcache->get("key");获取到 由于项目需要,需要建立计划任务执行一些动作,所以我也使用了yii的计划任务功能 很恶心的发现Command里写的代码获取不到memcache的信息,最后发现是键的keyprefix问题 解决办法一:在main

Yii Framework2.0开发教程(4)在yii中定义全局变量

在yii中定义全局变量最好的地方是入口脚本处.也就是web文件夹中的index.php文件 例如我们在defined('YII_ENV') or define('YII_ENV', 'dev');后写上 defined('ZYL_HEHE') or define('ZYL_HEHE','zhyoulun-hehe'); 并在我们教程(1)中建立的views/zhyoulun/helloworld.php文件中写上 <?php echo 'hello world!'; //全局变量 echo co

php-在php中使用memcache

<?php phpinfo(); ?> 查看电脑中的php是否已经安装memcache扩展. 如果没有: (1)php的安装路径找到ext文件夹 我的是 C:\wamp\bin\php\php5.5.12\ext 将下载的php_memcache.all文件放进去 (2)在php.ini配置文件中,加 extension=php_memcache.dll (3)重启服务器 我的出现了问题,参考的https://www.oschina.net/question/1254404_248665 用的

在php中使用Memcache

在上一篇博客中我写到了memcache的安装和管理,在这一篇博客中我将写到的是在php中如何使用memcache. 一.安装memcache扩展 首先我们通过phpinfo()函数查看一下我们当前的php环境是否支持memcache扩展,在服务器的根目录下新建一个文件info.php,在文件中写入 1 2 <?php     phpinfo(); 然后在浏览器中输入 http://localhost/info.php  访问,然后查找是否有memcache扩展,一般我们的服务器默认是没有安装me

YII 中的事务处理机制

$model=Post::model(); $transaction=$model->dbConnection->beginTransaction(); try{ $post=$model->findByPk(10); $post->title='new post title'; $post->save(); $transaction->commit(); }catch(Exception $e){ $transaction->rollBack(); } 摘至:h

yii中数据的"增删改查"相关工作!(此文比较乱,需细看)

使用findByPk()根据数据表主键查询的是对象,不需要使用foreach()循环出来 但是使用findall()和find()查询的是对象类型的数组需要使用foreach()循环出来 ======================================= public function getMinLimit () { $sql = "..."; $result = yii::app()->db->createCommand($sql); $query = $r

yii 中引入js 和css 的方式

在yii中 我们需要引入css 和 js 的时候,yii 自身有需要的类. 当我在views 视图层中引入css 和 js , <?php Yii::app()->clientScript->registerCssFile(Yii::app()->baseUrl .'/css/articleIndex.css');?> <?php Yii::app()->clientScript->registerScriptFile(Yii::app()->base

yii中第三方库

yii中存在一些路径别名:ext:表示包含了所有第三方扩展的目录  参考:http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.namespace yiic中第三方扩展使用http://www.yiiframework.com/extensions/?page=11

在yii中使用分页

yii中使用分页很方便,如下两种方法: 在控制器中: 1. $criteria = new CDbCriteria(); //new cdbcriteria数据库$criteria->id = 'id ASC'; //排序规则 $count = Exchange::model()->count($criteria); $pager = new CPagination($count); $pager->pageSize=30; $pager->applyLimit($criteria