Dreamhost上的GZIP & Cache

用WordPress的都知道,WordPress可以打开GZIP传输,压缩比率能达到60%到80%。下表是本blog首页Web Page Analyzer上的测试报告,此页面上包括css, js所有东西加起来才14K。

QTY SIZE# TYPE URL
1 6999 HTML http://zhiqiang.org/blog/
1 2593 SCRIPT http://zhiqiang.org/blog/.../comment.js.php
1 2302 SCRIPT http://zhiqiang.org/.../all.js.php
1 2048 CSS http://zhiqiang.org/.../style.css.php
1 431 IMG http://feeds.feedburner.com/~fc/zhiqiang
5 ^ 14373* Total (^unique objects)

Dreamhost还用的是Apache 1.3(Am I wrong?),所以没有mod_deflate模块,而用的是mod_gzip模块,这个模块直接在磁盘上读写,效率比前者要低。不过有总比没有好,毕竟压缩比率很高。

但诡异的是,服务器默认对CSS和JS不作压缩。写信去问了dreamhost客服,也没有什么好方法。最后我采用的方法是用php给包一层:用style.css.php来代替style.css:

<?php # this is the file style.css.php, who contains style.css
# set the request file name
$file="style.css";

# Set Expires, cache the file on the browse
# Delete it if you don't want it
header("Expires:".gmdate("D, d M Y H:i:s", time()+15360000)."GMT");
header("Cache-Control: max-age=315360000");

# set the last modified time
$mtime = filemtime($file);
$gmt_mtime = gmdate('D, d M Y H:i:s', $mtime) . ' GMT';
header("Last-Modified:" . $gmt_mtime);

# output a mediatype header
$ext = array_pop(explode('.', $file));
switch ($ext){
case 'css':
 header("Content-type: text/css");
 break;
case 'js' :
 header("Content-type: text/javascript");
 break;
case 'gif':
 header("Content-type: image/gif");
 break;
case 'jpg':
 header("Content-type: image/jpeg");
 break;
case 'png':
 header("Content-type: image/png");
 break;
default:
 header("Content-type: text/plain");
}

# GZIP the content
if(extension_loaded('zlib')){ob_start();ob_start('ob_gzhandler');}

# echo the file's contents
echo implode('', file($file));

if(extension_loaded('zlib')){
ob_end_flush();
# set header the content's length;
# header("Content-Length: ".ob_get_length()); # (It doesn't work? )
ob_end_flush();
}
?>

上面代码不仅压缩代码,而且要求浏览器端Cache这个文件。甚至,可以把所有css文件都放到一个php文件里,只要在echo处加入多个文件即可。

下面是一些常用的测试网站:

参考资料:

Q.E.D., ©zhiqiang, 2007.04.1。请参考右边的相关文章列表。


  1. 不知道bH能不能压缩CSS和JS格式呢?
    现在你站的速度比以前又快了

  2. BH也不能压缩CSS和JS,而且HTML也不能压缩,实在是一个非常发指的事情。我现在不得不把我的静态页面又用php处理一遍。

  3. 不知道以前的版本,不过DH现在的Apache版本是2.0的
    不知道mod_deflate压缩效果比Gzip高出多少?

  4. 还有一个问题,用Cacheability Test:这个工具看来才知道,做过301重定向的元素,包括图片都不能被cache,不知道对速度有什么影响

  5. 晕,一直没有意识到DH还有apache2。查了一下,的确新的服务器是apache2。而且如果你的服务器上还是apach 1.3,可以通过添加a subversion repository的方式,域名将自动转到apache2的机器上。也可以通过向客服提交申请的方式。见http://forum.dreamhosters.com/beginners/65491-version-of-Apache.htm。

    mod_deflate的压缩效果和GZIP差不多,他们用的算法都差不多的。不过deflate是内存操作,gzip是磁盘操作,后者的限制主要在于磁盘I/O的速度。所以,deflate要好一些。

    俺亏了,不知道BH有没有类似的东西。

  6. 图片你做301重定向干嘛?

    最好的cache是浏览器直接利用机器cache,连头文件都不发(只适用于源文件很少变动的文件,比如固定下版本的css,js),这样你服务器段做没做重定向,浏览器这里根本就不知道,也就无所谓了。

    这样的cache可以通过php header要求浏览器段执行,我给的那些代码的第二段就是。

  7. Pingback: Gzip压缩css和js文件 - Ks Home

  8. 不知道为什么,我的站上用 mod_deflate 不能压缩 ... jQuery 一下就占掉30K...

  9. WP 2.5和以上版本移除了对于GZIP的控制选项。要想使用GZIP,你可以在服务器端打开这个选项。或者使用插件,比如用这个

  10. 唔,等下..我又测试了下.我的日志页面去检测的话 会检测到开启和压缩率..首页检测不到..!我去关闭这个插件,;来测试下 是否像传言说的那样 2.51检测服务器使用可以GZIP 而自动开启.!

  11. 唔.看来传言是假的,并非根据服务器是否支持而开启的.嗯 谢谢了~!
    开启也关闭这个插件 虽然压缩了 但速度无明显变化!.等需要的时候在开启吧!
    终于弄明白2.51 GZIP了 .谢谢!

  12. Pingback: 利用好YSlow,提高网页打开速度 - 布罗特的Blog

  13. 如果想单独给一些网站png文件加上过期时间, 应该怎么写? 我的是win主机, 改不了.htaccess文件

  14. IIS还是Apache呢?Win上的Apache也可以用.htaccess。我没研究过IIS,但我猜测IIS也会提供类似的功能,你需要找懂的人问一下或者查看一些IIS手册。

  15. 谢谢博主, 我用的虚拟主机没有提供修改IIS或者web.config文件的功能, 所以我一直没办法设置cache. 用了你的方法之后, 现在CSS文件和JS文件已经成功添加了过期头, 但CSS里用到的bg文件还是没法缓存, 所以我想能不能用类似的方法, 或者用一个js, 给图片文件加上过期头?

  16. 唔。你的服务器支持重定向么,一种方法是将bg文件重定向到一个PHP处理程序,然后PHP处理程序再添加过期时间啥的。

    不过我觉得这样也太麻烦了,上面这么做有点得不偿失。事实上大部分浏览器都可以自动处理缓存,不会连续下载一样的文件。你检查过你确实有必要自己来设定expire date吗?

  17. 我的服务器可以支持ISAPI_Rewrite, 别的就没有更多功能了, 其实我的PNG文件数量也不多, 每个页面大概两三张, 因为我将它们都合并起来了, 但是就因为合并起来了, 所以每张都挺大, 网速不好的时候, 一大片图片很久都刷不出来..

  18. 你可以这样,用Chrome按F12,浏览你的网站的network情况。然后看在连续浏览页面时,Chrome是否重复下载了你的图片文件(看status code那个地方)。

  19. 认真看了下, 如果直接按F5刷新的话, 会有200或者304出现, 但如果关了浏览器再重新打开, 就全部都是200了

  20. 200也可以是 from cache。看看那个size列是否是from cache。

    我觉得如果有304出现的话,应该就没有问题。

  21. 嗯嗯, 现在图片也不多, 那就先这样好了, 谢谢博主. [赞啊]

  • 评论由多说提供支持。该系统支持使用微薄、人人网和QQ的账户登陆,由各自网站直接认证,不会泄露你的密码。
  • 登陆后可选择分享评论到所绑定的社交网络,如微薄、人人和QQ空间。
  • 评论无法修改。如需修改,请删除原评论重新提交。
  • 评论支持LaTeX代码,行内公式请用\(a+b=c\),行间公式请用\[a+b=c\]。公式只支持英文字符。
Loading...
Loading...
Loading...