总结
源码编译方式的软件安装三部曲:
1、下载(找官网)、解压、进入解压后的目录
2、编译参数
3、make && make install安装
php扩展安装舞步曲:
1、下载(找pecl)、解压、进入解压后的目录
2、使用php自带的二进制脚本phpize弄成可编译的
3、编译参数
4、make && make install安装
5、将扩展添加到php.ini中,重启php,看php -m中是否添加成功
redis和memcache的区别:memcache
什么是memcache:
分布式高速缓存系统。可以在多台服务器安装就是分布式,可以在达到很好的集群效果
是应用和数据库中间的缓冲层:第1次走数据库,然后存到memcache中,之后就从memcache读取(当然会涉及到是否过期等问题)
我的理解:memcache是一张只有2个字段的表。Key(id)和value(值)字段
在什么时候使用memcache:
1、非持久化存储:对数据存储要求不高(断电或服务器重启会给内存清空)
2、分布式存储:不适合单机使用(因为很吃内存,非要单机的话,专门找个服务器做memcache。不要将数据库和memcahe装在同一台服务器)
3、key/value存储:格式简单、不支持list、array等数据格式
知道怎样使用memcache优化网站或api:
定期查看缓存的分布情况和击中情况,根据查询结果进行优化
项目中使用memcache:
1、既时生成缓存适用于:新闻、详情页等静态资源页。第1个用户进来的时候生成缓存,在进来的n个人就直接走缓存。设置个时间,当过了1星期,可以直接在缓存中删除
2、提前生成缓存适用于:首页。访问量较大,数据量又比较多的情况。使用linux定时脚本的方式提前生成缓存
3、永久缓存适用于:关于我们,这种单独的页面,修改频率相当低,只有当修改了,才从新生成缓存
使用memcache的思路:
以及时生成缓存为例:
思路:先查询memcache中有没有对应的缓存(就是判断属性中有无)。
有就返回。
没有就查询,查询的时候设置一份存到属性中。
每次新增数据成功以后,删掉旧的缓存
安装:
我的环境是阿里云ecs,centos7.2的,装的一键lnmp
安装服务端
官网: http://memcached.org/
wget http://www.memcached.org/files/memcached-1.5.5.tar.gz //1、下载
tar xf memcached-1.5.5.tar.gz //2、解压
cd memcached-1.5.5 //切换进入解压目录
yum install libevent-devel -y //安装依赖
./configure --prefix=/usr/local/Memcached //3、编译参数
make && make install //4、安装
启动:
注意:memcache没有配置文件,所以要在启动中输入
./memcached -u root -p 11211 -P /var/run/memcached.pid -d #此启动所有的ip都可以连接
/usr/local/Memcached/bin/memcached -u root -p 11211 -P /var/run/memcached.pid -l ip -d
-u 指定运行用户(线上最好不要经常使用root)
-p运行端口(小写),最好是1024以上的端口
-P pid文件(大写)
-d 守护进程 daemon 运行
-l memcache服务器的内网ip才可登陆,指定一个ip(用本机)
-m 为memcache分配多少内存,单位兆(配置低分150)
-c是最大运行的并发连接数,默认是1024;
连接测试:
![](https://i-blog.csdnimg.cn/blog_migrate/c67cbf7c16b0e4517c4bad6f6a23e091.png)
telnet 127.0.0.1 11211 #ip输入 上面-l的参数
set key 0 0 5 //存数据
hello
get key //取数据
quit #退出telnet
注意:重启后memcached数据丢失
安装扩展
http://pecl.php.net 扩展都在这里下载
memcached extension | |
PHP extension for interfacing with memcached via libmemcached library |
第1个是完全在PHP框架内开发的memcache(php手册中的)
第2个是使用libmemcached的memecached(推荐用这个,性能更好)
wget http://pecl.php.net/get/memcached-3.0.0.tgz //1、下载
tar xf memcached-3.0.0.tgz //解压
cd memcached-3.0.0 //切换进解压后的目录
/usr/local/php/bin/phpize //2、二进制脚本工具,使用这工具后就可以编译参数了
yum install libmemcached-devel –y //安装依赖
./configure --with-php-config=/usr/local/php/bin/php-config //3、编译参数
make && make install //4、安装
配置 php.ini
extension_dir = /usr/local/php/lib/php/extensions/no-debug-non-zts-20160303/ #所有扩展基本都在这个目录下,这个目录引入一次即可
extension = memcached.so //5、将扩展添加到配置文件中
结果:
重启服务器
输入php -m 查看扩展
memcache类的操作和封装
1、系统类
因为这个服务器是不存在的
2、数据类
3、优雅快速的使用memcache
4、封装自己类的总结
1、扩展性 2、可调试 3、尽量简便的操作,一个方法多种功能(用swtich判断,调不同的方法)
<?php
/**
* 封装自己的memcache类
* 封装的目的是为了切换缓存引擎, 比如改用redis, 开发中使用的类调用的方法名一样,但是内部实现调用的是不同的引擎(工厂模式的思想)。
*/
class Mem{
private $type = 'Memcached';
private $m; //实例化的对象
private $time = 0; //缓存时间
private $error; //错误
private $debug = 'true';
public function __construct()
{
if(!class_exists($this->type)){
$this->error = $this->type.'类不存在';
return false;
}else{
$this->m = new $this->type;
}
}
/**
* 添加多台服务器
* @param $arr 是个二维数组
*/
public function ads($arr){
$this->m->addServers($arr);
//如果返回结果是一个对象,并且对象某个属性的值还对,就是添加成功
}
/**
* 思想:传不同的参数,调用同一个方法,实现不同的功能
* @param $key
* @param $value
* @param $time
*/
public function s($key,$value='',$time=null){
//传过来的参数是1个,那就是get方法
if(func_num_args() == 1){
//注意:这里不用$this->debug,是因为默认为true直接就进if然后return了,然后下面就不会执行了,所以他打印不出来
return $this->m->get($key); //【查】
//注意:加这也没效果,上面有return也是直接返回了。不知道老师是get方法中加debug是啥意思??
} else if(func_num_args() >= 2){
if($value === null){
$this->m->delete($key); //【删】
}else{
if($time === null){
$time = $this->time; //用属性中缓存的时间
}
$this->m->set($key,$value,$time); //【加】
return $this->debug(); //注意:这到无所谓,顶多上面执行完咯,有错误返回错误。但也要调用s方法得时候用echo输出下
}
}
}
private function debug(){
//开启调试模式才返回错误信息
if($this->debug){
if($this->m->getResultCode() != 0){
return $this->m->getResultMessage(); //直接返回错误信息
}
}
}
/**
* 错误处理的方法
*/
public function getError(){
if($this->error){
return $this->error;
}else{
return $this->m->getResultMessage();
}
}
}
调用方法:用浏览器访问,方便看
<?php
/**
* 调用自己封装的memcache类
* 封装的目的是为了切换缓存引擎, 比如改用redis, 开发中使用的类一样,但是内部实现调用的是不同的引擎。
*/
//思想:传不同的参数,调用同一个方法,实现不同的功能
include 'Mem.php';
$obj = new Mem();
$obj->ads([['127.0.0.1',11211]]); //添加服务器
$obj->s('h1','yangxi',0); //传3个参数是set【设置】
//$obj->s('h1',null); //传2个参数是delete【删除】
echo $tmp = $obj->s('h1'); //传1个参数是get【获取】
echo "<br />";
echo $obj->getError(); //获取错误