<?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/%e7%bc%93%e5%ad%98/feed" rel="self" type="application/rss+xml" />
	<link>http://zhiqiang.org/blog</link>
	<description>zhiqiang&#039;s personal blog</description>
	<lastBuildDate>Tue, 22 Jun 2010 13:08:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>设置blog的缓存和压缩</title>
		<link>http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html</link>
		<comments>http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html#comments</comments>
		<pubDate>Tue, 08 Dec 2009 12:59:36 +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/posts/using-htaccess-to-speed-blog.html</guid>
		<description><![CDATA[在网站根目录下的.htaccess文件中添加以下代码
&#60;IfModule mod_expires.c&#62;
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType text/css A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType application/javascript A2592000
ExpiresByType text/javascript A2592000
ExpiresByType text/html A600
&#60;/IfModule&#62;

&#60;IfModule mod_de...]]></description>
			<content:encoded><![CDATA[<p>在网站根目录下的.htaccess文件中添加以下代码</p>
<pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">IfModule</span> <span style="color: #ff0000">mod_expires</span>.<span style="color: #ff0000">c</span><span style="color: #0000ff">&gt;</span>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType text/css A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType application/javascript A2592000
ExpiresByType text/javascript A2592000
ExpiresByType text/html A600
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">IfModule</span> <span style="color: #ff0000">mod_deflate</span>.<span style="color: #ff0000">c</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;</span><span style="color: #800000">FilesMatch</span> &quot;\.(<span style="color: #ff0000">js</span>|<span style="color: #ff0000">css</span>|<span style="color: #ff0000">html</span>|<span style="color: #ff0000">htm</span>)$&quot;<span style="color: #0000ff">&gt;</span>
SetOutputFilter DEFLATE
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">FilesMatch</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">ifModule</span> <span style="color: #ff0000">mod_gzip</span>.<span style="color: #ff0000">c</span><span style="color: #0000ff">&gt;</span>
  mod_gzip_on Yes
  mod_gzip_dechunk Yes
  mod_gzip_item_include file \.(html?|txt|css|js|php|pl)$
  mod_gzip_item_include handler ^cgi-script$
  mod_gzip_item_include mime ^text/.*
  mod_gzip_item_include mime ^application/x-javascript.*
  mod_gzip_item_exclude mime ^image/.*
  mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">ifModule</span><span style="color: #0000ff">&gt;</span>

<span style="color: #0000ff">&lt;</span><span style="color: #800000">FilesMatch</span> &quot;\.(<span style="color: #ff0000">ico</span>|<span style="color: #ff0000">pdf</span>|<span style="color: #ff0000">flv</span>|<span style="color: #ff0000">jpg</span>|<span style="color: #ff0000">jpeg</span>|<span style="color: #ff0000">png</span>|<span style="color: #ff0000">gif</span>|<span style="color: #ff0000">js</span>|<span style="color: #ff0000">css</span>)$&quot;<span style="color: #0000ff">&gt;</span>
Header unset Last-Modified
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">FilesMatch</span><span style="color: #0000ff">&gt;</span>

FileETag none</pre>
<p>现在使用Firefox的YSlow插件，以Small Site or Blog标准测试的分数为99分，以YSlow2(V2)标准测试的分数为94分，被扣掉的几分主要是因为没有使用CDN。所以现在<a href="http://yueweitang.org/blog/posts/speedup-your-blog.html">速度已经被优化到了极致</a>。</p>
<p>赶快把它放到你的网站或blog根目录下的.htaccess文件里吧。</p>
<div><h2>相关文章</h2><ul><li><a href="http://zhiqiang.org/blog/it/speedup-blog-gzip-javascript-css.html">加速blog：GZIP压缩传输你的文件</a> <small>在浏览网页的时候，浏览器需要把网页上的内容，包括网页HTML，CSS，JS，FLASH和图片等下载到本地，然后把它们显示出来。如果网页上的内容是固定的...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-website-with-css-sprites.html">用CSS Sprites让网站再加速</a> <small> 我对于blog的速度有着变态的需求. 网站速度与HTML请求数目有很直接的关系，所以我一直没有在网页上放过多的背景图片——注意这里有个网页加速的...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html">加速blog：设置浏览器缓存</a> <small>在用户浏览blog的不同页面时，很多内容是重复的，比如相同的javascript，css，背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件，将...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html">加速blog：服务器端的中转和缓存</a> <small>前面已经提到了浏览器端的缓存，通过适当的Header可以建议和命令浏览器缓存页面内容比如javascript, css, 图片等。这里的服务器端的缓存又是什么意思...</small></li><li><a href="http://zhiqiang.org/blog/it/dreamhost-on-gzip-cache.html">Dreamhost上的GZIP &#038; Cache</a> <small>用WordPress的都知道，WordPress可以打开GZIP传输，压缩比率能达到60%到80%。下表是本blog首页在Web Page Analyzer上的测试报告，此页面上包括css, js所有东西加...</small></li><li><a href="http://zhiqiang.org/blog/it/wordpress-reinstall-the-opening-fanfou-module.html">重装WordPress &#038; 启用fanfou模块</a> <small>最近blog出问题太多了，不知道为何所有php页面全部变成空白，不得已重新安装了WordPress。

重装WP很简单，把options表删掉就可以重装了，原来的所有...</small></li></ul></div>    <p></p>
    <hr noshade style="margin:0;height:1px" />
    <p>&copy; zhiqiang for <a href="http://zhiqiang.org/blog">阅微堂</a>, 2009. | <a href="http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html#comments">15 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>加速blog：服务器端的中转和缓存</title>
		<link>http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html</link>
		<comments>http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html#comments</comments>
		<pubDate>Sun, 16 Dec 2007 09:12:08 +0000</pubDate>
		<dc:creator>zhiqiang</dc:creator>
				<category><![CDATA[IT技术]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[网站提速]]></category>

		<guid isPermaLink="false">http://zhiqiang.org/blog/?p=721</guid>
		<description><![CDATA[前面已经提到了浏览器端的缓存，通过适当的Header可以建议和命令浏览器缓存页面内容比如javascript, css, 图片等。这里的服务器端的缓存又是什么意思呢？
现在很多网站都提供了API，提供比如JSON这样的数据方式以便在blog上引用。比如说picasaweb，我们可以用它来做一个picasa web album的站内镜像，但它的一个缺点就是慢，每次从Google服务器下载会json都会让我的blog停顿2到3秒钟，这...]]></description>
			<content:encoded><![CDATA[<p>前面已经提到了浏览器端的缓存，通过适当的Header可以建议和命令浏览器缓存页面内容比如javascript, css, 图片等。这里的服务器端的缓存又是什么意思呢？</p>
<p>现在很多网站都提供了API，提供比如JSON这样的数据方式以便在blog上引用。比如说picasaweb，我们可以用它来做一个picasa web album的站内镜像，但它的一个缺点就是慢，每次从Google服务器下载会json都会让我的blog停顿2到3秒钟，这让我很不爽。</p>
<p>但利用我的三线服务器，每次我需要数据的时候，我不是直接引用Google提供的js文件，而是通过我自己的服务器来中转这个数据，由于我自己的服务器无论同我自己还是同Google的服务器之间都有很好的速度，从而使得比我直接引用Google的文件还要快。</p>
<p>这便是服务器的中转。更具体的例子是Google Picasa Web提供给我显示相册列表的JSON地址为<a title="http://picasaweb.google.com/data/feed/base/user/$username?category=album&amp;alt=json&amp;access=public" href="http://picasaweb.google.com/data/feed/base/user/$username?category=album&amp;alt=json&amp;access=public">http://picasaweb.google.com/data/feed/base/user/$username?category=album&amp;alt=json</a>，我只需要像下面这样引用，便能拿到我的相册数据，</p>
<blockquote><pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;text/javascript&quot;</span> <span style="color: #ff0000">src</span>=<span style="color: #0000ff">&quot;http://picasaweb.google.com/data/feed/base/user/mathzqy?category=album&amp;alt=json&amp;callback=showalbum&quot;</span><span style="color: #0000ff">&gt;</span>
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span></pre>
</blockquote>
<p>然后我可以再写一个showalbum的js函数来控制相册的显示方式。但在实际中我并没有用这种方式，而是通过一个后台的PHP处理文件来中转这个文件，最后我是这样获取相册数据的：</p>
<blockquote>
<pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">script</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;text/javascript&quot;</span><span style="color: #0000ff">&gt;</span>
	document.write('<span style="color: #0000ff">&lt;</span><span style="color: #800000">scrip' + 't</span> <span style="color: #ff0000">type</span>=<span style="color: #0000ff">&quot;text/javascript&quot;</span> <span style="color: #ff0000">src</span>=<span style="color: #0000ff">&quot;feed.php?type=js&amp;uri=' + encodeURIComponent('http://picasaweb.google.com/data/feed/base/user/mathzqy?category=album&amp;alt=json&amp;callback=showalbum') + '&quot;</span><span style="color: #0000ff">&gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s' + 'cript</span><span style="color: #0000ff">&gt;</span>');
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">script</span><span style="color: #0000ff">&gt;</span></pre>
</blockquote>
<p>也就是说我向<a href="http://zhiqiang.org/feed.php">http://zhiqiang.org/feed.php</a>索要所需要的js文件，feed.php在服务器上会从Google的服务器上下载所需要的文件，然后转发给我。由于服务器同Google的服务器之间的连接更快更稳定，所以这样比我直接向Google索要此文件还要快。</p>
<p>通过服务器中转的更大的好处是，我可以在服务器上缓存数据。这样不同的用户所要相同的文件时，服务器端可以直接从缓存里读取文件发送给用户，这样速度就更快了。缓存有两种形式，存到数据库或者缓存到文件里。著名的Twitter Tools便将数据缓存在数据库里，每1小时更新一次。当如果自己写的话，缓存到文件更方便。下面的feed.php为一个简单的服务器端中转和缓存处理代码(注意修改$cache_path和$snoopy_file路径)：</p>
<blockquote>
<pre><span style="color: #0000ff">&lt;?</span>php
  <span style="color: #008000">// feed.php, to cache and transfer data</span>
  <span style="color: #008000">// example: feed.php?uri=http://zhiqiang.org/blog/feed&amp;type=xml</span>

  <span style="color: #008000">// the request uri  </span>
  $rss_uri = <a style="color: #ffa500" href="http://www.php.net/stripslashes">stripslashes</a>($_REQUEST['<span style="color: #8b0000">uri</span>']);
  $rss_uri = <a style="color: #ffa500" href="http://www.php.net/str_replace">str_replace</a>(<a style="color: #ffa500" href="http://www.php.net/array">array</a>('<span style="color: #8b0000">&quot;</span>', '<span style="color: #8b0000"> </span>'), <a style="color: #ffa500" href="http://www.php.net/array">array</a>('<span style="color: #8b0000">%22</span>','<span style="color: #8b0000">%20</span>'), $rss_uri);
  <span style="color: #008000">// the request file type</span>
  $file_type  = isset($_REQUEST['<span style="color: #8b0000">type</span>']) ? $_REQUEST['<span style="color: #8b0000">type</span>'] : '<span style="color: #8b0000">xml</span>';
  <span style="color: #008000">// the refresh time, control how much time the cache kept, </span>
  <span style="color: #008000">// default cache 1 hour.</span>
  $refresh    = isset($_REQUEST['<span style="color: #8b0000">refresh</span>']) ? $_REQUEST['<span style="color: #8b0000">refresh</span>'] : 3600000;
  <span style="color: #008000">// the cache file directory, make sure the directory is writeable</span>
  $cache_path = '<span style="color: #8b0000">cache/</span>';
  <span style="color: #008000">// this script need class snoopy.</span>
  $snoopy_file = '<span style="color: #8b0000">/wp-includes/class-snoopy.php</span>';

  <span style="color: #008000">// send HTTP header</span>
  <a style="color: #0000ff" href="http://www.php.net/switch">switch</a> ($file_type){
    <a style="color: #0000ff" href="http://www.php.net/case">case</a> '<span style="color: #8b0000">css</span>':
      <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Content-type: text/css</span>&quot;);
      <a style="color: #0000ff" href="http://www.php.net/break">break</a>;
    <a style="color: #0000ff" href="http://www.php.net/case">case</a> '<span style="color: #8b0000">js</span>' :
      <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Content-type: application/x-javascript</span>&quot;);
      <a style="color: #0000ff" href="http://www.php.net/break">break</a>;
    <a style="color: #0000ff" href="http://www.php.net/case">case</a> '<span style="color: #8b0000">gif</span>':
      <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Content-type: image/gif</span>&quot;);
      <a style="color: #0000ff" href="http://www.php.net/break">break</a>;
    <a style="color: #0000ff" href="http://www.php.net/case">case</a> '<span style="color: #8b0000">jpg</span>':
      <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Content-type: image/jpeg</span>&quot;);
      <a style="color: #0000ff" href="http://www.php.net/break">break</a>;
    <a style="color: #0000ff" href="http://www.php.net/case">case</a> '<span style="color: #8b0000">png</span>':
      <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Content-type: image/png</span>&quot;);
      <a style="color: #0000ff" href="http://www.php.net/break">break</a>;
    <a style="color: #0000ff" href="http://www.php.net/default">default</a>:
      <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Content-type: text/plain</span>&quot;);
  }

  $rss_hash = md5($rss_uri);
  $cache_rss_path = $cache_path.$rss_hash.'<span style="color: #8b0000">.</span>'.$file_type;
  <a style="color: #0000ff" href="http://www.php.net/if">if</a> ( !<a style="color: #ffa500" href="http://www.php.net/is_file">is_file</a>($cache_rss_path) || <a style="color: #ffa500" href="http://www.php.net/time">time</a>()-<a style="color: #ffa500" href="http://www.php.net/filemtime">filemtime</a>($cache_rss_path) &gt; $refresh) {
    <a style="color: #0000ff" href="http://www.php.net/if">if</a> (!<a style="color: #ffa500" href="http://www.php.net/class_exists">class_exists</a>('<span style="color: #8b0000">Snoopy</span>')) <a style="color: #0000ff" href="http://www.php.net/require_once">require_once</a> ($snoopy_file);

    $snoopy = new Snoopy;
    $snoopy-&gt;fetch($rss_uri);
    <span style="color: #008000">// this will copy the created tex-image to your cache-folder</span>
    $cache_file = <a style="color: #ffa500" href="http://www.php.net/fopen">fopen</a>($cache_rss_path, '<span style="color: #8b0000">w</span>');
    <a style="color: #ffa500" href="http://www.php.net/fputs">fputs</a>($cache_file, $snoopy-&gt;results);
    <a style="color: #ffa500" href="http://www.php.net/fclose">fclose</a>($cache_file);

    <a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $snoopy-&gt;results;

  } <a style="color: #0000ff" href="http://www.php.net/else">else</a> {
    $content = file_get_contents ($cache_rss_path);
    <a style="color: #0000ff" href="http://www.php.net/echo">echo</a> $content;
  }
<span style="color: #0000ff">?&gt;</span></pre>
</blockquote>
<div><h2>相关文章</h2><ul><li><a href="http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html">加速blog：设置浏览器缓存</a> <small>在用户浏览blog的不同页面时，很多内容是重复的，比如相同的javascript，css，背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件，将...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-reduce-plugins.html">加速blog：减少和优化插件</a> <small>尽量少用含javascript和css的插件
很多插件作者需要为blog的慢速度负责。插件作者随意地往'wp_head'里安插js和css，导致很多blog的head部分越来越臃肿。

...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-http-headers.html">加速blog：HTTP Header</a> <small>本文隶属加速blog系列  HTTP请求和相应Header  一个经典的HTTP连接是，读者通过浏览器（下称为浏览器端），向服务器（下称为服务器端）申请浏览某网页...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-optimize-wordpress-database.html">加速blog：监测和优化WordPress数据库</a> <small>在WordPress生成页面时，最消耗时间的便是数据库查询了。
监测WordPress的数据库查询
WordPress内置了数据库缓存系统，安装插件WordPress Cache Inspect，它会...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-analysis-your-website.html">加速blog：速度检测</a> <small>本文隶属加速blog系列

既然我们要谈加速blog，第一重要的是给blog的速度一个量化的评价。

Firefox的fasterfox插件会在Firefox的右下角给出每个网页的载...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-optimize-wordpress.html">加速blog：优化WordPress程序效率</a> <small>这里本质上要谈的还是优化数据库的效率，不过是改写WordPress的代码使得降低数据库查询次数。
get_permalink函数
get_permalink函数非常好用，get_permalink($i...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-choose-appropriate-server.html">加速blog：选择合适的服务器</a> <small>要想打造一个响应快速的blog，一个快速的服务器（虚拟主机空间）是必不可少的。其实这才是决定因素，因为这可能会导致速度在数量级上的差距（我...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-cache-wordpress.html">加速blog：WordPress的缓存和静态化</a> <small>WordPress消耗时间最多的便是数据库的查询，所以缓存是一个比较好的解决方案。WordPress强大的'hook'机制，使得可以为之建立强大的缓存机制，从缓存数...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-factors-of-slowness.html">加速blog：网站响应缓慢的因素</a> <small>本文隶属加速blog系列 

为什么有的网站即点即开，有些却慢得要死？影响网站速度的因素有但不限于下面这些：许多因素会影响到网页初次访问的响...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-your-blog.html">加速blog：序</a> <small>这是一个介绍如何提速blog的系列文章，特别是基于WordPress的blog。通过这些方法，你我完全能做到一个飞速的blog，至少要比与你同服务器上的其它blog要...</small></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-cache-on-server.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html#comments">3 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>加速blog：设置浏览器缓存</title>
		<link>http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html</link>
		<comments>http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html#comments</comments>
		<pubDate>Sat, 01 Dec 2007 02:31:14 +0000</pubDate>
		<dc:creator>zhiqiang</dc:creator>
				<category><![CDATA[IT技术]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[网站提速]]></category>

		<guid isPermaLink="false">http://zhiqiang.org/blog/?p=708</guid>
		<description><![CDATA[在用户浏览blog的不同页面时，很多内容是重复的，比如相同的javascript，css，背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件，将大大降低页面产生的流量，从而降低页面载入时间。
根据服务器端的响应header（怎么看HTTP Header），一个文件对浏览器而言，有几级不同的缓存状态。

服务器端告诉浏览器不要缓存此文件，每次都到服务器上更新文件。 
服务器...]]></description>
			<content:encoded><![CDATA[<p>在用户浏览blog的不同页面时，很多内容是重复的，比如相同的javascript，css，背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件，将大大降低页面产生的流量，从而降低页面载入时间。</p>
<p>根据服务器端的响应header（<a href="http://zhiqiang.org/blog/posts/speedup-blog-http-headers.html">怎么看HTTP Header</a>），一个文件对浏览器而言，有几级不同的缓存状态。</p>
<ol>
<li>服务器端告诉浏览器不要缓存此文件，每次都到服务器上更新文件。 </li>
<li>服务器端没有给浏览器任何指示（此时我也不知道这时候浏览器将会怎么做），这种情况多为动态脚本（比如PHP）产生的文件。 </li>
<li>在上次传输中，服务器给浏览器发送了Last-Modified或Etag数据，再次浏览时浏览器将提交这些数据到服务器，验证本地版本是否最新的，如果为最新的则服务器返回304代码，告诉浏览器直接使用本地版本，否则下载新版本。一般来说，有且只有静态文件，服务器端才会给出这些数据。 </li>
<li>服务器强制要求浏览器缓存文件，并设置了过期时间。在缓存未到期之前，浏览器将直接使用本地缓存文件，不会与服务器端产生任何通信。 </li>
</ol>
<p>我们要做的是尽量强制浏览器到第四种状态，特别是对于javascript, css和图片等变动较少的文件。</p>
<p>对于PHP产生的动态内容，只需要在内容输出之前输出强制缓存的header即可，比如下面的代码即要求浏览器缓存文件1个月：</p>
<blockquote><pre><span style="color: #0000ff">&lt;?</span>php
  <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Cache-Control: public</span>&quot;);
  <a style="color: #ffa500" href="http://www.php.net/header">header</a>(&quot;<span style="color: #8b0000">Pragma: cache</span>&quot;);

  $offset = 1000*60*60*24; <span style="color: #008000">// cache 1 year</span>
  $ExpStr = &quot;<span style="color: #8b0000">Expires: </span>&quot;.<a style="color: #ffa500" href="http://www.php.net/gmdate">gmdate</a>(&quot;<span style="color: #8b0000">D, d M Y H:i:s</span>&quot;, <a style="color: #ffa500" href="http://www.php.net/time">time</a>() + $offset).&quot;<span style="color: #8b0000"> GMT</span>&quot;;
  <a style="color: #ffa500" href="http://www.php.net/header">header</a>($ExpStr);
<span style="color: #0000ff">?&gt;</span></pre>
</blockquote>
<p>对于静态文件，一般的服务器都支持第3级缓存状态。要想达到第四级的缓存效果，要么像之前GZIP压缩那样，用PHP外包一层，然后用PHP处理。要么需要服务器端的支持，APACHE的一个模块mod_expires支持给文件添加expires header。把下面的代码加入你的blog目录下的.htaccess文件，如果你的服务器安装了mod_expires模块，则将自动生效，图片等强制缓存一个月，html文档缓存10分钟。如果该模块没有安装，也不会出错。</p>
<blockquote>
<pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">IfModule</span> <span style="color: #ff0000">mod_expires</span>.<span style="color: #ff0000">c</span><span style="color: #0000ff">&gt;</span>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType text/css A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/html A600
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">&gt;</span></pre>
</blockquote>
<p>在<a href="http://www.askapache.com/htaccess/speed-up-sites-with-htaccess-caching.html" target="_blank">这里</a>有mod_expires更详细的文档和教程。不过我要说明的是，mod_expires在绝大多数服务器上都没安装 <img src='http://zhiqiang.org/blog/wp-includes/images/smilies/sad.gif' alt=':(' class='wp-smiley' /> ，因为虽然这个模块包含在Apache的发行版里，但并不是默认安装模块。</p>
<div><h2>相关文章</h2><ul><li><a href="http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html">加速blog：服务器端的中转和缓存</a> <small>前面已经提到了浏览器端的缓存，通过适当的Header可以建议和命令浏览器缓存页面内容比如javascript, css, 图片等。这里的服务器端的缓存又是什么意思...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-your-blog.html">加速blog：序</a> <small>这是一个介绍如何提速blog的系列文章，特别是基于WordPress的blog。通过这些方法，你我完全能做到一个飞速的blog，至少要比与你同服务器上的其它blog要...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-reduce-plugins.html">加速blog：减少和优化插件</a> <small>尽量少用含javascript和css的插件
很多插件作者需要为blog的慢速度负责。插件作者随意地往'wp_head'里安插js和css，导致很多blog的head部分越来越臃肿。

...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-http-headers.html">加速blog：HTTP Header</a> <small>本文隶属加速blog系列  HTTP请求和相应Header  一个经典的HTTP连接是，读者通过浏览器（下称为浏览器端），向服务器（下称为服务器端）申请浏览某网页...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-optimize-wordpress-database.html">加速blog：监测和优化WordPress数据库</a> <small>在WordPress生成页面时，最消耗时间的便是数据库查询了。
监测WordPress的数据库查询
WordPress内置了数据库缓存系统，安装插件WordPress Cache Inspect，它会...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-analysis-your-website.html">加速blog：速度检测</a> <small>本文隶属加速blog系列

既然我们要谈加速blog，第一重要的是给blog的速度一个量化的评价。

Firefox的fasterfox插件会在Firefox的右下角给出每个网页的载...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-optimize-wordpress.html">加速blog：优化WordPress程序效率</a> <small>这里本质上要谈的还是优化数据库的效率，不过是改写WordPress的代码使得降低数据库查询次数。
get_permalink函数
get_permalink函数非常好用，get_permalink($i...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-choose-appropriate-server.html">加速blog：选择合适的服务器</a> <small>要想打造一个响应快速的blog，一个快速的服务器（虚拟主机空间）是必不可少的。其实这才是决定因素，因为这可能会导致速度在数量级上的差距（我...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-cache-wordpress.html">加速blog：WordPress的缓存和静态化</a> <small>WordPress消耗时间最多的便是数据库的查询，所以缓存是一个比较好的解决方案。WordPress强大的'hook'机制，使得可以为之建立强大的缓存机制，从缓存数...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-website-with-css-sprites.html">用CSS Sprites让网站再加速</a> <small> 我对于blog的速度有着变态的需求. 网站速度与HTML请求数目有很直接的关系，所以我一直没有在网页上放过多的背景图片——注意这里有个网页加速的...</small></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-set-browser-cache.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html#comments">2 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用CSS Sprites让网站再加速</title>
		<link>http://zhiqiang.org/blog/it/speedup-website-with-css-sprites.html</link>
		<comments>http://zhiqiang.org/blog/it/speedup-website-with-css-sprites.html#comments</comments>
		<pubDate>Tue, 09 Oct 2007 08:30:22 +0000</pubDate>
		<dc:creator>zhiqiang</dc:creator>
				<category><![CDATA[IT技术]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[CSS Sprites]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[网站加速]]></category>
		<category><![CDATA[网页技术]]></category>

		<guid isPermaLink="false">http://zhiqiang.org/blog/posts/speedup-website-with-css-sprites.html</guid>
		<description><![CDATA[ 我对于blog的速度有着变态的需求. 网站速度与HTML请求数目有很直接的关系，所以我一直没有在网页上放过多的背景图片——注意这里有个网页加速的小技巧，对于网页上固定位置的图片，应该尽量使用CSS背景图片，而不要用img标签嵌入。
为减少页面上的背景图片数量，嵌入式图片是一个好主意，data: URL scheme可以让你把图片信息直接嵌入在CSS语句中，理论上而言这是最好的解...]]></description>
			<content:encoded><![CDATA[<p><img style="margin: 0px 10px 0px 0px" src="http://www.w3schools.com/css/logocss.gif" align="left"/> 我对于blog的速度有着变态的需求. 网站速度与HTML请求数目有很直接的关系，所以我一直没有在网页上放过多的背景图片——注意这里有个网页加速的小技巧，对于网页上固定位置的图片，应该尽量使用CSS背景图片，而不要用img标签嵌入。</p>
<p>为减少页面上的背景图片数量，嵌入式图片是一个好主意，<a href="http://tools.ietf.org/html/rfc2397"><code>data:</code> URL scheme</a>可以让你把图片信息直接嵌入在CSS语句中，理论上而言这是最好的解决方案。可惜目前IE不支持！又是万恶的IE。下面是效果图(Firefox有效)：</p>
<p align="center"><img alt="You see this because you are using IE!" src="data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAwAAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFzByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSpa/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJlZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uisF81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PHhhx4dbgYKAAA7"/></p>
<p>另外一个就是CSS Sprites了，很久以前就见到过，不过操作比较复杂，所以一直没有用。今天，看到一个<a href="http://realazy.org/blog/2007/10/08/css-sprites/" target="_blank">更详细的介绍</a>，而且Yahoo和Facebook都在用这种方式，见<a href="http://developer.yahoo.com/yui/build/assets/skins/sam/sprite.png" target="_blank" rel="nofollow">这里</a>和<a href="http://static.ak.facebook.com/images/sprite/icons.png?db3" target="_blank" rel="nofollow">这里</a>。我也决定紧跟一下潮流。</p>
<p>CSS Sprites就是将网页上所有的背景图片都放在一张大图片上，<a href="http://realazy.org/blog/2007/10/08/css-sprites/" target="_blank">更详细的介绍</a></p>
<blockquote><p>在需要用到图片的时候，现阶段是通过CSS属性<code>background-image</code>组合<code>background-repeat</code>, <code>background-position</code>等来实现......我们的主角是，你一定猜到了，就是<code>background-position</code>。通过调整<code>background-position</code>的数值，背景图片就能以不同的面貌出现在你眼前。其实图片整体面貌没有变，由于图片位置的改变，你看到只该看到的而已。就好比手表上的日期，你今天看到是21，明天看到是22，是因为它的<strong>position</strong>往上跳了一格。所以你也大概了解到，CSS Sprites一般只能使用到固定大小的盒子（box）里，这样才能够遮挡住不应该看到的部分。</p>
</blockquote>
<p>比如本站的所有背景图片已经整合成<a href="http://zhiqiang.org/blog/wp-content/themes/yuewei/images/b.gif" target="_blank">单独一张</a>，然后通过CSS定义背景：</p>
<blockquote><pre>.<span style="color: #800000">bloglines</span>, .<span style="color: #800000">zhuaxia</span>, .<span style="color: #800000">google</span>, {
    <span style="color: #ff0000">background-image</span>: <span style="color: #0000ff">url(images/b.gif)</span>;
}

.<span style="color: #800000">bloglines</span> { <span style="color: #ff0000">background-position</span>: <span style="color: #0000ff">0 -216px</span>; }
.<span style="color: #800000">zhuaxia</span> { <span style="color: #ff0000">background-position</span>: <span style="color: #0000ff">0 -332px</span>; }
.<span style="color: #800000">google</span> { <span style="color: #ff0000">background-position</span>: <span style="color: #0000ff">0 -448px</span>; }</pre>
</blockquote>
<p>上面这一段代码用同一张背景图片生成了Google，Zhuaxia，Bloglines的订阅图片。效果可见右侧栏的订阅区，与各自指定图片背景效果完全一样。</p>
<p>上面最麻烦的一个地方在于如何生成大图片，利用PhotoShop的Merge功能可以把图片整合在一起，但每个小图片在大图片的位置参数需要一个一个去弄，比较麻烦，但是比较自由。利用<a href="http://spritegen.website-performance.org/" target="_blank">CSS Sprites Generator</a>，一切都自动搞定。这个网站支持上传图片的ZIP压缩包，然后生成一张大图片，已经以图片文件名为类名的CSS语句，自动给出每个图片对应的位置。另外还可以设置各个小图片之间的间隔，以适应内容的适度拉伸。</p>
<p>btw，提一下一个APACHE的mod_expires模块，这个模块可以要求服务器缓存制定类型的文件。比如下面的语句(写入.htaccess文件)要求缓存图片, css, js等一个月：</p>
<blockquote><pre><span style="color: #0000ff">&lt;</span><span style="color: #800000">IfModule</span> <span style="color: #ff0000">mod_expires</span>.<span style="color: #ff0000">c</span><span style="color: #0000ff">&gt;</span>
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/png A2592000
ExpiresByType application/x-shockwave-flash A2592000
ExpiresByType text/css A2592000
ExpiresByType application/x-javascript A2592000
ExpiresByType text/html A600
<span style="color: #0000ff">&lt;/</span><span style="color: #800000">IfModule</span><span style="color: #0000ff">&gt;</span></pre>
</blockquote>
<p>不过似乎deamhost和bluehost都没有这个模块，但阅微堂所在的CPH服务器是有的...&nbsp; </p>
<div><h2>相关文章</h2><ul><li><a href="http://zhiqiang.org/blog/it/speedup-blog-about-javascript-css.html">加速blog：关于javascript(css)</a> <small>这里先谈一下关于javascript和CSS的问题。  压缩你的javascript和css  这里的压缩和前面的GZIP压缩不同，而是压缩空格，去除注释等，调整顺序等。如果你的...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-about-images.html">加速blog：处理页面图片</a> <small>作为文章的或者功能性的或者美学意义上的需求，现在blog越来越丰富多彩，图片也越来越多。  选择合适的图片尺寸  现在数码相机越来越好，动辄800...</small></li><li><a href="http://zhiqiang.org/blog/it/dreamhost-on-gzip-cache.html">Dreamhost上的GZIP &#038; Cache</a> <small>用WordPress的都知道，WordPress可以打开GZIP传输，压缩比率能达到60%到80%。下表是本blog首页在Web Page Analyzer上的测试报告，此页面上包括css, js所有东西加...</small></li><li><a href="http://zhiqiang.org/blog/it/innerhtml-2-cd-issue-dynamic-modification-table-function-of-js.html">innerHTML只读问题 &amp; 两个动态修改Table的js函数</a> <small>最近做社会实践项目遇到的一个问题，需要动态修改一个表格。本来以为要想修改一行，直接设置新的 tr.innerHTML即可。后来发现在Firefox下可行，但在IE...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-set-browser-cache.html">加速blog：设置浏览器缓存</a> <small>在用户浏览blog的不同页面时，很多内容是重复的，比如相同的javascript，css，背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件，将...</small></li><li><a href="http://zhiqiang.org/blog/it/speedup-blog-cache-on-server.html">加速blog：服务器端的中转和缓存</a> <small>前面已经提到了浏览器端的缓存，通过适当的Header可以建议和命令浏览器缓存页面内容比如javascript, css, 图片等。这里的服务器端的缓存又是什么意思...</small></li><li><a href="http://zhiqiang.org/blog/it/using-htaccess-to-speed-blog.html">设置blog的缓存和压缩</a> <small>在网站根目录下的.htaccess文件中添加以下代码  &lt;IfModule mod_expires.c&gt;
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/pn...</small></li><li><a href="http://zhiqiang.org/blog/it/cross-domain-clipboard-achieve-highly-adaptive-iframe.html">剪贴板实现跨域iframe高度自适应</a> <small> 这两天玩xiaonei用到的一个技术，虽说是跨域iframe，但要求对外部网页和内部网页都有编辑权限，所以只能用在一些特殊场合。 如果是域内的iframe，高...</small></li><li><a href="http://zhiqiang.org/blog/it/ucweb7-support-some-css.html">UCWEB7增加了对CSS的支持</a> <small>UCWEB7正式版声称增加了对某些CSS的支持，昨晚上调试blog的手机版，发现它的确增加了对某些css的功能：

	现在h1,h2,h3,p等标签都有默认式样了，比如h1,...</small></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-website-with-css-sprites.html">&#38142;&#25509;</a> | <a href="http://zhiqiang.org/blog/it/speedup-website-with-css-sprites.html#comments">17 &#26465;&#35780;&#35770;</a></p>]]></content:encoded>
			<wfw:commentRss>http://zhiqiang.org/blog/it/speedup-website-with-css-sprites.html/feed</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
	</channel>
</rss>
