<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>阅微堂 &#187; 压缩</title>
	<atom:link href="http://zhiqiang.org/blog/tag/%e5%8e%8b%e7%bc%a9/feed" rel="self" type="application/rss+xml" />
	<link>http://zhiqiang.org/blog</link>
	<description>数学、金融、计算机</description>
	<lastBuildDate>Sat, 19 May 2012 13:47:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>加速blog：GZIP压缩传输你的文件</title>
		<link>http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html</link>
		<comments>http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html#comments</comments>
		<pubDate>Thu, 29 Nov 2007 10:43:50 +0000</pubDate>
		<dc:creator>zhiqiang</dc:creator>
				<category><![CDATA[IT技术]]></category>
		<category><![CDATA[GZIP]]></category>
		<category><![CDATA[压缩]]></category>
		<category><![CDATA[速度优化]]></category>

		<guid isPermaLink="false">http://zhiqiang.org/blog/?p=706</guid>
		<description><![CDATA[博客 » IT技术 » GZIP，压缩，速度优化 » 在浏览网页的时候，浏览器需要把网页上的内容，包括网页HTML，CSS，JS，FLASH和图片等下载到本地，然后把它们显示出来。如果网页上的内容是固定的，下载速度也不是你我能控制的，但下载的大小则是可以控制的，只需要你再传送的过程中先把内容压缩一下即可。 对于一般的HTML，CSS和JS文件，GZIP的压缩比率达50%到80%，节约的流量是非...]]></description>
			<content:encoded><![CDATA[<p id="breadcrumb" class="breadcrumb"><a href="http://zhiqiang.org/blog/">博客</a> » <a href="http://zhiqiang.org/blog/category/it">IT技术</a> » <a href="http://zhiqiang.org/blog/tag/gzip" rel="tag">GZIP</a>，<a href="http://zhiqiang.org/blog/tag/%e5%8e%8b%e7%bc%a9" rel="tag">压缩</a>，<a href="http://zhiqiang.org/blog/tag/%e9%80%9f%e5%ba%a6%e4%bc%98%e5%8c%96" rel="tag">速度优化</a> » </p><p>在浏览网页的时候，浏览器需要把网页上的内容，包括网页HTML，CSS，JS，FLASH和图片等下载到本地，然后把它们显示出来。如果网页上的内容是固定的，下载速度也不是你我能控制的，但下载的大小则是可以控制的，只需要你再传送的过程中先把内容压缩一下即可。</p>
<p>对于一般的HTML，CSS和JS文件，GZIP的压缩比率达50%到80%，节约的流量是非常惊人的。下图是阅微堂上的GZIP结果：</p>
<p style="text-align: center"><img src="http://lh3.ggpht.com/mathzqy/RzlfaqQHJ-I/AAAAAAAABqA/EAWWcc09txY/s800/20071113162512812.jpg"/></p>
<h3>动态内容压缩</h3>
<p>动态内容指动态脚本比如PHP生成的内容，比如WordPress产生的内容均为动态脚本内容。对于动态脚本的压缩方式有两种，一种是ob_gzhandler，一种是zlib.output_compression。前者几乎所有服务器都支持，只需要在WordPress后台options-&gt;Reading-&gt;WordPress should compress articles (gzip) if browsers ask for them打开GZIP传输即可。而后者是一个PHP模块，效果更佳，因为它是边生成，边压缩，边传输的，效率和速度都更好。但这个是PHP的一个模块，不是所有服务器上的有这个模块。</p>
<h3>静态文本压缩</h3>
<p>但对于另外一些需要压缩的静态文本，比如html, css, javascript文件等。相应的静态文本压缩的Apache模块有两种，GZIP和DEFLATE，后者更好，不过这都没啥选择，完全看服务器是否提供，个人无法配置，比如使用最多的Bluehost和Dreamhost都不支持。</p>
<h3>静态文本调用PHP压缩模块实现GZIP压缩效果</h3>
<p>如果服务器不提供对于静态文本的GZIP压缩模块，唯一的出路是通过调用PHP。有好几种方法调用PHP达到这个效果，下面介绍一种方法，好处是除了在目录下添加一个文件和修改.htaccess之外，不需要对别的代码作任何修改，所有的js，javascript的压缩都自动生效。（不过，如果你看不懂下面这些代码为什么能起作用，就不要使用这个方法）</p>
<p>首先，修改你的blog目录下的.htaccess文件，加入下面几行代码(注意修改你的blog的目录，这里默认是/blog/)</p>
<blockquote><pre># to gzip your css, javascript, html file automatically
<span style="color: #0000ff">&lt;</span><span style="color: #800000">IfModule</span> <span style="color: #ff0000">mod_rewrite</span>.<span style="color: #ff0000">c</span><span style="color: #0000ff">&gt;</span>
RewriteEngine On
RewriteBase /blog/ #directory of your blog, change it to yours
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^(.*)(js|css|html|htm)$ /blog/redir.php?file=$1$2&amp;type=$2 [L]
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">&gt;</span></pre>
</blockquote>
<p>其次，将下面代码保存在文件redir.php里，放到blog的根目录</p>
<pre><span style="color: #0000ff">&lt;?</span>php <span style="color: #008000"># this is the file redir.php, to gzip javascript and css</span>
<span style="color: #008000"># set the request file name</span>
$<a style="color: #ffa500" href="http://cn.php.net/manual/en/function.file.php">file</a>=$_REQUEST['<span style="color: #8b0000">file</span>'];

<span style="color: #008000"># Set Expires, cache the file on the browse</span>
<span style="color: #008000"># Delete it if you don't want it</span>
<a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Expires:</span>".<a style="color: #ffa500" href="http://cn.php.net/gmdate">gmdate</a>("<span style="color: #8b0000">D, d M Y H:i:s</span>", <a style="color: #ffa500" href="http://cn.php.net/time">time</a>()+15360000)."<span style="color: #8b0000">GMT</span>");
<a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Cache-Control: max-age=315360000</span>");

<span style="color: #008000"># set the last modified time</span>
$mtime = <a style="color: #ffa500" href="http://cn.php.net/filemtime">filemtime</a>($<a style="color: #ffa500" href="http://cn.php.net/manual/en/function.file.php">file</a>);
$gmt_mtime = <a style="color: #ffa500" href="http://cn.php.net/gmdate">gmdate</a>('<span style="color: #8b0000">D, d M Y H:i:s</span>', $mtime) . '<span style="color: #8b0000"> GMT</span>';
<a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Last-Modified:</span>" . $gmt_mtime);

<span style="color: #008000"># output a mediatype header</span>
<a style="color: #0000ff" href="http://cn.php.net/manual/en/control-structures.switch.php">switch</a> ($_REQUEST['<span style="color: #8b0000">type</span>']){
  <a style="color: #0000ff" href="http://cn.php.net/manual/en/control-structures.switch.php">case</a> '<span style="color: #8b0000">css</span>':
    <a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Content-type: text/css</span>");
    <a style="color: #0000ff" href="http://cn.php.net/break">break</a>;
  <a style="color: #0000ff" href="http://cn.php.net/manual/en/control-structures.switch.php">case</a> '<span style="color: #8b0000">js</span>' :
    <a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Content-type: text/javascript</span>");
    <a style="color: #0000ff" href="http://cn.php.net/break">break</a>;
  <a style="color: #0000ff" href="http://cn.php.net/manual/en/control-structures.switch.php">case</a> '<span style="color: #8b0000">html</span>':
    <a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Content-type: text/html</span>");
    <a style="color: #0000ff" href="http://cn.php.net/break">break</a>;
  <a style="color: #0000ff" href="http://cn.php.net/manual-lookup.php?pattern=default&amp;lang=en&amp;scope=404quickref">default</a>:
    <a style="color: #ffa500" href="http://cn.php.net/manual/en/function.header.php">header</a>("<span style="color: #8b0000">Content-type: text/plain</span>");
}

<span style="color: #008000"># GZIP the content</span>
<a style="color: #0000ff" href="http://cn.php.net/manual/en/control-structures.if.php">if</a>(<a style="color: #ffa500" href="http://cn.php.net/extension_loaded">extension_loaded</a>('<span style="color: #8b0000">zlib</span>')){<a style="color: #ffa500" href="http://cn.php.net/ob_start">ob_start</a>();<a style="color: #ffa500" href="http://cn.php.net/ob_start">ob_start</a>('<span style="color: #8b0000">ob_gzhandler</span>');}

<span style="color: #008000"># echo the file's contents</span>
<a style="color: #0000ff" href="http://cn.php.net/echo">echo</a> <a style="color: #ffa500" href="http://cn.php.net/implode">implode</a>('<span style="color: #8b0000"></span>', <a style="color: #ffa500" href="http://cn.php.net/manual/en/function.file.php">file</a>($<a style="color: #ffa500" href="http://cn.php.net/manual/en/function.file.php">file</a>));

<a style="color: #0000ff" href="http://cn.php.net/manual/en/control-structures.if.php">if</a>(<a style="color: #ffa500" href="http://cn.php.net/extension_loaded">extension_loaded</a>('<span style="color: #8b0000">zlib</span>')){
  <a style="color: #ffa500" href="http://cn.php.net/ob_end_flush">ob_end_flush</a>();
  <span style="color: #008000"># set header the content's length;</span>
  <span style="color: #008000"># header("Content-Length: ".ob_get_length()); # (It doesn't work? )</span>
  <a style="color: #ffa500" href="http://cn.php.net/ob_end_flush">ob_end_flush</a>();
}
<span style="color: #0000ff">?&gt;</span></pre>
<p>大致解释一下原理，那段.htaccess代码把所有的css,js,html,htm文档自动转向到redir.php，redir.php则读取真实的文件内容，调用PHP压缩模块ob_gzhandler压缩后输出。</p>
<div><h4>相关文章</h4><ul><li class='currentpost'><a href="http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html">加速blog：GZIP压缩传输你的文件</a></li><li ><a href="http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html">设置blog的缓存和压缩</a></li><li ><a href="http://zhiqiang.org/blog/it/dreamhost-on-gzip-cache.html">Dreamhost上的GZIP &#038; Cache</a></li></ul></div>    <p></p>
    <hr noshade style="margin:0;height:1px" />
    <p>&copy; zhiqiang for <a href="http://zhiqiang.org/blog">阅微堂</a>, 2007. | <a href="http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html#comments">25 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
	</channel>
</rss>

