基于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 simplexmlElement操作xml的命名空间实现代码
Jan 04 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
PHP中数组的三种排序方法分享
May 07 PHP
ThinkPHP控制器间实现相互调用的方法
Oct 31 PHP
php+xml实现在线英文词典查询的方法
Jan 23 PHP
php中动态变量用法实例
Jun 10 PHP
php统计数组元素个数的方法
Jul 02 PHP
教你识别简单的免查杀PHP后门
Sep 13 PHP
php源码 fsockopen获取网页内容实例详解
Sep 24 PHP
基于php流程控制语句和循环控制语句(讲解)
Oct 23 PHP
php格式文件打开的四种方法
Feb 24 PHP
laravel框架邮箱认证实现方法详解
Nov 22 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动态实现表格跨行跨列实现代码
2012/11/06 PHP
提升PHP性能的21种方法介绍
2013/06/25 PHP
如何离线执行php任务
2017/02/21 PHP
在IE6下发生Internet Explorer cannot open the Internet site错误
2010/06/21 Javascript
jQuery Autocomplete自动完成插件
2010/07/17 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
javascript解析json数据的3种方式
2014/05/08 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
2017/03/15 Javascript
微信小程序实现动态设置页面标题的方法【附源码下载】
2017/11/29 Javascript
详解Chai.js断言库API中文文档
2018/01/31 Javascript
微信小程序前端自定义分享的实现方法
2019/06/13 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
layer关闭当前窗口页面以及确认取消按钮的方法
2019/09/09 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
Python数据结构之Array用法实例
2014/10/09 Python
python下setuptools的安装详解及No module named setuptools的解决方法
2017/07/06 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
python使用adbapi实现MySQL数据库的异步存储
2019/03/19 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python列表插入append(), extend(), insert()用法详解
2019/09/14 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
2019/10/24 Python
浅谈python3打包与拆包在函数的应用详解
2020/05/02 Python
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
Tostadora意大利:定制T恤
2019/04/08 全球购物
Hush Puppies澳大利亚官网:舒适的男女休闲和正装鞋
2019/08/24 全球购物
行政经理岗位职责
2013/11/09 职场文书
助人为乐好少年事迹材料
2014/08/18 职场文书
2014年消防工作总结
2014/11/21 职场文书
2014年社区教育工作总结
2014/12/02 职场文书
企业财务总监岗位职责
2015/04/03 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
javascript canvas实现雨滴效果
2021/06/09 Javascript