基于php缓存的详解


Posted in PHP onMay 15, 2013

nginx缓存
nginx有两种缓存机制:fastcgi_cache和proxy_cache
下面我们来说说这两种缓存机制的区别吧
proxy_cache作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态的
fastcgi_cache作用是缓存fastcgi生成的内容,很多情况是php生成的动态内容
proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端带宽
fastcgi_cache缓存减少了nginx与php的通信次数,更减轻了php和数据库的压力。

proxy_cache缓存设置
#注:proxy_temp_path和proxy_cache_path指定的路径必须在同一分区
proxy_temp_path   /data0/proxy_temp_dir;
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path  /data0/proxy_cache_dir  levels=1:2   keys_zone=cache_one:200m inactive=1d max_size=30g;

server
  {
    listen       80;
    server_name  www.yourdomain.com 192.168.8.42;
    index index.html index.htm;
    root  /data0/htdocs/www; 

    location /
    {
         #如果后端的服务器返回502、504、执行超时等错误,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。
         proxy_next_upstream http_502 http_504 error timeout invalid_header;
         proxy_cache cache_one;
         #对不同的HTTP状态码设置不同的缓存时间
         proxy_cache_valid  200 304 12h;
         #以域名、URI、参数组合成Web缓存的Key值,Nginx根据Key值哈希,存储缓存内容到二级缓存目录内
         proxy_cache_key $host$uri$is_args$args;
         proxy_set_header Host  $host;
         proxy_set_header X-Forwarded-For  $remote_addr;
         proxy_pass http://backend_server;
         expires      1d;
    }

    #用于清除缓存,假设一个URL为http://192.168.8.42/test.txt,通过访问http://192.168.8.42/purge/test.txt就可以清除该URL的缓存。
    location ~ /purge(/.*)
    {
     #设置只允许指定的IP或IP段才可以清除URL缓存。
     allow            127.0.0.1;
     allow            192.168.0.0/16;
     deny            all;
     proxy_cache_purge    cache_one   $host$1$is_args$args;
    }   

    #扩展名以.php、.jsp、.cgi结尾的动态应用程序不缓存。
    location ~ .*\.(php|jsp|cgi)?$
    {
         proxy_set_header Host  $host;
         proxy_set_header X-Forwarded-For  $remote_addr;
         proxy_pass http://backend_server;
    }

    access_log  off;
  }
}

fastcgi_cache缓存设置
#定义缓存存放的文件夹
fastcgi_cache_path   /tt/cache  levels=1:2 keys_zone=NAME:2880m inactive=2d max_size=10G;
#定义缓存不同的url请求
fastcgi_cache_key "$scheme$request_method$host$uri$arg_filename$arg_x$arg_y";

server {
        listen       8080;
        server_name  www.example .com;
        location / {
            root   /www;
            index  index.html index.htm index.php;
        }

        location ~ (|.php)$ {
            root           /www;
            fastcgi_pass   127.0.0.1:9000;

            fastcgi_cache   NAME;
            fastcgi_cache_valid 200 48h;
            fastcgi_cache_min_uses  1;
            fastcgi_cache_use_stale error  timeout invalid_header http_500;

            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi.conf;
            #设置缓存的过程中发现无法获取cookie,经查需要定义这句话
            fastcgi_pass_header Set-Cookie;
        }

        log_format  access  '$remote_addr - $remote_user [$time_local] "$request" '
              '$status $body_bytes_sent "$http_referer" '
              '"$http_user_agent" $http_x_forwarded_for';
access_log  /httplogs/access.log  access;
}
总的来说  nginx的proxy_cache和fastcgi_cache的缓存配置差不多。
--------------------------------------------------------------------------------
memcache缓存
在讨论memcache缓存之前,我们先了解下mysql的内存缓存吧
mysql的内存缓存可以在my.cnf中指定大小:内存表和临时表不同,临时表也是存放内存中,临时表最大的内存需要通过tmp_table_size=128M设定。当数据查过临时表的最大值设定时,自动转为磁盘表,此时因需要进行IO操作,性能会大大下降,而内存表不会,内存满了后,会提示数据满错误。
例:
create table test
(
    id int unsigned not null auto_increment primary key
    state char(10),
    type char(20),
    date char(30)
)engine=memory default charset=utf8

内存表的特性:
1.内存表的表定义存放在磁盘上,扩展名为.frm,所以重启不会丢失
2.内存表的数据是存放在内存中,重启会丢失数据
3.内存表使用一个固定的长度格式
4.内存表不支持blob或text列,比如varchar与text字段就不会被支持
5.内存表支持auto_increment列和对可包含null值的列的索引
6.内存表不支持事物
7.内存表是表锁,当修改频繁时,性能可能会下降

下面我们来看看memcache,相对而言mysql的内存表限制较多。
memcache的用途
1.提高系统的并发能力
2.减轻数据库的负担
注:memcache linux系统32位只支持4G内存,同时memcache最长保存时间为30天。

PHP 相关文章推荐
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
php 来访国内外IP判断代码并实现页面跳转
Dec 18 PHP
php定界符
Jun 19 PHP
smarty中英文多编码字符截取乱码问题解决方法
Oct 28 PHP
laravel安装和配置教程
Oct 29 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
php根据指定位置和长度获得子字符串的方法
Mar 17 PHP
php文件操作之小型留言本实例
Jun 20 PHP
php求一个网段开始与结束IP地址的方法
Jul 09 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
PHP合并两个或多个数组的方法
Jan 20 PHP
php操作redis数据库常见方法实例总结
Feb 20 PHP
解析php中mysql_connect与mysql_pconncet的区别详解
May 15 #PHP
深入php之规范编程命名小结
May 15 #PHP
PHP+jQuery实现自动补全功能源码
May 15 #PHP
深入分析php之面向对象
May 15 #PHP
深入解析php之apc
May 15 #PHP
深入解析php之sphinx
May 15 #PHP
基于php设计模式中单例模式的应用分析
May 15 #PHP
You might like
php中的观察者模式简单实例
2015/01/20 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
php实现QQ小程序发送模板消息功能
2019/09/18 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
jquery实现固定顶部导航效果(仿蘑菇街)
2013/03/21 Javascript
javascript自定义startWith()和endWith()的两种方法
2013/11/11 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
使用iojs的jsdom库实现同步系统时间
2015/04/20 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
AngularJS 最常用的功能汇总
2016/02/17 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
Ionic2调用本地SQlite实例
2017/04/22 Javascript
Node.js之readline模块的使用详解
2019/03/25 Javascript
vue 实现 rem 布局或vw 布局的方法
2019/11/13 Javascript
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
Vue中正确使用Element-UI组件的方法实例
2020/10/13 Javascript
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
[08:38]DOTA2-DPC中国联赛 正赛 VG vs Elephant 选手采访
2021/03/11 DOTA
python实现的登录和操作开心网脚本分享
2014/07/09 Python
Python实现的简单计算器功能详解
2018/08/25 Python
Python基于Tkinter模块实现的弹球小游戏
2018/12/27 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
全球知名旅游社区法国站点:TripAdvisor法国
2016/08/03 全球购物
ECCO爱步美国官网:来自丹麦的鞋履品牌
2016/11/23 全球购物
活动宣传策划方案
2014/05/23 职场文书
2015年防灾减灾工作总结
2015/07/24 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书