在Mac OS的PHP环境下安装配置MemCache的全过程解析


Posted in PHP onFebruary 15, 2016

安装服务端
memcache是项目名,而在服务端的驻留进程叫memcached(linux的守护进程一般都是在后面加个d)。在OSX下使用brew可以快速安装memcache:

$ sudo brew install memcached

memcache的依赖:openssl和libevent会自动下载并安装。

安装完成后,使用如下命令启动:

$ sudo memcached -m 32 -p 11211 -d

安装php扩展
使用php操作memcache前,需要安装php的扩展,php的扩展有两个可以选择memcache和memcached,这里就安装比较经典的前者。从这里选择一个版本下载源码压缩包,解压,进入到源码目录后执行:

$ sudo phpize

phpize是帮助用来在已编译好的php外,编译php扩展用的脚本,用来生成configure、make等文件。有时执行这个命令会报错:

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

缺少依赖,那就安装咯,还是使用brew:

$ sudo brew install autoconf
phpize完成后,依次实行如下命令实现编译和安装:

$ sudo ./configure
$ sudo make
$ sudo make install

编译好的memcache.so一般被安装到如下目录:

Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-xxxxxx/

这样就可以在php.ini中配置这个扩展了:

extension=/usr/lib/php/extensions/no-debug-non-zts-xxxxxx/memcache.so

打开phpinfo()页面,查看memcache是否已经加载成功:

在Mac OS的PHP环境下安装配置MemCache的全过程解析

设置yii
这样其实已经可以在php中直接使用memcache了,这里就不累述了,如果在yii中使用,则需要添加一个组件:

'components'=>array(

  'cache'=>array(
    'class'=>'CMemCache',
    'servers'=>array(
      array(
        'host'=>'127.0.0.1',
        'port'=>11211
      )
    ),
  ),
...

关于更多的yii配置请参阅其文档。最后,在yii中使用memcache:

Yii::app()->cache->set('key1','value1');
Yii::app()->cache->get('key1');

memcached使用示例
将纯粹使用数据库查询的代码加上memcached支持是很简单的,假设这是原来的代码:

function get_foo (int userid) {
  result = db_select("SELECT * FROM users WHERE userid = ?", userid);
  return result;
}

加上memcached的缓存机制后:

function get_foo (int userid) {
  result = memcached_fetch("userrow:" + userid);
  if (!result) {
    result = db_select("SELECT * FROM users WHERE userid = ?", userid);
    memcached_add("userrow:" + userid, result);
  }
  return result;
}

上述的程序会先到memcached检查是否有userrow:userid的数据,如果有则直接传回结果,如果不存在时再去数据库查询,并将结果放到memcached内。

在memcached内已经有缓存信息时将数据库的数据更新后,上述的程序会抓到旧的数据,这是属于Cache coherency的问题。其中一种解决的方法是在更新数据库时,同时更新memcached内的信息:

function update_foo(int userid, string dbUpdateString) {
  result = db_execute(dbUpdateString);
  if (result) {
    data = createUserDataFromDBString(dbUpdateString);
    memcached_set("userrow:"+userid, data);
  }
}
PHP 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
php 表单数据的获取代码
Mar 10 PHP
常用的PHP数据库操作方法(MYSQL版)
Jun 08 PHP
深入php处理整数函数的详解
Jun 09 PHP
php 修改、增加xml结点属性的实现代码
Oct 22 PHP
如何让CI框架支持service层
Oct 29 PHP
PHP数组函数array_multisort()用法实例分析
Apr 02 PHP
php 流程控制switch的简单实例
Jun 07 PHP
PHP读取Excel类文件
May 15 PHP
PhpStorm本地断点调试的方法步骤
May 21 PHP
PHP实现的文件浏览器功能简单示例
Sep 12 PHP
thinkphp 5框架实现登陆,登出及session登陆状态检测功能示例
Oct 10 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 #PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
Feb 15 #PHP
PHP扩展迁移为PHP7扩展兼容性问题记录
Feb 15 #PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
Feb 15 #PHP
在Mac OS上搭建PHP的Yii框架及相关测试环境
Feb 14 #PHP
php socket通信(tcp/udp)实例分析
Feb 14 #PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 #PHP
You might like
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php微信公众平台开发之微信群发信息
2016/09/13 PHP
PHP中串行化用法示例
2016/11/16 PHP
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
Jquery 动态生成表格示例代码
2013/12/24 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
js中各种类型的变量在if条件中是true还是false
2014/07/16 Javascript
js获取内联样式的方法
2015/01/27 Javascript
JavaScript中的splice()方法使用详解
2015/06/09 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
解决nodejs中使用http请求返回值为html时乱码的问题
2017/02/18 NodeJs
微信小程序中使用javascript 回调函数
2017/05/11 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
JS沙箱模式实例分析
2017/09/04 Javascript
浅谈es6 javascript的map数据结构
2017/12/14 Javascript
利用Console来Debug的10个高级技巧汇总
2018/03/26 Javascript
vue兄弟组件传递数据的实例
2018/09/06 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[05:06]DOTA2-DPC中国联赛 正赛 VG vs Magma选手采访
2021/03/11 DOTA
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Python多线程原理与用法实例剖析
2019/01/22 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
Python Numpy 控制台完全输出ndarray的实现
2020/02/19 Python
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
数据库连接池的工作原理
2012/09/26 面试题
会计的岗位职责
2014/03/15 职场文书
班主任寄语大全
2014/04/04 职场文书
2014年酒店年度工作总结
2014/12/10 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android