LNMP架构之PHP——MemCache对PHP页面的缓存加速优化
前言
1.什么是MemCache?
MemCache是一个自由、源码开放、高性能、分布式的分布式内存对象缓存系统,用于动态Web应用以减轻数据库的负载。
它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高了网站访问的速度。MemCaChe是一个存储键值对的HashMap,在内存中对任意的数据(比如字符串、对象等)所使用的key-value存储,数据可以来自数据库调用、API调用,或者页面渲染的结果。
MemCache设计理念就是小而强大,它简单的设计促进了快速部署、易于开发并解决面对大规模的数据缓存的许多难题,而所开放的API使得MemCache能用于Java、C/C++/C#、Perl、Python、PHP、Ruby等大部分流行的程序语言。
另外,说一下MemCache和MemCached的区别:
1)MemCache是项目的名称
2)MemCached是MemCache服务器端可以执行文件的名称
2.MemCache访问模型
特别澄清一个问题,MemCache虽然被称为"分布式缓存",但是MemCache本身完全不具备分布式的功能,MemCache集群之间不会相互通信(与之形成对比的,比如JBoss Cache,某台服务器有缓存数据更新时,会通知集群中其他机器更新缓存或清除缓存数据),所谓的"分布式",完全依赖于客户端程序的实现,就像上面这张图的流程一样。
同时基于这张图,理一下MemCache一次写缓存的流程:
-
1)应用程序输入需要写缓存的数据
-
2)API将Key输入路由算法模块,路由算法根据Key和MemCache集群服务器列表得到一台服务器编号
-
3)由服务器编号得到MemCache及其的ip地址和端口号
-
4)API调用通信模块和指定编号的服务器通信,将数据写入该服务器,完成一次分布式缓存的写操作
读缓存和写缓存一样,只要使用相同的路由算法和服务器列表,只要应用程序查询的是相同的Key,MemCache客户端总是访问相同的客户端去读取数据,只要服务器中还缓存着该数据,就能保证缓存命中。
这种MemCache集群的方式也是从分区容错性的方面考虑的,假如Node2宕机了,那么Node2上面存储的数据都不可用了,此时由于集群中Node0和Node1还存在,下一次请求Node2中存储的Key值的时候,肯定是没有命中的,这时先从数据库中拿到要缓存的数据,然后路由算法模块根据Key值在Node0和Node1中选取一个节点,把对应的数据放进去,这样下一次就又可以走缓存了,这种集群的做法很好,但是缺点是成本比较大。
缓存加速优化配置过程
实验环境:
主机名 | IP | 相关配置要求 |
---|---|---|
虚拟机server1 | 172.25.6.1 | 源码编译好的Mysql、Nginx、PHP |
物理机 | 172.25.6.250 | 测试端 |
注:以下配置过程中使用到的相关资源是建立在PHP源码编译成功的基础上(作者是接着前面的博客写的,如果有什么疑问可以参考前面的文章)
1.下载一个memcache的安装包,解压
memcache-2.2.5.tgz tar zxf memcache-2.2.5.tgz ls
2.将之前PHP编译完成的二进制命令加入到环境变量中,可以直接调用PHP命令
vim ~/.bash_profile PATH=$PATH:$HOME/bin:/usr/local/lnmp/mysql/bin:/usr/local/lnmp/php/bin
source ~/.bash_profile
php命令现在可以自动补齐
3.创建一个预编译环境并对memcache的源码包进行编译
(1)创建预编译环境
[root@server1 memcache-2.2.5]# pwd /mnt/memcache-2.2.5 [root@server1 memcache-2.2.5]# phpize
注: phpize是用来扩展php扩展模块的,通过phpize可以建立php的外挂模块,比如你想在原来编译好的php中加入memcached或者ImageMagick等扩展模块,可以使用phpize
phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境,所以是要根据该php的配置情况生成对应的configure文件,建立一个configure文件。必须在一个目录下去运行phpize,那么phpize就知道你的的环境是哪个目录,并且configure文件建立在该目录下
(2)编译
[root@server1 memcache-2.2.5]# ./configure
编译完成如下:
(3)安装
[root@server1 memcache-2.2.5]# make && make install
完成之后如下:
4.在php文件中添加memcache模块
[root@server1 ~]# cd /usr/local/lnmp/php/etc/ [root@server1 etc]# ls pear.conf php-fpm.conf php-fpm.conf.default php.ini [root@server1 etc]# vim php.ini
重新加载php-fpm服务
[root@server1 etc]# /etc/init.d/php-fpm start Starting php-fpm done [root@server1 etc]# /etc/init.d/php-fpm reload Reload service php-fpm done
5.安装memcache工具,开启memcache服务
yum install -y memcached
[root@server1 ~]# /etc/init.d/memcached start Starting memcached: [ OK ] [root@server1 ~]# netstat -tpnl ##监听端口为11211
6.安装telnet工具,测试
(1)安装telnet工具
yum install -y telnet
telnet localhost 11211 stats
(2)创建westos,查看,没有失效,删除,再次查看失效,退出(quit)
0 0 6 编号 缓存时间 限制的字符数
(3)再次创建为peng 保存时间为10秒,10秒内查看没有失效,10秒后查看失效
[root@server1 ~]# telnet localhost 11211 Trying ::1... Connected to localhost. Escape character is '^]'. set name 0 10 4 ##设置缓存时间为10秒 peng ##名字 STORED get name ##10秒内查看 VALUE name 0 4 peng END get name ##10秒后查看 END quit ##退出 Connection closed by foreign host.
7.将下面的文件复制到/usr/local/lnmp/nginx/html/文件下
[root@server1 memcache-2.2.5]# cp example.php memcache.php /usr/local/lnmp/nginx/html/ [root@server1 memcache-2.2.5]# cd /usr/local/lnmp/nginx/html/ [root@server1 html]# ls
(1)修改memcache的密码和访问地址
[root@server1 html]# vim memcache.php 23 define('ADMIN_PASSWORD','peng'); // Admin Password ##密码 28 $MEMCACHE_SERVERS[] = '172.25.6.1:11211'; // add more as an array ##本机IP
重新加载服务
[root@server1 html]# nginx -s reload
(2)浏览器访问http://172.25.6.1/memcache.php 要输入用户和密码,可以看到现在命中率是50%
(3)再打开一个页面访问http://172.25.6.1/example.php
(4)多次刷新,返回memcache的页面刷新可以看到命中率接近100%
8.安装ab命令,压力测试,模拟5000请求量
[root@server1 html]# yum whatprovides *ab [root@server1 html]# yum install -y httpd-tools-2.2.15-29.el6_4.x86_64
访问index.php 失败500多次
ab -c 10 -n 5000 http://172.25.6.1/index.php
访问example.php 没有失败而且时间大大减少
[root@server1 html]# ab -c 10 -n 5000 http://172.25.6.1/example.php
- PHP优化02 Memcache缓存加速部署
- 解决:LNMP架构下访问php页面出现500错误
- PHP系统的服务器端内存缓存架构的分析和优化
- LAMP与LNMP加速与缓存优化(二)
- PHP使用Zend Opcache之优化加速和缓存清理总结
- LNMP架构,phpf服务器和memcached缓存配置,openresty+memcached实现缓存
- 解决:LNMP架构下访问php页面出现500错误
- LAMP和LNMP加速与缓存优化
- PHP系统的服务器端内存缓存架构的分析和优化
- 在服务器缓存PHP动态页面加速浏览源码
- Linux运维学习笔记之十六:LAMP与LNMP加速与缓存优化进阶实战
- memcached实现LNMP对php页面的缓存
- PHP通过缓存页面加速动态内容生成(原理)
- LAMP与LNMP加速与缓存优化(一)2
- memcache对php页面访问的加速
- LNMP架构下访问php页面出现500错误
- LNMP架构下访问php页面出现500错误
- lnmp架构之php的安装与memcache
- PHP服务缓存加速优化
- 实用LNMP架构详细实现和PHP性能优化