在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 相关文章推荐
BBS(php & mysql)完整版(七)
Oct 09 PHP
php.ini 中文版
Oct 28 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
centos 5.6 升级php到5.3的方法
May 14 PHP
php strnatcmp()函数的用法总结
Nov 27 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
Jul 29 PHP
PHP附件下载中文名称乱码的解决方法
Dec 17 PHP
PHP session会话操作技巧小结
Sep 27 PHP
ThinkPHP简单使用memcache缓存的方法
Nov 15 PHP
PHP编程获取图片的主色调的方法【基于Imagick扩展】
Aug 02 PHP
Laravel框架Request、Response及Session操作示例
May 06 PHP
PHP const定义常量及global定义全局常量实例解析
May 28 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读取ACCESS数据到MYSQL的代码
2011/05/11 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
php基于闭包实现函数的自调用(递归)实例分析
2016/11/11 PHP
JS+PHP实现用户输入数字后显示最大的值及所在位置
2017/06/19 PHP
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
JS返回上一页实例代码通过图片和按钮分别实现
2013/08/16 Javascript
javascript结合Canvas 实现简易的圆形时钟
2015/03/11 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
js实现TAB切换对应不同颜色的代码
2015/08/31 Javascript
jQuery插件Echarts实现的双轴图效果示例【附demo源码下载】
2017/03/04 Javascript
Express之get,pos请求参数的获取
2017/05/02 Javascript
vuejs事件中心管理组件间的通信详解
2017/08/09 Javascript
ES6中新增的Object.assign()方法详解
2017/09/22 Javascript
原生js调用json方法总结
2018/02/22 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
谈谈node.js中的模块系统
2020/09/01 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
python中list常用操作实例详解
2015/06/03 Python
Python元字符的用法实例解析
2018/01/17 Python
python实现批量图片格式转换
2020/06/16 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Pytorch evaluation每次运行结果不同的解决
2020/01/02 Python
下载与当前Chrome对应的chromedriver.exe(用于python+selenium)
2020/01/14 Python
Python实例教程之检索输出月份日历表
2020/12/16 Python
html5的canvas方法使用指南
2014/12/15 HTML / CSS
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
C语言编程练习
2012/04/02 面试题
点菜员岗位职责范本
2014/02/14 职场文书
团代会开幕词
2015/01/28 职场文书
员工担保书范本
2015/09/22 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
总结Python使用过程中的bug
2021/06/18 Python