在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 25 PHP
常用的php ADODB使用方法集锦
Mar 25 PHP
PHP采集相关教程之一 CURL函数库
Feb 15 PHP
PHP多个版本的分析解释
Jul 21 PHP
PHP中的错误处理、异常处理机制分析
May 07 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
Laravel 4 初级教程之Pages、表单验证
Oct 30 PHP
php实现对象克隆的方法
Jun 20 PHP
php文件系统处理方法小结
May 23 PHP
PHP+Apache实现二级域名之间共享cookie的方法
Jul 24 PHP
laravel 实现划分admin和home 模块分组
Oct 15 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
上海无线电三厂简史修改版
2021/03/01 无线电
福利彩票幸运号码自动生成器
2006/10/09 PHP
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
2018/10/15 PHP
通用JS事件写法实现代码
2009/01/07 Javascript
理解JavaScript变量作用域更轻松
2009/10/25 Javascript
jQuery 源码分析笔记(7) Queue
2011/06/19 Javascript
JavaScript中document对象使用详解
2015/01/06 Javascript
node.js操作mongodb学习小结
2015/04/25 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
javascript 操作cookies详解及实例
2017/02/22 Javascript
js导出Excel表格超出26位英文字符的解决方法ES6
2017/11/15 Javascript
nodeJS模块简单用法示例
2018/04/21 NodeJs
node基于puppeteer模拟登录抓取页面的实现
2018/05/09 Javascript
实现Vue的markdown文档可以在线运行的方法示例
2018/12/11 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
2020/08/11 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
利用Python为iOS10生成图标和截屏
2016/09/24 Python
在python中利用GDAL对tif文件进行读写的方法
2018/11/29 Python
pyqt5 实现工具栏文字图片同时显示
2019/06/13 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
使用pandas 将DataFrame转化成dict
2019/12/10 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
Prototype中如何为一个元素添加一个方法
2014/12/08 面试题
网上蛋糕店创业计划书
2014/01/24 职场文书
简历的自我评价范文
2014/02/04 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
Python+Appium自动化测试的实战
2021/06/30 Python
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技
Win11 Dev 预览版25174.1000发布 (附更新修复内容汇总)
2022/08/05 数码科技