基于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 5.0对象模型深度探索之对象复制
Mar 27 PHP
19个超实用的PHP代码片段
Mar 14 PHP
修改destoon会员公司的伪静态中的com目录的方法
Aug 21 PHP
php绘图之生成饼状图的方法
Jan 24 PHP
php curl请求信息和返回信息设置代码实例
Apr 27 PHP
浅谈本地WAMP环境的搭建
May 13 PHP
php自动给网址加上链接的方法
Jun 02 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
php格式化时间戳
Dec 17 PHP
PHP实现在windows下配置sendmail并通过mail()函数发送邮件的方法
Jun 20 PHP
PHP实现SMTP邮件的发送实例
Sep 27 PHP
ThinkPHP3.2.3框架实现执行原生SQL语句的方法示例
Apr 03 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
如何解决CI框架的Disallowed Key Characters错误提示
2013/07/05 PHP
php结合md5实现的加密解密方法
2016/01/25 PHP
php编程每天必学之表单验证
2016/03/01 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
使用js显示当前时间示例
2014/03/02 Javascript
JS来动态的修改url实现对url的增删查改
2014/09/05 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
js判断浏览器版本以及浏览器内核的方法
2015/01/20 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
详解PHP中pathinfo()函数导致的安全问题
2017/01/05 Javascript
Javascript同时声明一连串(多个)变量的方法
2017/01/23 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
layui 选择列表,打勾,点击确定返回数据的例子
2019/09/02 Javascript
JavaScript实现答题评分功能页面
2020/06/24 Javascript
element-ui和vue表单(对话框)验证提示语(残留)清除操作
2020/09/11 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
python中的全局变量用法分析
2015/06/09 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
Python实现读取并保存文件的类
2017/05/11 Python
python万年历实现代码 含运行结果
2017/05/20 Python
python 实现语音聊天机器人的示例代码
2018/12/02 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
Python Web框架之Django框架cookie和session用法分析
2019/08/16 Python
使用Python获取当前工作目录和执行命令的位置
2020/03/09 Python
手把手教你配置JupyterLab 环境的实现
2021/02/02 Python
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
皮肤科医师岗位职责
2013/12/04 职场文书
小城镇建设汇报材料
2014/08/16 职场文书
前台岗位职责
2015/02/13 职场文书
施工单位工程部经理岗位职责
2015/04/09 职场文书
干货:如何写好观后感 !
2019/05/21 职场文书
spring 项目实现限流方法示例
2022/07/15 Java/Android