在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 相关文章推荐
PHP中集成PayPal标准支付的实现方法分享
Feb 06 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 PHP
php和javascript之间变量的传递实现代码
Dec 19 PHP
PHP实现数字补零功能的2个函数介绍
May 12 PHP
ThinkPHP实现将本地文件打包成zip下载
Jun 26 PHP
php保存二进制原始数据为图片的程序代码
Oct 14 PHP
Thinkphp中volist标签mod控制一定记录的换行BUG解决方法
Nov 04 PHP
PHP使用星号隐藏用户名,手机和邮箱的实现方法
Sep 22 PHP
PHP网站自动化配置的实现方法(必看)
May 27 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
PHP图片水印类的封装
Jul 06 PHP
Laravel 队列使用的实现
Jan 08 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
别人整理的服务器变量:$_SERVER
2006/10/20 PHP
php中将字符串转为HTML的实体引用的一个类
2013/02/03 PHP
yii2中使用Active Record模式的方法
2016/01/09 PHP
Laravel6.18.19如何优雅的切换发件账户
2020/06/14 PHP
js no-repeat写法 背景不重复
2009/03/18 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
两种方法实现在HTML页面加载完毕后运行某个js
2014/06/16 Javascript
浅谈JS函数定义方式的区别
2016/10/30 Javascript
JS中setTimeout和setInterval的最大延时值详解
2017/02/13 Javascript
基于对象合并功能的实现示例
2017/10/10 Javascript
vue点击页面空白处实现保存功能
2019/11/06 Javascript
angular异步验证防抖踩坑实录
2019/12/01 Javascript
vue样式穿透 ::v-deep的具体使用
2020/06/04 Javascript
JavaScript实现滑块验证解锁
2021/01/07 Javascript
vue-router懒加载的3种方式汇总
2021/02/28 Vue.js
VUE实现吸底按钮
2021/03/04 Vue.js
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
查看Python依赖包及其版本号信息的方法
2019/08/13 Python
通过selenium抓取某东的TT购买记录并分析趋势过程解析
2019/08/15 Python
用Python将Excel数据导入到SQL Server的例子
2019/08/24 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
python之pygame模块实现飞机大战完整代码
2020/11/29 Python
伦敦所有西区剧院演出官方票务代理:Theatre Tickets Direct
2017/05/26 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
汉米尔顿手表官网:Hamilton
2020/09/13 全球购物
C语言基础笔试题
2013/04/27 面试题
少年闰土教学反思
2014/02/22 职场文书
买卖车协议书
2014/04/21 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
世界水日宣传活动总结
2015/02/09 职场文书
公司行政管理制度范本
2015/08/05 职场文书
python pygame入门教程
2021/06/01 Python
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android