在之前搭建的lnmp架构中,nginx没有办法解析动态的内容,必须通过fastcgi调用外部的php,如果是静态资源,php直接运行代码,返回给用户,如果是动态资源,php连接数据库。再把结果返回给nginx.
试想一下,同一个php的页面,用户访问了很多次,那么就得通过fastcgi在php的解释器里运行很多次,但每次的结果是相同的。
我们可以只运行一次,但是将结果放在一个地方存储,等下一次相同的请求来临时,可以将事先存储的结果直接返回给nginx,不需要再通过php解析一次。
我们可以使用memcache存储php的执行结果。
memcache是什么
MemCache是一个自由、源码开放、高性能、分布式的内存对象缓存系统,用于动态Web应用以减轻数据库的负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度
MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储
MemCache虽然被称为"分布式缓存",但是MemCache本身完全不具备分布式的功能,MemCache集群之间不会相互通信。
(与之形成对比的,比如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据)
所谓的"分布式",完全依赖于客户端程序的实现
为什么使用memcache
memcache和memcached的区别
(1)MemCache是项目的名称
(2)MemCached是MemCache服务器端可以执行文件的名称
memcache的工作步骤
1.客户端把请求先发送给代理服务器(一般是nginx)
2.先检查客户端的请求数据是否在memcached中,如有,
直接把请求数据返回,不再对数据库进行任何操作
3.如果请求的数据不在memcached中,就去查数据库,
把从数据库中获取的数据返回给客户端
同时把数据缓存一份到memcached中(memcached客户端不负责,
需要程序明确实现)
4.每次更新数据库的同时更新memcached中的数据,保证一致性
5.当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
memcache+php的实现步骤
实验背景
在lnmp架构搭建成功的基础上
虚拟机server1(172.25.8.1) lnmp架构
真机 172.25.8.250 测试
在serevr1中,php增加memcache模块
1.将之前PHP编译完成的二进制命令加入到环境变量中,可以直接调用PHP命令
vim ~/.bash_profile 将php命令加入环境变量的配置文件当中,
也可以加入mysql命令
source ~/.bash_profile 使其生效
2.memcache目录中本来没有configure目录,没有直接编译,我们需要第三方去编译它
解压好memcache,进入目录,发现本来没有configure
安装时如果提示没有phpize,就根据报错下载autoconf
3.编译安装memcache
4.修改php主配置文件,增加两个模块
vim /usr/local/lnmp/php/etc/php.ini
将memcache缓存模块与php连接起来
加入 搜索extension_dir 在700多行 添加目录是安装memcache模块后生成的东西
加入: extension=memcache.so(这个模块以插件的形式运行)
4.重新加载php-fpm服务
etc/init.d/php-fpm reload重启php服务
php -m | grep memcache可以看到这个模块已经加入到php中
php -m | grep mysql可以看到数据库也与mysql关联
此时,php已经支持memcache模块了,可以安装memcached了
5.安装memcached
6.查看memcache的配置文件
它的端口是11211
127.0.0.1表示只监听本机端口
7.启动memcached
8.测试memcache在内存中的工作过程
安装telnet工具
telnet localhost 11211使用这个连接本地的端口,存数据
9.此时我们需要将php与memcahe结合起来,告诉php在执行第一遍时,应该把结果保存在memcached里,下一次同样的结果只需要去memcached里拿就好
在这里我们用memcached 的测试页面
cp memcache.php example.php /usr/local/lnmp/nginx/html/放到默认发布目录下
cd /usr/local/lnmp/nginx/html/
vim memcache.php (这个文件可以监控memcache是否被正确的调度)
这里只有一个memcache(本机ip),注释掉多余的
10.浏览器测试
浏览器访问http://172.25.8.1/memcache.php 要输入用户和密码,可以看到现在命中率33.3%
复制自带的example.php测试页面到nginx中
文件里面自己定义了要求php当相同请求访问时去加载memcache读取内存中的内容
11.真机ab命令测试
安装ab命令,压力测试,模拟5000请求量
(1)测试没有用memcache的index.php,发现速度很慢
(2)访问example.php 没有失败而且时间大大减少
-c 10表示并发用户数为10
-n 5000表示请求总数为5000
http://…/index.php表示请求的目标URL
表示同时处理5000个请求并运行10次index.php文件
ab命令的用法
ab是apache自带的压力测试工具。ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等。
ab是apachebench命令的缩写。
ab的原理:ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的,因此,它既可以用来测试apache的负载压力,也可以测试nginx、lighthttp、tomcat、IIS等其它Web服务器的压力。
ab命令对发出负载的计算机要求很低,它既不会占用很高CPU,也不会占用很多内存。但却会给目标服务器造成巨大的负载。自己测试使用也需要注意,否则一次上太多的负载。可能造成目标服务器资源耗完,严重时甚至导致死机。
参数:
-n 在测试会话中所执行的请求个数。默认时,仅执行一个请求。
-c 一次产生的请求个数。默认是一次一个。
-t 测试所进行的最大秒数。其内部隐含值是-n 50000,它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。
-p 包含了需要POST的数据的文件。
-P 对一个中转代理提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即, 是否发送了401认证需求代码),此字符串都会被发送。
-T POST数据所使用的Content-type头信息。
-v 设置显示信息的详细程度-4或更大值会显示头信息,3或更大值可以显示响应代码(404,200等),2或更大值可以显示警告和其他信息。
-V 显示版本号并退出。
-w 以HTML表的格式输出结果。默认时,它是白色背景的两列宽度的一张表。
-i 执行HEAD请求,而不是GET。
-x 设置<table>属性的字符串。
-X 对请求使用代理服务器。
-y 设置<tr>属性的字符串。
-z 设置<td>属性的字符串。
-C 对请求附加一个Cookie:行。其典型形式是name=value的一个参数对,此参数可以重复。
-H 对请求附加额外的头信息。此参数的典型形式是一个有效的头信息行,其中包含了以冒号分隔的字段和值的对(如,"Accept-Encoding:zip/zop;8bit")。
-A 对服务器提供BASIC认证信任。用户名和密码由一个:隔开,并以base64编码形式发送。无论服务器是否需要(即,是否发送了401认证需求代码),此字符串都会被发送。
-h 显示使用方法。
-d 不显示"percentage served within XX [ms] table"的消息(为以前的版本提供支持)。
-e 产生一个以逗号分隔的(CSV)文件,其中包含了处理每个相应百分比的请求所需要(从1%到100%)的相应百分比的(以微妙为单位)时间。由于这种格式已经“二进制化”,所以比'gnuplot'格式更有用。
-g 把所有测试结果写入一个'gnuplot'或者TSV(以Tab分隔的)文件。此文件可以方便地导入到Gnuplot,IDL,Mathematica,Igor甚至Excel中。其中的第一行为标题。
-i 执行HEAD请求,而不是GET。
-k 启用HTTP KeepAlive功能,即在一个HTTP会话中执行多个请求。默认时,不启用KeepAlive功能。
-q 如果处理的请求数大于150,ab每处理大约10%或者100个请求时,会在stderr输出一个进度计数。此-q标记可以抑制这些信息。