一个人炫耀什么,说明内心缺少什么 [登录·注册]

吕滔博客

首页 开发 运维 工具 摄影

启用nginx的fastcgi cache提高网站php访问速度

运维 memory 发布于October 22, 2013 标签: PHP, Nginx

先看下测试数据:

未使用

Concurrency Level:      5
Time taken for tests:   9.016 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1696500 bytes
HTML transferred:       1669000 bytes
Requests per second:    11.09 [#/sec] (mean)
Time per request:       450.781 [ms] (mean)
Time per request:       90.156 [ms] (mean, across all concurrent requests)
Transfer rate:          183.76 [Kbytes/sec] received

日志里显示,页面执行需要0.004s

Concurrency Level:      5
Time taken for tests:   3.203 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      1685400 bytes
HTML transferred:       1669000 bytes
Requests per second:    31.22 [#/sec] (mean)
Time per request:       160.156 [ms] (mean)
Time per request:       32.031 [ms] (mean, across all concurrent requests)
Transfer rate:          513.84 [Kbytes/sec] received

日志里显示,页面执行时间为0s

提高的很明显!
http里:

fastcgi_cache_path /www/PHP_cache  levels=1:2  keys_zone=cache_php:30m inactive=1d max_size=10g;

server里:

location ~ .*\.php?$
{
      #fastcgi_pass  unix:/tmp/php-cgi.sock;
      fastcgi_pass  127.0.0.1:9000;
      fastcgi_index index.php;
      include fcgi.conf;
      #以下是fastcgi_cache的配置
      fastcgi_cache   cache_php;
      fastcgi_cache_valid   200 302  1h;
      fastcgi_cache_min_uses  1;
      fastcgi_cache_use_stale error  timeout invalid_header http_500;
      fastcgi_cache_key $host$request_uri;
 }

fastcgi_cache_path:fastcgi_cache
缓存目录,可以设置目录层级,比如1:2会生成16*256个字目录,cache_php是这个缓存空间的名字,cache是用多少内存(这样热门的内容
Nginx直接放内存,提高访问速度),inactive表示默认失效时间,max_size表示最多用多少硬盘空间。本来还有个
fastcgi_temp_path参数,但发现似乎没用。

fastcgi_cache_valid:定义哪些http头要缓存
fastcgi_cache_min_uses:URL经过多少次请求将被缓存
fastcgi_cache_use_stale:定义哪些情况下用过期缓存
fastcgi_cache_key:定义fastcgi_cache的key,示例中就以请求的URI作为缓存的key,Nginx会取这个key的md5作为缓存文件,如果设置了缓存哈希目录,Nginx会从后往前取相应的位数做为目录
fastcgi_cache:用哪个缓存空间

指定删除某一URL的php文件的缓存的PHP程序
大致代码如下:

<?php
function purgeCache()
{
    $url = $this->post('url');
 
    if (empty($url) || !Cola_Com_Validate::url($url)) {
        exit('请输入正确的URL。');
    }
 
    $md5 = md5($url);
    $cacheFile = $this->_cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;
 
    if (!file_exists($cacheFile)) {
        exit('缓存不存在。');
    }
 
    if (@unlink($cacheFile)) {
        echo '清除缓存成功。';
    } else {
        echo '清除缓存失败。';
    }
}

参考网站地址:http://www.fuchaoqun.com/2011/01/nginx-fastcgi_cache/

Nginx
fastcgi_cache缓存很不错,但我只想在某些页面用fastcgi_cache,很简单,有两种方法,一是在location中定义
fastcgi_cache,这样只有满足一定规则的url才会用上cache,其他的就不会了;另外一种方法是在你不需要缓存的页面上,输出禁止缓存的
头信息,用ColaPHP的话,直接$this->response->disableBrowserCache(); 具体代码:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

这样就告诉Nginx,这个页面不需要缓存。

好吧,要淡定不要D疼,还有最后一个问题,如果页面中只有一小部分内容不可以缓存,可以用Nginx
fastcgi_cache吗?比如某个内容页,大部分内容可以缓存,但希望把用户的登录信息更新上去。答案是肯定的,可以直接输出用户未登录的页面样
式,等页面加载完毕之后,通过ajax异步更新用户信息:

$().ready(function() {
    initUser();
})

码完收工。

相关推荐

添加新评论

全部评论:已有 5 条评论

  1. 明月学习笔记Blog

    无论如何设置都是不生成缓存文件!

    始终都有一个Pragma:no-cache在,无语了!

    1. memory

      你看下你的header设置

  2. lein

    1:2会生成16*256个字目录
    $cacheFile = $this->_cacheRoot . '/' . substr($md5, -2, 2) . '/' . substr($md5, -4, 2) . '/' . $md5;
    楼主这里substr取的不对,应该是
    $cacheFile = $this->_cacheRoot . '/' . substr($md5, -1) . '/' . substr($md5, -3, 2) . '/' . $md5;
    举例:
    root@vbstevena nginxCache # find . -type f
    ./content/8/2d/4573270729c3db4e26e68198e5a1c2d8
    ./content/4/81/75a8c077cb22d087cf61c233a2184814
    ./content/1/6e/a4a589e68d5352e716f4033d01c026e1

  3. 海盗湾

    你好,博主,删除fastcgi_cache缓存的PHP代码你试过吗??真的能删除吗?

  4. 金敬腾

    特地过来拜访一下~

网站状态

  • 栏目分类:49个
  • 发布文章:1541篇
  • 用户评论:787条
  • 开博至今:4192天

正则速查

[abc] 匹配中括号中的单个字符,如a或b或c
[^abc] 匹配除了a、b、c等字符的其他单个字符
[a-z] 匹配一个字符范围,如a到z
[a-zA-Z] 匹配一个字符范围,如a-z 或 A-Z
^ 匹配行的开始
$ 匹配行的结束
\A 匹配一个字符串的开始
\z 匹配一个字符串的结束
. 匹配任意单个字符
\s 匹配空白字符,如空格,TAB
\S 匹配非空白字符
\d 匹配一个数字
\D 匹配非数字
\w 匹配一个字母
\W 匹配非字母
\b 匹配字符边界
(...) 引用所有括号中的内容
(a|b) a或者b
a? 零个或1个a
a* 零个或多个a
a+ 1个或多个a
a{3} 3次重复的a
a{3,} 3次或3次以上重复的a
a{3,6} 3到6次重复的a

修正符

/g 查找所有可能的匹配
/i 不区分大小写
/m 多行匹配
/s 单行匹配
/x 忽略空白模式
/e 可执行模式,PHP专有
/A 强制从目标字符串开头匹配
/D 使用$限制结尾字符,则不允许结尾有换行
/U 只匹配最近的一个字符串;不重复匹配

最新回复

  • memory: 这是测试,不建议正式环境这样使。
  • 广州网站建设: 构建redis集群时候,不要使用生产环境
  • memory: 照着大差不着的改一下就成了rewrite ^/sort/([0-...
  • mage: 按照上面设置的伪静态url是类似这种形式的 /listinfo-...
  • mage: 比如这种URL:帝国7.5伪静态如何可以做到这种形式(拼音或者英...
  • memory: 额,难住我了,哈哈。我项目中没有用过这么复杂的。
  • 马哥: 请问如何设置目录名是拼音,然后文章页在目录下面的伪静态
  • memory: conf文件中location段加上规则就可以了呀。然后relo...
  • mage: 后台系统设置,设置好了。规则应该怎么处理,nginx的服务器
  • 葛一速: 这个函数很实用,谢谢分享
  • memory: 这个是layui1.x中的,我项目中就是这样用的。如果你没理解,...
  • 李帅: 你会不会的 发这个糊弄人
  • memory: 升级完之后,测试无误后再删旧的~~~
  • 广州网站建设: 升级之前用不用先删了内核
  • memory: 没测试过...
  • 欧文斯: 对于多个 IP 段呢?比如超过 1000 个 IP 段,匹配速度...
  • 广州网站建设: 了解了,博客的通配符HTTPS证书