<?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>芒果小站</title>
	<atom:link href="http://www.mangguo.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mangguo.org</link>
	<description>这里不卖芒果，请另寻他处购买！</description>
	<lastBuildDate>Wed, 09 May 2012 10:40:51 +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>PHP 获取目录的 md5 序列值</title>
		<link>http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/</link>
		<comments>http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/#comments</comments>
		<pubDate>Wed, 09 May 2012 10:40:51 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[MD5]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6761</guid>
		<description><![CDATA[PHP 获取目录的 md5 序列值，代码摘录，以备不时之需。 /** * 获取目录的 md5 序列值 * @param string $dir 目录路径 * @return string */ if ( ! function_exists('md5_folder')) { function md5_folder ($dir) { if (!is_dir($dir)) { return false; } $filemd5s = array(); $d = dir($dir); while (false !== ($entry = $d->read())) { if ($entry != '.' &#038;&#038; $entry != '..' &#038;&#038; [...]]]></description>
			<content:encoded><![CDATA[<p><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/php">PHP</a></span> 获取目录的 md5 序列值，代码摘录，以备不时之需。</p>
<pre>/**
 * 获取目录的 md5 序列值
 * @param string $dir 目录路径
 * @return string
 */
if ( ! function_exists('md5_folder'))
{
	function md5_folder ($dir) {

		if (!is_dir($dir)) {
			return false;
		}

		$filemd5s = array();
		$d = dir($dir);

		while (false !== ($entry = $d->read())) {
			if ($entry != '.' &#038;&#038; $entry != '..' &#038;&#038; $entry != '.svn') {
				if (is_dir($dir.'/'.$entry)) {
					$filemd5s[] = md5_folder($dir.'/'.$entry);
				} else {
					$filemd5s[] = md5_file($dir.'/'.$entry);
				}
			}
		}
		$d->close();
		return md5(implode('', $filemd5s));
	}
}</pre>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li><li><a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/" title="file_put_contents 高并发与独占锁定">file_put_contents 高并发与独占锁定</a> (1)</li><li><a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/" title="CodeIgniter 引入自定义公共函数">CodeIgniter 引入自定义公共函数</a> (4)</li><li><a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/" title="PHP 函数 scandir 排除特定目录">PHP 函数 scandir 排除特定目录</a> (13)</li><li><a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/" title="使用 rmdir 函数递归删除非空目录">使用 rmdir 函数递归删除非空目录</a> (1)</li><li><a href="http://www.mangguo.org/the-simple-php-cache-class/" title="简单至极的 PHP 缓存类">简单至极的 PHP 缓存类</a> (9)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li><li><a href="http://www.mangguo.org/php-hex-color-to-rgb-color/" title="16 进制颜色转换为 RGB 色值">16 进制颜色转换为 RGB 色值</a> (2)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/">固定链接</a> | <a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/#comments">3 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/md5/" rel="tag">MD5</a>, <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>放一些百度网盘邀请码</title>
		<link>http://www.mangguo.org/baidu-disk-invitation/</link>
		<comments>http://www.mangguo.org/baidu-disk-invitation/#comments</comments>
		<pubDate>Tue, 08 May 2012 10:39:38 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[软件]]></category>
		<category><![CDATA[Baidu]]></category>
		<category><![CDATA[Dropbox]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6754</guid>
		<description><![CDATA[百度网盘（http://pan.baidu.com）上线啦，强大的国产网盘，同步速度秒杀 dropbox 啊！ 【百度网盘小科普】 1） 15GB 初始空间，免费自动扩容 2） 随时随地跨平台访问、共享云端文件 3） 云端文件自动分类，一目了然 4） 超大单文件快速上传，无限速、少约束 5） 依托百度稳固的存储机制，一份文件多份备份，防范一切意外 6） 免费无限制外链分享，短信和邮件加密分享 7） 离线下载，快捷省时又省力 8） 图片、文档、音乐等在线预览/播放 成功邀请好友，双方都可以获得 300M 的空间奖励，每个人仅有 10 位邀请名额，最多可获得 3G 的奖励空间。放一些刚得到的邀请码： 1、http://pan.baidu.com/netdisk/beinvited?invite_code=eebe051a82dda5155c54b7d9890c4002 2、http://pan.baidu.com/netdisk/beinvited?invite_code=24c1dfb399ac33df018a753fc4c719d9 3、http://pan.baidu.com/netdisk/beinvited?invite_code=a658d899a9ce4d331c9eb3ae06cee343 4、http://pan.baidu.com/netdisk/beinvited?invite_code=80db0c2526d693bf88546ed3eaadbadc 5、http://pan.baidu.com/netdisk/beinvited?invite_code=5ae1770fd3351722f6dc835f29f3ad3b 6、http://pan.baidu.com/netdisk/beinvited?invite_code=df1009a78b5fb6ce78cf22942d4ed4ce 7、http://pan.baidu.com/netdisk/beinvited?invite_code=1107f76c499283a53c4c4ff0d9c143c2 8、http://pan.baidu.com/netdisk/beinvited?invite_code=f1790d399dac9e03ea81e24facbbf2d1 9、http://pan.baidu.com/netdisk/beinvited?invite_code=f2b857597f766851f3e805c1c452fc4b 10、http://pan.baidu.com/netdisk/beinvited?invite_code=f1790d399dac9e03ea81e24facbbf2d1 推荐阅读把 Dropbox 根目录当 htdocs 用 (14)SugarSync，文档远程同步存储服务 (10)没有备案如何通过百度联盟？ (32)Dropbox，桌面应用式在线存储服务 (2)4 大博客搜索引擎提交入口 (1) © 2010 芒果小站 &#124; 固定链接 &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>百度网盘（<a href="http://pan.baidu.com/" target="_blank">http://pan.baidu.com</a>）上线啦，强大的国产网盘，同步速度秒杀 dropbox 啊！</p>
<p><a href="http://www.mangguo.org/wp-content/uploads/2012/05/baidu_wangpan.jpg"><img class="alignnone size-full wp-image-6755" title="baidu_wangpan" src="http://www.mangguo.org/wp-content/uploads/2012/05/baidu_wangpan.jpg" alt="" width="500" height="286" /></a></p>
<p><strong>【百度网盘小科普】 </strong><br />
1） 15GB 初始空间，免费自动扩容<br />
2） 随时随地跨平台访问、共享云端文件<br />
3） 云端文件自动分类，一目了然<br />
4） 超大单文件快速上传，无限速、少约束<br />
5） 依托百度稳固的存储机制，一份文件多份备份，防范一切意外<br />
6） 免费无限制外链分享，短信和邮件加密分享<br />
7） 离线下载，快捷省时又省力<br />
8） 图片、文档、音乐等在线预览/播放</p>
<p>成功邀请好友，双方都可以获得 300M 的空间奖励，每个人仅有 10 位邀请名额，最多可获得 3G 的奖励空间。放一些刚得到的邀请码：</p>
<p>1、http://pan.baidu.com/netdisk/beinvited?invite_code=eebe051a82dda5155c54b7d9890c4002<br />
2、http://pan.baidu.com/netdisk/beinvited?invite_code=24c1dfb399ac33df018a753fc4c719d9<br />
3、http://pan.baidu.com/netdisk/beinvited?invite_code=a658d899a9ce4d331c9eb3ae06cee343<br />
4、http://pan.baidu.com/netdisk/beinvited?invite_code=80db0c2526d693bf88546ed3eaadbadc<br />
5、http://pan.baidu.com/netdisk/beinvited?invite_code=5ae1770fd3351722f6dc835f29f3ad3b<br />
6、http://pan.baidu.com/netdisk/beinvited?invite_code=df1009a78b5fb6ce78cf22942d4ed4ce<br />
7、http://pan.baidu.com/netdisk/beinvited?invite_code=1107f76c499283a53c4c4ff0d9c143c2<br />
8、http://pan.baidu.com/netdisk/beinvited?invite_code=f1790d399dac9e03ea81e24facbbf2d1<br />
9、http://pan.baidu.com/netdisk/beinvited?invite_code=f2b857597f766851f3e805c1c452fc4b<br />
10、http://pan.baidu.com/netdisk/beinvited?invite_code=f1790d399dac9e03ea81e24facbbf2d1</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/use-dropbox-root-directory-as-htdoc/" title="把 Dropbox 根目录当 htdocs 用">把 Dropbox 根目录当 htdocs 用</a> (14)</li><li><a href="http://www.mangguo.org/sugarsync-file-remote-sync-storage-service/" title="SugarSync，文档远程同步存储服务">SugarSync，文档远程同步存储服务</a> (10)</li><li><a href="http://www.mangguo.org/how-to-approve-baidu-union-without-beian/" title="没有备案如何通过百度联盟？">没有备案如何通过百度联盟？</a> (32)</li><li><a href="http://www.mangguo.org/dropbox-desktop-application-online-disk-service/" title="Dropbox，桌面应用式在线存储服务">Dropbox，桌面应用式在线存储服务</a> (2)</li><li><a href="http://www.mangguo.org/4-blog-search-engine-submit-portal/" title="4 大博客搜索引擎提交入口">4 大博客搜索引擎提交入口</a> (1)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/baidu-disk-invitation/">固定链接</a> | <a href="http://www.mangguo.org/baidu-disk-invitation/#comments">7 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/baidu/" rel="tag">Baidu</a>, <a href="http://www.mangguo.org/tag/dropbox/" rel="tag">Dropbox</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/baidu-disk-invitation/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>浏览器缓存机制详解</title>
		<link>http://www.mangguo.org/browser-cache-mechanism-detailed/</link>
		<comments>http://www.mangguo.org/browser-cache-mechanism-detailed/#comments</comments>
		<pubDate>Tue, 08 May 2012 05:30:53 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[Cache-Control]]></category>
		<category><![CDATA[Etag]]></category>
		<category><![CDATA[Expires]]></category>
		<category><![CDATA[Last-Modified]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6742</guid>
		<description><![CDATA[浏览器缓存 浏览器缓存的知识是前端工程师必须要掌握的，因为这些知识直接影响到你的页面的用户体验，影响到你的页面的加载策略。接下来将要详细的讲述浏览器缓存的概 念和原理，新人要仔细阅读，甚至要多次反刍，缓存的知识除了和浏览器有关，还涉及到HTTP协议，所以这也是比较难于掌握的内容。 一般在硬件中，缓存在硬件中分一级缓存，二级缓存。但在软件中的缓存却不一样。 狭义上讲缓存就叫高速缓存，严格讲就是将数据暂时存放到某个地方。先要声明下，我的定义可能不严格，但这是我的理解，通俗易懂。 至于存到什么地方就有很多方式，可放到文件，内存中（如session），还有cache（高速缓存），还有 cookie，session，viewstate，这些是我们经常用到的，但可以认为他们是缓存数据。其实cache跟session有相似功能，但 cache可在代码中设置过期时间，依赖项。所谓依赖项（例如：微软的类cachedependcy sqlCacheDependency）当依赖项变动了，系统会通知cache过期，无效。以上只是说缓存，缓存可是有服务器缓存，客户端缓存啊。 近些天研究了下客户端缓存（即浏览器缓存），我想跟大家分享，有什么不同意见可评论。 估计大多数人很少说客户端缓存，包括我在内。那是因为我们编程时基本不考虑客户端缓存，书上也写得少。其实浏览器自动会管理缓存，但了解它至少知道有这么回事，有事编程还要控制客户端缓存。 浏览器缓存就是当你打开一个网页，浏览器会自动下载副本到你电脑上，就相当于你另存为网页到某个地方而已，只不过这里是自动而已。当然不是浏览器能把各种 网页都能下载到本地电脑上，它是有特殊情况。一般html，后者request是get请求，而post一般不缓存。（这个后面会说到） 当然客户端缓存是否需要是可以在服务端代码上控制的。那就是响应头。 响应头告诉缓存器不要保留缓存，缓存器就不会缓存相应内容； 如果请求信息是需要认证或者安全加密的，相应内容也不会被缓存； 校验参数非常重要，如果回应中1个参数都不存在，并且没有任何信息说明保鲜期（Expires或Cache-Control）的情况下，缓存将不会存储任何副本； 最常见的校验参数是文档的最后修改时间，通过最后Last-Modified头信息可以，当一份缓存包含Last-Modified信息，他基于此信息，通过添加一个If-Modified-Since请求参数，向服务器查询：这个副本从上次查看后是否被修改了。 HTTP 1.1介绍了另外一个校验参数： ETag，服务器是服务器生成的唯一标识符ETag，每次副本的标签都会变化。由于服务器控制了ETag如何生成，缓存服务器可以通过If-None-Match请求的返回没变则当前副本和原件完全一致。 所有的缓存服务器都使用Last-Modified时间来确定副本是否够新，而ETag校验正变得越来越流行。 响应头如果是POST模式递交数据，则返回的页面大部分不会被浏览器缓存，如果你发送内容通过URL和查询（通过GET模式），则返回的内容可以缓存下来供以后使用。 HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1)，Pragma(HTTP1.0)，last-Modified，Expires等。 缓存控制头 Cache-Control Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令 通常覆盖默认缓存算法。缓存指令是单向的，即请求中存在一个指令并不意味着响应中将存在同一个指令。 cache-control 定义是：Cache-Control = “Cache-Control” “:” cache-directive。表 1 展示了适用的值。 表 1. 常用 cache-directive 值 Cache-directive 说明 public 所有内容都将被缓存 private 内容只缓存到私有缓存中 no-cache 所有内容都不会被缓存 no-store 所有内容都不会被缓存到缓存或 Internet 临时文件中 must-revalidation/proxy-revalidation 如果缓存的内容失效，请求必须发送到服务器/代理以进行重新验证 max-age=xxx [...]]]></description>
			<content:encoded><![CDATA[<h3>浏览器缓存</h3>
<p>浏览器缓存的知识是前端工程师必须要掌握的，因为这些知识直接影响到你的页面的用户体验，影响到你的页面的加载策略。接下来将要详细的讲述浏览器缓存的概 念和原理，新人要仔细阅读，甚至要多次反刍，缓存的知识除了和浏览器有关，还涉及到HTTP协议，所以这也是比较难于掌握的内容。</p>
<p>一般在硬件中，缓存在硬件中分一级缓存，二级缓存。但在软件中的缓存却不一样。</p>
<p>狭义上讲缓存就叫高速缓存，严格讲就是将数据暂时存放到某个地方。先要声明下，我的定义可能不严格，但这是我的理解，通俗易懂。</p>
<p>至于存到什么地方就有很多方式，可放到文件，内存中（如session），还有cache（高速缓存），还有 cookie，session，viewstate，这些是我们经常用到的，但可以认为他们是缓存数据。其实cache跟session有相似功能，但 cache可在代码中设置过期时间，依赖项。所谓依赖项（例如：微软的类cachedependcy sqlCacheDependency）当依赖项变动了，系统会通知cache过期，无效。以上只是说缓存，缓存可是有服务器缓存，客户端缓存啊。</p>
<p>近些天研究了下客户端缓存（即浏览器缓存），我想跟大家分享，有什么不同意见可评论。</p>
<p>估计大多数人很少说客户端缓存，包括我在内。那是因为我们编程时基本不考虑客户端缓存，书上也写得少。其实浏览器自动会管理缓存，但了解它至少知道有这么回事，有事编程还要控制客户端缓存。</p>
<p>浏览器缓存就是当你打开一个网页，浏览器会自动下载副本到你电脑上，就相当于你另存为网页到某个地方而已，只不过这里是自动而已。当然不是浏览器能把各种 网页都能下载到本地电脑上，它是有特殊情况。一般html，后者request是get请求，而post一般不缓存。（这个后面会说到）</p>
<p>当然客户端缓存是否需要是可以在服务端代码上控制的。那就是响应头。</p>
<p>响应头告诉缓存器不要保留缓存，缓存器就不会缓存相应内容；</p>
<p>如果请求信息是需要认证或者安全加密的，相应内容也不会被缓存；</p>
<p>校验参数非常重要，如果回应中1个参数都不存在，并且没有任何信息说明保鲜期（Expires或Cache-Control）的情况下，缓存将不会存储任何副本； 最常见的校验参数是文档的最后修改时间，通过最后Last-Modified头信息可以，当一份缓存包含Last-Modified信息，他基于此信息，通过添加一个If-Modified-Since请求参数，向服务器查询：这个副本从上次查看后是否被修改了。 <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> 1.1介绍了另外一个校验参数： ETag，服务器是服务器生成的唯一标识符ETag，每次副本的标签都会变化。由于服务器控制了ETag如何生成，缓存服务器可以通过If-None-Match请求的返回没变则当前副本和原件完全一致。 所有的缓存服务器都使用Last-Modified时间来确定副本是否够新，而ETag校验正变得越来越流行。</p>
<p>响应头如果是POST模式递交数据，则返回的页面大部分不会被浏览器缓存，如果你发送内容通过URL和查询（通过GET模式），则返回的内容可以缓存下来供以后使用。</p>
<p>HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1)，Pragma(HTTP1.0)，last-Modified，Expires等。</p>
<h3>缓存控制头 Cache-Control</h3>
<p>Cache-Control 是最重要的规则。这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令。这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为。这些指令 通常覆盖默认缓存算法。缓存指令是单向的，即请求中存在一个指令并不意味着响应中将存在同一个指令。</p>
<p>cache-control 定义是：Cache-Control = “Cache-Control” “:” cache-directive。表 1 展示了适用的值。</p>
<p>表 1. 常用 cache-directive 值</p>
<table>
<tbody>
<tr>
<th>Cache-directive</th>
<th>说明</th>
</tr>
<tr>
<td>public</td>
<td>所有内容都将被缓存</td>
</tr>
<tr>
<td>private</td>
<td>内容只缓存到私有缓存中</td>
</tr>
<tr>
<td>no-cache</td>
<td>所有内容都不会被缓存</td>
</tr>
<tr>
<td>no-store</td>
<td>所有内容都不会被缓存到缓存或 Internet 临时文件中</td>
</tr>
<tr>
<td>must-revalidation/proxy-revalidation</td>
<td>如果缓存的内容失效，请求必须发送到服务器/代理以进行重新验证</td>
</tr>
<tr>
<td>max-age=xxx (xxx is numeric)</td>
<td>缓存的内容将在 xxx 秒后失效, 这个选项只在HTTP 1.1可用, 并如果和Last-Modified一起使用时, 优先级较高</td>
</tr>
</tbody>
</table>
<p>表 2 表明在不同的情形下，浏览器是将请求重新发送到服务器还是使用缓存的内容。</p>
<p>表 2. 对 cache-directive 值的浏览器响应</p>
<table>
<tbody>
<tr>
<th>Cache-directive</th>
<th>打开一个新的浏览器窗口</th>
<th>在原窗口中单击 Enter 按钮</th>
<th>刷新</th>
<th>单击 Back 按钮</th>
</tr>
<tr>
<td>public</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器</td>
<td>浏览器呈现来自缓存的页面</td>
</tr>
<tr>
<td>private</td>
<td>浏览器重新发送请求到服务器</td>
<td>第一次，浏览器重新发送请求到服务器；此后，浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器</td>
<td>浏览器呈现来自缓存的页面</td>
</tr>
<tr>
<td>no-cache/no-store</td>
<td>浏览器重新发送请求到服务器</td>
<td>浏览器重新发送请求到服务器</td>
<td>浏览器重新发送请求到服务器</td>
<td>浏览器重新发送请求到服务器</td>
</tr>
<tr>
<td>must-revalidation/proxy-revalidation</td>
<td>浏览器重新发送请求到服务器</td>
<td>第一次，浏览器重新发送请求到服务器；此后，浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器</td>
<td>浏览器呈现来自缓存的页面</td>
</tr>
<tr>
<td>max-age=xxx (xxx is numeric)</td>
<td>在 xxx 秒后，浏览器重新发送请求到服务器</td>
<td>在 xxx 秒后，浏览器重新发送请求到服务器</td>
<td>浏览器重新发送请求到服务器</td>
<td>在 xxx 秒后，浏览器重新发送请求到服务器</td>
</tr>
</tbody>
</table>
<p>Cache-Control是关于浏览器缓存的最重要的设置，因为它覆盖其他设置，比如 Expires 和 Last-Modified。另外，由于浏览器的行为基本相同，这个属性是处理跨浏览器缓存问题的最有效的方法。</p>
<h3>过期头 (Expires)</h3>
<p>Expires 头部字段提供一个日期和时间，响应在该日期和时间后被认为失效。失效的缓存条目通常不会被缓存（无论是代理缓存还是用户代理缓存）返回，除非首先通过原始 服务器（或者拥有该实体的最新副本的中介缓存）验证。（注意：cache-control max-age 和 s-maxage 将覆盖 Expires 头部。）</p>
<p>Expires 字段接收以下格式的值：“Expires: Sun, 08 Nov 2009 03:37:26 GMT”。如果查看内容时的日期在给定的日期之前，则认为该内容没有失效并从缓存中提取出来。反之，则认为该内容失效，缓存将采取一些措施。表 3-6 表明针对不同用户操作的不同浏览器的行为。</p>
<p>表 3. 当用户打开一个新的浏览器窗口时的失效操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容没有失效</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
</tr>
<tr>
<td>内容失效</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>表 4. 当用户在原始浏览器窗口中单击 Enter 按钮时的失效操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容没有失效</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
</tr>
<tr>
<td>内容失效</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>表 5. 当用户按 F5 键刷新页面时的失效操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容没有失效</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
</tr>
<tr>
<td>内容失效</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>表 6. 当用户单击 Back 或 Forward 按钮时的失效操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容没有失效</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
</tr>
<tr>
<td>内容失效</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>注意：所有浏览器都假定为使用默认设置运行。</p>
<h3>控制文件是否有修改 Last-Modified/E-Tag</h3>
<p>Last-Modified 实体头部字段值通常用作一个缓存验证器。简单来说，如果实体值在 Last-Modified 值之后没有被更改，则认为该缓存条目有效。ETag 响应头部字段值是一个实体标记，它提供一个 “不透明” 的缓存验证器。这可能在以下几种情况下提供更可靠的验证：不方便存储修改日期；HTTP 日期值的 one-second 解决方案不够用；或者原始服务器希望避免由于使用修改日期而导致的某些冲突。</p>
<p>不同的浏览器有不同的配置行为。表 7-10 表明针对不同用户操作的不同浏览器的行为。</p>
<p>表 7. 当用户打开一个新的浏览器窗口时的 Last-Modified E-Tag 操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容自上次访问以来没有被修改</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
</tr>
<tr>
<td>内容自上次访问以来已经被修改</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>表 8. 当用户在原始浏览器窗口中单击 Enter 按钮时的 Last-Modified E-Tag 操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容自上次访问以来没有被修改</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
</tr>
<tr>
<td>内容自上次访问以来已经被修改</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>表 9. 当用户按 F5 键刷新页面时的 Last-Modified E-Tag 操作</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容自上次访问以来没有被修改</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
<td>浏览器重新发送请求到服务器。返回代码是 304</td>
</tr>
<tr>
<td>内容自上次访问以来已经被修改</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>表 10. 没有缓存设置且用户单击 Back 或 Forward 按钮</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>内容自上次访问以来没有被修改</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
</tr>
<tr>
<td>内容自上次访问以来已经被修改</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器呈现来自缓存的页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>注意：所有浏览器都假定使用默认设置运行。</p>
<h3>不进行任何缓存相关设置</h3>
<p>如果您不定义任何缓存相关设置，则不同的浏览器有不同的行为。有时，同一个浏览器在相同的情形下每次运行时的行为都是不同的。情况可能很复杂。另外，有些不该缓存的内容如果被缓存，将会导致安全问题。 不同的浏览器有不同的行为。表 11 展示了不同的浏览器行为。</p>
<p>表 11. 没有缓存设置且用户打开一个新的浏览器窗口</p>
<table>
<tbody>
<tr>
<th></th>
<th><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/firefox">Firefox</a></span> 3.5</th>
<th><acronym title="Internet Explorer"><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span></acronym> 8</th>
<th>Chrome 3</th>
<th>Safari 4</th>
</tr>
<tr>
<td>打开一个新页面</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
<tr>
<td>在原始窗口中单击 Enter 按钮</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器呈现来自缓存的页面。</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
<tr>
<td>按 F5 键刷新</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
<tr>
<td>单击 Back 或 Forward 按钮</td>
<td>浏览器呈现来自缓存的页面。</td>
<td>浏览器呈现来自缓存的页面。</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
<td>浏览器重新发送请求到服务器。返回代码是 200</td>
</tr>
</tbody>
</table>
<p>注意：所有浏览器都假定使用默认设置运行。</p>
<h3>关键结论</h3>
<p>最后, 概括下关键的结论</p>
<table>
<tbody>
<tr>
<th>操作</th>
<th>行为</th>
</tr>
<tr>
<td>打开新窗口</td>
<td>如果指定cache- control的值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。而如果指定了 max-age值,那么在此值内的时间里就不会重新访问服务器,例如：Cache-control: max-age=5 表示当访问此网页后的5秒内再次访问不会去服务器.</td>
</tr>
<tr>
<td>在地址栏回车</td>
<td>如果值为private或must-revalidate,则只有第一次访问时会访问服务器,以后就不再访问。如果值为no-cache,那么每次都会访问。如果值为max-age,则在过期之前不会重复访问。</td>
</tr>
<tr>
<td>按后退按扭</td>
<td>如果值为private、must-revalidate、max-age,则不会重访问,而如果为no-cache,则每次都重复访问.</td>
</tr>
<tr>
<td>按刷新按扭</td>
<td>无论为何值,都会重复访问.</td>
</tr>
</tbody>
</table>
<p>来自：<a href="http://wiki.ued.taobao.net/doku.php?id=ued.bj:f2e:browser_cache_tech" target="_blank">http://wiki.ued.taobao.net/doku.php?id=ued.bj:f2e:browser_cache_tech</a></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/browser-cache-mechanism-detailed/">固定链接</a> | <a href="http://www.mangguo.org/browser-cache-mechanism-detailed/#comments">2 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/cache-control/" rel="tag">Cache-Control</a>, <a href="http://www.mangguo.org/tag/etag/" rel="tag">Etag</a>, <a href="http://www.mangguo.org/tag/expires/" rel="tag">Expires</a>, <a href="http://www.mangguo.org/tag/last-modified/" rel="tag">Last-Modified</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/browser-cache-mechanism-detailed/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>罗赛塔翻译，专业的翻译服务</title>
		<link>http://www.mangguo.org/rosettatranslation-professional-translation-service/</link>
		<comments>http://www.mangguo.org/rosettatranslation-professional-translation-service/#comments</comments>
		<pubDate>Mon, 07 May 2012 10:45:47 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[mangguo]]></category>
		<category><![CDATA[Rosetta]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6734</guid>
		<description><![CDATA[罗赛塔翻译，是第一家专业的全外资多语言上海翻译公司，为不同的客户需求提供各种多语言集成翻译解决方案。 罗赛塔（Rosetta）是一家总部设立在伦敦的国际翻译公司，在 2008 年，该公司在上海设立了自己办事处，中文名为罗赛塔翻译上海有限公司。这也是上海第一家外商独资的翻译机构。因此也吸引了一大批优秀的客户，包括许多领先的外国公司，以及部分中国公司。 凭借深厚的项目翻译经验、和遍布全球的专业翻译人员资源，提供覆盖超过 150 种语言的文件翻译、抄录、字幕处理和本地化等多种服务，特别精于法律、财务、技术和医学翻译。 多语种支持 不同语言的翻译对于日常使用可以不重视准确性，但是在法律、金融、技术、医学等专业性强的文件翻译上，是绝对不允许有任何误解的。如果需要翻译这些不常见的不熟悉的外语，选择罗赛塔上海翻译公司是个好选择。 专业的服务 罗赛塔翻译公司拥有一个总公司，四个分公司，在翻译服务上拥有丰富的经验，做到专业，专注，力求以客户为首要位置，提供最优质的翻译服务。前不久，罗赛塔昆明翻译公司也正式成立，目的是为了中国的客户提供更便利的服务。拥有大量的老客户和良好的口碑也是罗塞塔翻译公司成功的最佳见证。 推荐阅读用一粒沙观看 (8)芒果小站新主题意见征集 (40)2012，芒果小站三周年 (31)招募一只前端开发攻城师 (79)程序员从入门到精通：芒果教你画小鸡 (21)站长军团，小众的站长查询工具 (19)今天心情好，发个博客！ (22)芒果 1 号主机开抢啦！ (38) © 2010 芒果小站 &#124; 固定链接 &#124; 没有评论 &#124; 标签 mangguo, Rosetta]]></description>
			<content:encoded><![CDATA[<p>罗赛塔翻译，是第一家专业的全外资多语言<a title="上海翻译" href="http://www.rosettatranslation.com.cn/expertise/" target="_blank">上海翻译</a>公司，为不同的客户需求提供各种多语言集成翻译解决方案。</p>
<p>罗赛塔（Rosetta）是一家总部设立在伦敦的国际翻译公司，在 2008 年，该公司在上海设立了自己办事处，中文名为罗赛塔翻译上海有限公司。这也是上海第一家外商独资的翻译机构。因此也吸引了一大批优秀的客户，包括许多领先的外国公司，以及部分中国公司。</p>
<p>凭借深厚的项目翻译经验、和遍布全球的专业翻译人员资源，提供覆盖超过 150 种语言的文件翻译、抄录、字幕处理和本地化等多种服务，特别精于法律、财务、技术和<a title="医学翻译" href="http://www.rosettatranslation.com.cn/expertise/technical_translation/" target="_blank">医学翻译</a>。</p>
<p><strong>多语种支持</strong></p>
<p>不同语言的翻译对于日常使用可以不重视准确性，但是在法律、金融、技术、医学等专业性强的文件翻译上，是绝对不允许有任何误解的。如果需要翻译这些不常见的不熟悉的外语，选择罗赛塔<a title="上海翻译" href="http://www.rosettatranslation.com.cn/expertise/" target="_blank">上海翻译</a>公司是个好选择。</p>
<p><strong>专业的服务</strong></p>
<p>罗赛塔翻译公司拥有一个总公司，四个分公司，在翻译服务上拥有丰富的经验，做到专业，专注，力求以客户为首要位置，提供最优质的翻译服务。前不久，罗赛塔昆明翻译公司也正式成立，目的是为了中国的客户提供更便利的服务。拥有大量的老客户和良好的口碑也是罗塞塔翻译公司成功的最佳见证。</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/watch-with-a-sand/" title="用一粒沙观看">用一粒沙观看</a> (8)</li><li><a href="http://www.mangguo.org/new-mangguo-theme-for-comments/" title="芒果小站新主题意见征集">芒果小站新主题意见征集</a> (40)</li><li><a href="http://www.mangguo.org/2012-third-year-of-mangguo/" title="2012，芒果小站三周年">2012，芒果小站三周年</a> (31)</li><li><a href="http://www.mangguo.org/recruitment-of-a-few-front-end-development-engineer/" title="<font color="red">招募一只前端开发攻城师</font>"><font color="red">招募一只前端开发攻城师</font></a> (79)</li><li><a href="http://www.mangguo.org/from-the-entry-to-the-master-programmer-mango-chicken-teach-you-draw/" title="程序员从入门到精通：芒果教你画小鸡">程序员从入门到精通：芒果教你画小鸡</a> (21)</li><li><a href="http://www.mangguo.org/adminunion-webmaster-gadgets/" title="站长军团，小众的站长查询工具">站长军团，小众的站长查询工具</a> (19)</li><li><a href="http://www.mangguo.org/good-mood-post-a-blog/" title="今天心情好，发个博客！">今天心情好，发个博客！</a> (22)</li><li><a href="http://www.mangguo.org/mangguo-host-no-1/" title="芒果 1 号主机开抢啦！">芒果 1 号主机开抢啦！</a> (38)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/rosettatranslation-professional-translation-service/">固定链接</a> | <a href="http://www.mangguo.org/rosettatranslation-professional-translation-service/#comments">没有评论</a> | 标签 <a href="http://www.mangguo.org/tag/mangguo/" rel="tag">mangguo</a>, <a href="http://www.mangguo.org/tag/rosetta/" rel="tag">Rosetta</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/rosettatranslation-professional-translation-service/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP 和浏览器缓存机制</title>
		<link>http://www.mangguo.org/php-and-the-browser-cache-mechanism/</link>
		<comments>http://www.mangguo.org/php-and-the-browser-cache-mechanism/#comments</comments>
		<pubDate>Sun, 06 May 2012 16:12:27 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[Etag]]></category>
		<category><![CDATA[If-Modified-Since]]></category>
		<category><![CDATA[If-None-Match]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6722</guid>
		<description><![CDATA[站长军团（www.adminunion.com）的服务器放置在万网，由于站点流量不断增大，每个月都收到万网的流量超标警告，性能优化就迫在眉睫了。 访问站长军团时，服务器端对每次查询都会缓存，以和减少服务端重复计算的开销、提升二次访问时的速度体验。然而我恰恰忽略了浏览器端的缓存。 浏览器的缓存策略，会暂时将浏览过的文件缓存在本地磁盘。当用户重复请求页面时，告知客户端页面并没有发生改变，可以调用缓存。 那么如何知道客户端是否有页面缓存呢？从 HTTP 协议层面来说，浏览器发送请求时会先发送如下 HTTP 头： Connection Keep-Alive Date Sun, 06 May 2012 18:00:36 GMT Last-Modified Sun, 06 May 2012 17:31:02 GMT Etag ec1f629013925ab0fa4389ba926e8c06 Keep-Alive timeout=15, max=299 Server Apache/2.2.16 (Unix) DAV/2 Vary Accept-Encoding 请注意其中的这两行，描述了页面的缓存信息： Last-Modified Sun, 06 May 2012 17:31:02 GMT Etag ec1f629013925ab0fa4389ba926e8c06 这个情况下，如果服务器响应 304 状态码，浏览器会自觉地从缓存中读取数据；如果响应 200 状态码，不管有没有客户端缓存，照样从服务端读取。 按照这个理论支撑，比如站长军团大部分查询结果都是 ajax 异步获取的，二次访问就都可以通过这种方式进行缓存改造。只要客户端有缓存，就向客户端发送一个 304 响应状态码，然后退出程序执行。 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.adminunion.com/" target="_blank">站长军团（www.adminunion.com）</a>的服务器放置在万网，由于站点流量不断增大，每个月都收到万网的流量超标警告，性能优化就迫在眉睫了。</p>
<p>访问<a href="http://www.adminunion.com/" target="_blank">站长军团</a>时，服务器端对每次查询都会缓存，以和减少服务端重复计算的开销、提升二次访问时的速度体验。然而我恰恰忽略了浏览器端的缓存。</p>
<p>浏览器的缓存策略，会暂时将浏览过的文件缓存在本地磁盘。当用户重复请求页面时，告知客户端页面并没有发生改变，可以调用缓存。 那么如何知道客户端是否有页面缓存呢？从 HTTP 协议层面来说，浏览器发送请求时会先发送如下 HTTP 头：</p>
<pre>Connection	Keep-Alive
Date	Sun, 06 May 2012 18:00:36 GMT
Last-Modified	Sun, 06 May 2012 17:31:02 GMT
Etag	ec1f629013925ab0fa4389ba926e8c06
Keep-Alive	timeout=15, max=299
Server	Apache/2.2.16 (Unix) DAV/2
Vary	Accept-Encoding</pre>
<p>请注意其中的这两行，描述了页面的缓存信息：</p>
<pre>Last-Modified	Sun, 06 May 2012 17:31:02 GMT
Etag	ec1f629013925ab0fa4389ba926e8c06</pre>
<p>这个情况下，如果服务器响应 304 状态码，浏览器会自觉地从缓存中读取数据；如果响应 200 状态码，不管有没有客户端缓存，照样从服务端读取。</p>
<p>按照这个理论支撑，比如<a href="http://www.adminunion.com/" target="_blank">站长军团</a>大部分查询结果都是 ajax 异步获取的，二次访问就都可以通过这种方式进行缓存改造。只要客户端有缓存，就向客户端发送一个 304 响应状态码，然后退出程序执行。</p>
<p>浏览器发出的请求中包含 If-Modified-Since 和 If-None-Match 两个参数：</p>
<p>If-Modified-Since 表示询问数据的最后修改时间是否是某个时间值。然后服务器会检查数据的最后修改时间，如果是该时间则返回 304 状态码，客户端接收到该状态码后直接从本地读取缓存。这种情况有一个前置条件，即本地必须存在缓存资源，浏览器才会发送 If-Modified-Since 参数，并且值为上一次服务器返回的 Last-Modified 值。</p>
<p>If-None-Match 类似，它由服务器返回的 Etag 值生成，仅仅用于服务器检查数据的修改时间，可以是任意值。考虑到 If-Modified-Since 结合 Last-Modified 的方法并不被所有服务器支持，这里就只考虑使用 etag 的实现。</p>
<p><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/php">PHP</a></span> 中通过 $_SERVER['HTTP_IF_NONE_MATCH'] 可以判断文件是否被浏览器缓存，代码片段如下：</p>
<pre>//使用 etag 标记控制缓存
$etag = md5(date('Ymd'));
if ($_SERVER['HTTP_IF_NONE_MATCH'] == $etag) {
	header('Etag:' . $etag, true, 304);
	exit();
} else {
	header('Etag:' . $etag);
}</pre>
<p>这里我使用当日日期来生成 <code>etag</code>，这样可以保证缓存最多生效一天时间，这个参数可以根据需要修改。</p>
<p><strong>补充说明：</strong><br />
即便是 304 响应，实际上还是会请求服务端，因为需要建立连接来判断是否需要传输数据，304 缓存节约的是静态资源传输的开销；<br />
另一种缓存是 200 响应时的缓存，不建立连接但请求会响应 200 状态码，并从本地直接读取缓存。</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/" title="PHP 获取目录的 md5 序列值">PHP 获取目录的 md5 序列值</a> (3)</li><li><a href="http://www.mangguo.org/browser-cache-mechanism-detailed/" title="浏览器缓存机制详解">浏览器缓存机制详解</a> (2)</li><li><a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/" title="file_put_contents 高并发与独占锁定">file_put_contents 高并发与独占锁定</a> (1)</li><li><a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/" title="CodeIgniter 引入自定义公共函数">CodeIgniter 引入自定义公共函数</a> (4)</li><li><a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/" title="PHP 函数 scandir 排除特定目录">PHP 函数 scandir 排除特定目录</a> (13)</li><li><a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/" title="使用 rmdir 函数递归删除非空目录">使用 rmdir 函数递归删除非空目录</a> (1)</li><li><a href="http://www.mangguo.org/the-simple-php-cache-class/" title="简单至极的 PHP 缓存类">简单至极的 PHP 缓存类</a> (9)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/">固定链接</a> | <a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/#comments">3 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/etag/" rel="tag">Etag</a>, <a href="http://www.mangguo.org/tag/if-modified-since/" rel="tag">If-Modified-Since</a>, <a href="http://www.mangguo.org/tag/if-none-match/" rel="tag">If-None-Match</a>, <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/php-and-the-browser-cache-mechanism/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>6 个超级实用的 WordPress 奇技淫巧</title>
		<link>http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/</link>
		<comments>http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/#comments</comments>
		<pubDate>Tue, 01 May 2012 16:04:22 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[博客]]></category>
		<category><![CDATA[functions.php]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6668</guid>
		<description><![CDATA[ 1、防止自动压缩图片 WordPress 默认会在上传 jpg 图片时自动压缩。这有利于节省贷款，减少加载时间。假如你是个摄影爱好者，热衷于在博客上展现摄影作品的话，高质量的图片就尤其重要了，将以下代码添加到 functions.php 文件，快速禁用图片自动压缩。 add_filter('jpeg_quality', function($arg){return 100;}); 来自 http://www.wprecipes.com/prevent-wordpress-to-compress-your-jpg-images 2、为所有的链接添加 target=”_blank” 属性 为所有链接添加 target="_blank" 属性，可以参考芒果之前的文章《HTML 中的 base 标记简介》，当然将下面代码添加到 functions.php 文件，也可以实现这个小功能。 function autoblank($text) { $return = str_replace('&#60;a', '&#60;a target="_blank"', $text); return $return; } add_filter('the_content', 'autoblank'); 来自 http://www.catswhocode.com/blog/snippets/add-target_blank-on-all-link 3、阻止 WordPress 压缩 jpg 图片 编辑 functions.php 文件并添加以下代码： add_filter('jpeg_quality', function($arg){return 100;}); 4、无需插件实现 WordPress 翻页功能 在需要显示翻页的地方引用以下代码： global [...]]]></description>
			<content:encoded><![CDATA[<h2> 1、防止自动压缩图片</h2>
<p><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 默认会在上传 jpg 图片时自动压缩。这有利于节省贷款，减少加载时间。假如你是个摄影爱好者，热衷于在博客上展现摄影作品的话，高质量的图片就尤其重要了，将以下代码添加到 <code><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/functions-php">functions.php</a></span></code> 文件，快速禁用图片自动压缩。</p>
<pre>add_filter('jpeg_quality', function($arg){return 100;});</pre>
<p><strong>来自 <a href="http://www.wprecipes.com/prevent-wordpress-to-compress-your-jpg-images" target="_blank">http://www.wprecipes.com/prevent-wordpress-to-compress-your-jpg-images</a></strong></p>
<h2>2、为所有的链接添加 target=”_blank” 属性</h2>
<p>为所有链接添加 <code>target="_blank"</code> 属性，可以参考芒果之前的文章《<a href="../html-base-mark-brief-introduction/" target="_blank">HTML 中的 base 标记简介</a>》，当然将下面代码添加到 <code><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/functions-php">functions.php</a></span></code> 文件，也可以实现这个小功能。</p>
<pre>function autoblank($text) {
	$return = str_replace('&lt;a', '&lt;a target="_blank"', $text);
	return $return;
}
add_filter('the_content', 'autoblank');</pre>
<p><strong>来自 <a href="http://www.catswhocode.com/blog/snippets/add-target_blank-on-all-link" target="_blank">http://www.catswhocode.com/blog/snippets/add-target_blank-on-all-link</a></strong></p>
<h2>3、阻止 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 压缩 jpg 图片</h2>
<p>编辑 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/functions-php">functions.php</a></span> 文件并添加以下代码：</p>
<pre>add_filter('jpeg_quality', function($arg){return 100;});</pre>
<h2>4、无需插件实现 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 翻页功能</h2>
<p>在需要显示翻页的地方引用以下代码：</p>
<pre>global $wp_query;
$total = $wp_query-&gt;max_num_pages;
// only bother with the rest if we have more than 1 page!
if ( $total &gt; 1 )  {
     // get the current page
     if ( !$current_page = get_query_var('paged') )
          $current_page = 1;
     // structure of "format" depends on whether we're using pretty permalinks
     $format = empty( get_option('permalink_structure') ) ? '&amp;page=%#%' : 'page/%#%/';
     echo paginate_links(array(
          'base' =&gt; get_pagenum_link(1) . '%_%',
          'format' =&gt; $format,
          'current' =&gt; $current_page,
          'total' =&gt; $total,
          'mid_size' =&gt; 4,
          'type' =&gt; 'list'
     ));
}</pre>
<h2>5、自动替换文章中的字符</h2>
<p>比如你的博客名称换了，你希望老的文章里同样可以更换一些文案。使用以下代码可以轻松搞定，将其拷贝至 <code><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/functions-php">functions.php</a></span></code> 文件即可。</p>
<pre>function replace_text_wps($text){
    $replace = array(
        // 'WORD TO REPLACE' =&gt; 'REPLACE WORD WITH THIS'
        'wordpress' =&gt; '&lt;a href="#"&gt;wordpress&lt;/a&gt;',
        'excerpt' =&gt; '&lt;a href="#"&gt;excerpt&lt;/a&gt;',
        'function' =&gt; '&lt;a href="#"&gt;function&lt;/a&gt;'
    );
    $text = str_replace(array_keys($replace), $replace, $text);
    return $text;
}

add_filter('the_content', 'replace_text_wps');
add_filter('the_excerpt', 'replace_text_wps');</pre>
<p><strong>来自 <a href="http://wpsnipp.com/" target="_blank">http://wpsnipp.com/</a></strong></p>
<h2>6、移除评论中的链接</h2>
<p><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 默认会把带有链接的评论自动加上链接。这也给垃圾评论提供了滋生的土壤。</p>
<p>移除这些评论链接很简单，把以下代码贴到 <code><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/functions-php">functions.php</a></span> 文件就可以了。</code></p>
<pre>remove_filter('comment_text', 'make_clickable', 9);</pre>
<p><strong>来自 <a href="http://www.wprecipes.com/wordpress-hack-remove-autolinks-in-comments" target="_blank">http://www.wprecipes.com/wordpress-hack-remove-autolinks-in-comments</a></strong></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/10-useful-wordpress-hacks/" title="10 个实用的 WordPress 技巧教程">10 个实用的 WordPress 技巧教程</a> (28)</li><li><a href="http://www.mangguo.org/html5-support-for-wordpress/" title="为 WordPress 开启 HTML5 支持">为 WordPress 开启 HTML5 支持</a> (15)</li><li><a href="http://www.mangguo.org/automatically-notify-member-on-new-post/" title="博客内容更新时自动通知会员">博客内容更新时自动通知会员</a> (24)</li><li><a href="http://www.mangguo.org/remove-autolinks-in-comments/" title="禁止 WordPress 评论内容自动添加链接">禁止 WordPress 评论内容自动添加链接</a> (21)</li><li><a href="http://www.mangguo.org/insert-custom-content-after-each-post/" title="在 WordPress 文章后添加自定义内容">在 WordPress 文章后添加自定义内容</a> (0)</li><li><a href="http://www.mangguo.org/remove-wordpress-comment-link/" title="移除 WordPress 评论中的链接">移除 WordPress 评论中的链接</a> (0)</li><li><a href="http://www.mangguo.org/set-wordpress-default-editor-mode/" title="设置 WordPress 默认编辑器模式">设置 WordPress 默认编辑器模式</a> (0)</li><li><a href="http://www.mangguo.org/link-to-external-in-post-title/" title="使 WordPress 文章标题链向外部资源">使 WordPress 文章标题链向外部资源</a> (0)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/">固定链接</a> | <a href="http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/#comments">3 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/functions-php/" rel="tag">functions.php</a>, <a href="http://www.mangguo.org/tag/wordpress/" rel="tag">WordPress</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>file_put_contents 高并发与独占锁定</title>
		<link>http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/</link>
		<comments>http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 16:50:04 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[file_put_contents]]></category>
		<category><![CDATA[flock]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6704</guid>
		<description><![CDATA[发现高并发访问时使用 file_put_contents 写入文件造成数据置空。 查看官方文档： int file_put_contents ( string $filename , string $data [, int $flags [, resource $context ]] ) 参数： filename 要被写入数据的文件名。 data 要写入的数据。类型可以是 string，array 或者是 stream 资源（如上面所说的那样）。 flags flags 可以是 FILE_USE_INCLUDE_PATH，FILE_APPEND 和／或 LOCK_EX（获得一个独占锁定），然而使用 FILE_USE_INCLUDE_PATH 时要特别谨慎。 context 一个 context 资源。 直接直至 flags 参数为 LOCK_EX 即可在高并发时获得一个独占锁定。 另外，flock 函数的也提供了文件锁定方法： &#60;?php $fp = fopen("/tmp/lock.txt", "w+"); if (flock($fp, LOCK_EX)) { // 进行排它型锁定 fwrite($fp, "Write something here\n"); flock($fp, LOCK_UN); // 释放锁定 } else { echo "Couldn't lock the file !"; [...]]]></description>
			<content:encoded><![CDATA[<p>发现高并发访问时使用 <code>file_put_contents</code> 写入文件造成数据置空。</p>
<p>查看官方文档：</p>
<pre>int file_put_contents ( string $filename , string $data [, int $flags [, resource $context ]] )</pre>
<p>参数：</p>
<pre>filename
    要被写入数据的文件名。
data
    要写入的数据。类型可以是 string，array 或者是 stream 资源（如上面所说的那样）。
flags
    flags 可以是 FILE_USE_INCLUDE_PATH，FILE_APPEND 和／或 LOCK_EX（获得一个独占锁定），然而使用 FILE_USE_INCLUDE_PATH 时要特别谨慎。
context
    一个 context 资源。</pre>
<p>直接直至 <code>flags</code> 参数为 <code>LOCK_EX</code> 即可在高并发时获得一个独占锁定。</p>
<p>另外，<code>flock</code> 函数的也提供了文件锁定方法：</p>
<pre> &lt;?php

$fp = fopen("/tmp/lock.txt", "w+");

if (flock($fp, LOCK_EX)) { // 进行排它型锁定
fwrite($fp, "Write something here\n");
flock($fp, LOCK_UN); // 释放锁定
} else {
echo "Couldn't lock the file !";
}

fclose($fp);

?&gt; </pre>
<p>注意 flock() 需要一个文件指针。</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/" title="PHP 获取目录的 md5 序列值">PHP 获取目录的 md5 序列值</a> (3)</li><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li><li><a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/" title="CodeIgniter 引入自定义公共函数">CodeIgniter 引入自定义公共函数</a> (4)</li><li><a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/" title="PHP 函数 scandir 排除特定目录">PHP 函数 scandir 排除特定目录</a> (13)</li><li><a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/" title="使用 rmdir 函数递归删除非空目录">使用 rmdir 函数递归删除非空目录</a> (1)</li><li><a href="http://www.mangguo.org/the-simple-php-cache-class/" title="简单至极的 PHP 缓存类">简单至极的 PHP 缓存类</a> (9)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li><li><a href="http://www.mangguo.org/php-hex-color-to-rgb-color/" title="16 进制颜色转换为 RGB 色值">16 进制颜色转换为 RGB 色值</a> (2)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/">固定链接</a> | <a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/#comments">1 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/file_put_contents/" rel="tag">file_put_contents</a>, <a href="http://www.mangguo.org/tag/flock/" rel="tag">flock</a>, <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>深入理解 JavaScript 系列学习笔记</title>
		<link>http://www.mangguo.org/understanding-javascript-notes/</link>
		<comments>http://www.mangguo.org/understanding-javascript-notes/#comments</comments>
		<pubDate>Fri, 27 Apr 2012 13:11:08 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6672</guid>
		<description><![CDATA[《深入理解 JavaScript 系列》连载于汤姆大叔的博客，源于对 O&#8217;Reilly 新书《JavaScript Patterns》的摘要。这里记录一些不错的知识点，巩固下 JavaScript 基础知识。 一、编写高质量 JavaScript 代码的基本要点 1）全局下的 this 始终指向 window 对象本身 2）避免创建隐式全局变量，如 var a = b = 0; 中 a 是本地变量，b 是全局变量 3）使用 var 创建的全局变量无法被删除，不通过 var 创建的隐式全局变量可以被删除 4）隐式全局变量并不是真正的全局变量，而是全局对象 window 的属性。属性可以使用 delete 操作符删除，而变量不能 5）函数内任意位置声明多个 var 语句，和在函数顶部声明作用一致，这种行为称为 hoisting（悬置/置顶解析/预解析） 6）数组使用正常的 for 循环，对象使用 for...in 枚举，遍历对象属性时使用 hasOwnProperty() 过滤掉原型链属性 7）为避免隐式类型转换，比较值和表达式类型时建议使用 === 和 !== 操作符 二、揭秘命名函数表达式 略&#8230; [...]]]></description>
			<content:encoded><![CDATA[<p>《<a href="http://www.cnblogs.com/tomxu/archive/2011/12/15/2288411.html" target="_blank">深入理解 JavaScript 系列</a>》连载于汤姆大叔的博客，源于对 O&#8217;Reilly 新书《<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span> Patterns》的摘要。这里记录一些不错的知识点，巩固下 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span> 基础知识。</p>
<p><strong>一、编写高质量 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span> 代码的基本要点</strong></p>
<p>1）全局下的 <code>this</code> 始终指向 <code>window</code> 对象本身</p>
<p>2）避免创建隐式全局变量，如 <code>var a = b = 0;</code> 中 <code>a</code> 是本地变量，<code>b</code> 是全局变量</p>
<p>3）使用 <code>var</code> 创建的全局变量无法被删除，不通过 <code>var</code> 创建的隐式全局变量可以被删除</p>
<p>4）隐式全局变量并不是真正的全局变量，而是全局对象 <code>window</code> 的属性。属性可以使用 <code>delete</code> 操作符删除，而变量不能</p>
<p>5）函数内任意位置声明多个 <code>var</code> 语句，和在函数顶部声明作用一致，这种行为称为 <code>hoisting</code>（悬置/置顶解析/预解析）</p>
<p>6）数组使用正常的 <code>for</code> 循环，对象使用 <code>for...in</code> 枚举，遍历对象属性时使用 <code>hasOwnProperty()</code> 过滤掉原型链属性</p>
<p>7）为避免隐式类型转换，比较值和表达式类型时建议使用 <code>===</code> 和 <code>!==</code> 操作符</p>
<p><strong>二、揭秘命名函数表达式</strong></p>
<p>略&#8230;</p>
<p><strong>三、全面解析 Module 模式</strong></p>
<p>略&#8230;</p>
<p><strong>四、立即调用的函数表达式</strong></p>
<p>1）<code>function(){ /* code */ }();</code> 报错是因为解析器解析 <code>function</code> 关键字时，默认认为是声明，而不是表达式</p>
<p><strong>五、强大的原型和原型链</strong></p>
<p>1）原型可以赋值任何类型的对象，但是不能赋值原子类型的值（注：原子类型？谁给解释下？）</p>
<p>2）检查对象上某个属性是自身属性还是原型链属性，除 <code>hasOwnProperty</code> 外别无他法，另外 <code>hasOwnProperty</code> 不受保护，可以被覆盖</p>
<p><strong>六、S.O.L.I.D 五大原则之单一职责 SRP</strong></p>
<p>略&#8230;</p>
<p><strong>七、S.O.L.I.D 五大原则之开闭原则 OCP</strong></p>
<p>略&#8230;</p>
<p><strong>八、S.O.L.I.D 五大原则之里氏替换原则 LSP</strong></p>
<p>略&#8230;</p>
<p><strong>九、根本没有“JSON 对象”这回事！</strong></p>
<p>1）字面量：固定值，可以从字面上理解脚本</p>
<p>1.1）字符串字面量由双引号（”）或单引号（&#8217;）包围起来的零个或多个字符组成</p>
<p>1.2）对象字面量由大括号（{}）括起来的零个或多个对象的属性键值对</p>
<p><strong>十、<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span> 核心（晋级高手必读篇）</strong></p>
<p>1）如果某个原型对象的原型不为 <code>null</code> 值，称之为原型链（prototype chain）</p>
<p><strong>十一、执行上下文（Execution Contexts）</strong></p>
<p>略&#8230;</p>
<p><strong>十二、变量对象（Variable Object）</strong></p>
<p>1）全局对象（Global object）是进入任何执行上下文之前就已创建的对象，生命周期终止于程序退出</p>
<p><strong>十三、This? Yes, this!</strong></p>
<p>1）<code>foo</code> 和 <code>foo.prototype.constructor</code> 是同一引用</p>
<p>2）函数上下文中，<code>this</code> 由调用者提供，由调用函数的方式决定</p>
<p>3）内部函数被父函数调用，尽管 <code>this</code> 被设定为 <code>null</code>，但结果被隐式转化成 <code>window</code></p>
<p>4）<code>call</code> 和 <code>apply</code> 第一参数均为 <code>this</code>，<code>apply</code> 第二参数是数组，而 <code>call</code> 接受任何参数</p>
<p><strong>十四、作用域链（Scope Chain）</strong></p>
<p>1）函数的的生命周期分为创建和激活阶段（调用时）</p>
<p><strong>十五、函数（Functions）</strong></p>
<p>略&#8230;</p>
<p><strong>十六、闭包（Closures）</strong></p>
<p>1）内部函数被构造，并能在函数外以返回值形式被获得，则构成闭包（简单理解为函数嵌套？）</p>
<p><strong>十七、面向对象编程之一般理论</strong></p>
<p>1）使用基于委托的原型实现面向对象，不支持多重继承，但可以使用混入（mix）的方式</p>
<p><strong>十八、面向对象编程之 ECMAScript 实现</strong></p>
<p>1）原始值类型包括 <code>Undefined</code>、<code>Null</code>、<code>Boolean</code>、<code>String</code>、<code>Number</code>，其余为对象类型</p>
<p><strong>十九、求值策略（Evaluation strategy）</strong></p>
<p>略&#8230;</p>
<p><strong>二十、《你真懂<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span>吗？》答案详解</strong></p>
<p>略&#8230;</p>
<p><strong>二十一、S.O.L.I.D 五大原则之接口隔离原则 ISP</strong></p>
<p>略&#8230;</p>
<p><strong>二十二、S.O.L.I.D 五大原则之依赖倒置原则 DIP</strong></p>
<p>略&#8230;</p>
<p><strong>二十三、<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span> 与 DOM（上）——也适用于新手</strong></p>
<p>1）<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/ie">IE</a></span> 支持 <code>defer</code> 属性，加载完 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/html">HTML</a></span> 文档后再执行 JS 代码</p>
<p><strong>二十四、<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/javascript">JavaScript</a></span> 与 DOM（下）</strong></p>
<p>略&#8230;</p>
<p><strong>二十五、设计模式之单例模式</strong></p>
<p>略&#8230;</p>
<p><strong>二十六、设计模式之构造函数模式</strong></p>
<p>1）构造函数作为函数调用时，如：</p>
<pre>function Foo(url) {
    this.url = url;
}
var tom = Foo('mangguo.org');
console.log(tom);</pre>
<p>输出结果为 <code>undefined</code>，原因是 <code>Foo</code> 构造函数的 caller 为 <code>null</code>，被隐式转化为 <code>window</code> 对象（参考第十三条中的第 3 点）</p>
<p>2）强制使用 new 关键字实例化构造函数：</p>
<pre>if (!(this instanceof Foo)) {
    return new Foo(url);
}</pre>
<p><strong>二十七、设计模式之建造者模式</strong></p>
<p>略&#8230;</p>
<p><strong>二十八、设计模式之工厂模式</strong></p>
<p>略&#8230;</p>
<p><strong>二十九、设计模式之装饰者模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十、设计模式之外观模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十一、设计模式之代理模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十二、设计模式之观察者模式</strong></p>
<p>1）观察者模式即发布订阅模式（Publish/Subscribe），定义了一对多的关系，多个观察者对象同时监听某一主题对象，当该主题对象状态变化时会自动通知所有观察者（广播），触发观察者执行更新操作<br />
2）当一个对象的改变需要同时改变其它对象，并且不知道具体有多少对象需要改变时，应考虑使用观察者模式</p>
<p><strong>三十三、设计模式之策略模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十四、设计模式之命令模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十五、设计模式之迭代器模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十六、设计模式之中介者模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十七、设计模式之享元模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十八、设计模式之职责链模式</strong></p>
<p>略&#8230;</p>
<p><strong>三十九、设计模式之适配器模式</strong></p>
<p>略&#8230;</p>
<p><strong>四十、设计模式之组合模式</strong></p>
<p>略&#8230;</p>
<p><strong>四十一、设计模式之模板方法</strong></p>
<p>略&#8230;</p>
<p><strong>四十二、设计模式之原型模式</strong></p>
<p>略&#8230;</p>
<p><strong>四十三、设计模式之状态模式</strong></p>
<p>略&#8230;</p>
<p><strong>四十四、设计模式之桥接模式</strong></p>
<p>略&#8230;</p>
<p><strong>四十五、代码复用模式（避免篇）</strong></p>
<p>略&#8230;</p>
<p><strong>四十六、代码复用模式（推荐篇）</strong></p>
<p>略&#8230;</p>
<p><strong>四十七、对象创建模式（上篇）</strong></p>
<p>1）链模式支持连续调用一个对象的方法，比如 <code>foo.add(1).minus(2).add(3)</code> 这样的形式，实现思路是将 <code>this</code> 原样返回，如：</p>
<pre>var foo = {
    value: 1,
    add: function (n) {
        this.value += n;
        return this;
    },
    minus: function (n) {
        this.value -= n;
        return this;
    }
};</pre>
<p><strong>四十八、对象创建模式（下篇）</strong></p>
<p>1）类 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/yui">YUI</a></span> 的沙盒模式实现</p>
<p>最后更新 2012.04.28</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/js-regular-judge-is-not-equal-to-a-string/" title="JS 正则判断不等于某个字符串">JS 正则判断不等于某个字符串</a> (2)</li><li><a href="http://www.mangguo.org/a-javascript-fill-in-the-blank/" title="一道 JavaScript 填空题">一道 JavaScript 填空题</a> (1)</li><li><a href="http://www.mangguo.org/inexplicable-javascript-string-line/" title="莫名其妙的 JavaScript 字符串换行">莫名其妙的 JavaScript 字符串换行</a> (7)</li><li><a href="http://www.mangguo.org/conditions-to-determine-the-current-domain-of-javascript/" title="当前域的 JavaScript 条件判断">当前域的 JavaScript 条件判断</a> (15)</li><li><a href="http://www.mangguo.org/a-brief-paragraph-on-jsonp-callback-code/" title="一段关于 JSONP Callback 的简要代码">一段关于 JSONP Callback 的简要代码</a> (0)</li><li><a href="http://www.mangguo.org/10-for-site-optimization-htaccess-code-snippets/" title="10+ 优化网站的 .htaccess 代码片段">10+ 优化网站的 .htaccess 代码片段</a> (19)</li><li><a href="http://www.mangguo.org/google-styleguide-manual/" title="来自 Google 的编程风格指南">来自 Google 的编程风格指南</a> (10)</li><li><a href="http://www.mangguo.org/javascript-prototype-constructor-inheritance/" title="JavaScript 原型继承之构造函数继承">JavaScript 原型继承之构造函数继承</a> (12)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/understanding-javascript-notes/">固定链接</a> | <a href="http://www.mangguo.org/understanding-javascript-notes/#comments">1 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/javascript/" rel="tag">JavaScript</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/understanding-javascript-notes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JS 正则判断不等于某个字符串</title>
		<link>http://www.mangguo.org/js-regular-judge-is-not-equal-to-a-string/</link>
		<comments>http://www.mangguo.org/js-regular-judge-is-not-equal-to-a-string/#comments</comments>
		<pubDate>Wed, 25 Apr 2012 13:03:14 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[前端]]></category>
		<category><![CDATA[JavaScript]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6664</guid>
		<description><![CDATA[学识太浅薄了，一个正则搞到一片人，哈哈…… 需求：正则判断不等于某个字符串 假设：该字符串为 "abc" 解决方案：/^(?!abc$)/.test('abc') 多字符串的情况：/^(?!(?:abc&#124;bcd)$)/.test('abc') 简单记录，收藏 mark 之。 参考资料：http://topic.csdn.net/u/20090905/16/fa19f91c-1dba-4d8c-99f3-be40b692882e.html 推荐阅读深入理解 JavaScript 系列学习笔记 (1)一道 JavaScript 填空题 (1)莫名其妙的 JavaScript 字符串换行 (7)当前域的 JavaScript 条件判断 (15)一段关于 JSONP Callback 的简要代码 (0)10+ 优化网站的 .htaccess 代码片段 (19)来自 Google 的编程风格指南 (10)JavaScript 原型继承之构造函数继承 (12) © 2010 芒果小站 &#124; 固定链接 &#124; 2 条评论 &#124; 标签 JavaScript]]></description>
			<content:encoded><![CDATA[<p>学识太浅薄了，一个正则搞到一片人，哈哈……</p>
<p>需求：正则判断不等于某个字符串<br />
假设：该字符串为 <code>"abc"</code><br />
解决方案：<code>/^(?!abc$)/.test('abc')</code><br />
多字符串的情况：<code>/^(?!(?:abc|bcd)$)/.test('abc')</code></p>
<p>简单记录，收藏 mark 之。</p>
<p>参考资料：<a href="http://topic.csdn.net/u/20090905/16/fa19f91c-1dba-4d8c-99f3-be40b692882e.html" target="_blank">http://topic.csdn.net/u/20090905/16/fa19f91c-1dba-4d8c-99f3-be40b692882e.html</a></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/understanding-javascript-notes/" title="深入理解 JavaScript 系列学习笔记">深入理解 JavaScript 系列学习笔记</a> (1)</li><li><a href="http://www.mangguo.org/a-javascript-fill-in-the-blank/" title="一道 JavaScript 填空题">一道 JavaScript 填空题</a> (1)</li><li><a href="http://www.mangguo.org/inexplicable-javascript-string-line/" title="莫名其妙的 JavaScript 字符串换行">莫名其妙的 JavaScript 字符串换行</a> (7)</li><li><a href="http://www.mangguo.org/conditions-to-determine-the-current-domain-of-javascript/" title="当前域的 JavaScript 条件判断">当前域的 JavaScript 条件判断</a> (15)</li><li><a href="http://www.mangguo.org/a-brief-paragraph-on-jsonp-callback-code/" title="一段关于 JSONP Callback 的简要代码">一段关于 JSONP Callback 的简要代码</a> (0)</li><li><a href="http://www.mangguo.org/10-for-site-optimization-htaccess-code-snippets/" title="10+ 优化网站的 .htaccess 代码片段">10+ 优化网站的 .htaccess 代码片段</a> (19)</li><li><a href="http://www.mangguo.org/google-styleguide-manual/" title="来自 Google 的编程风格指南">来自 Google 的编程风格指南</a> (10)</li><li><a href="http://www.mangguo.org/javascript-prototype-constructor-inheritance/" title="JavaScript 原型继承之构造函数继承">JavaScript 原型继承之构造函数继承</a> (12)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/js-regular-judge-is-not-equal-to-a-string/">固定链接</a> | <a href="http://www.mangguo.org/js-regular-judge-is-not-equal-to-a-string/#comments">2 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/javascript/" rel="tag">JavaScript</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/js-regular-judge-is-not-equal-to-a-string/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>用一粒沙观看</title>
		<link>http://www.mangguo.org/watch-with-a-sand/</link>
		<comments>http://www.mangguo.org/watch-with-a-sand/#comments</comments>
		<pubDate>Fri, 13 Apr 2012 15:40:48 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[mangguo]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6651</guid>
		<description><![CDATA[《用一粒沙观看》 我们叫它一粒沙。 但它不叫自己粒或沙。 它就这样存在着，没有一个系统、特别、 短暂、永久、不确或切合的名字。 它不需要我们的顾盼，我们的触摸。 它不感到自己被觉察和触摸。 它掉落在窗沿这一事实 只是我们的、而非它的经验。 它掉落在任何事物上也是如此 并不证明了它已经掉落 或仍在掉落。 从窗口可以观看到很好的湖景 但是湖景本身是无法观看自己的 它存在于这个世界， 没有颜色和形状 没有声音，没有味道，也没有痛苦。 湖底对自己是无底的， 岸对自己也无岸。 它的水对自己也是不湿不干的。 它的波浪也不感单一或个别 这些波浪在既不小也不大的石头周围 对自己那听若无闻的轻声细语轻声细语。 而这一切都是在一个本身没有天空的天空下发生的， 太阳在那里一点也不沉落地沉落 一点也不隐藏地隐藏在一朵非自愿的云团背后。 风费力地拖着它没有任何理由 只不过是吹罢了。 一秒过去，另一秒，第三秒。 但是这只是我们的三秒。 时间像一个带着急件的信使飞驰着。 但着只是我们的比喻。 一个创造出来的人物自己越讲越急， 而消息是无人性的。 波兰诗人 Wislawa Szymborska 推荐阅读罗赛塔翻译，专业的翻译服务 (0)芒果小站新主题意见征集 (40)2012，芒果小站三周年 (31)招募一只前端开发攻城师 (79)程序员从入门到精通：芒果教你画小鸡 (21)站长军团，小众的站长查询工具 (19)今天心情好，发个博客！ (22)芒果 1 号主机开抢啦！ (38) © 2010 芒果小站 &#124; 固定链接 &#124; 8 [...]]]></description>
			<content:encoded><![CDATA[<p><strong>《用一粒沙观看》</strong></p>
<p><a href="http://www.mangguo.org/wp-content/uploads/2012/04/568579452956090286.jpg"><img class="alignnone size-full wp-image-6652" title="568579452956090286" src="http://www.mangguo.org/wp-content/uploads/2012/04/568579452956090286.jpg" alt="" width="480" height="319" /></a></p>
<p>我们叫它一粒沙。 但它不叫自己粒或沙。<br />
它就这样存在着，没有一个系统、特别、 短暂、永久、不确或切合的名字。<br />
它不需要我们的顾盼，我们的触摸。<br />
它不感到自己被觉察和触摸。<br />
它掉落在窗沿这一事实 只是我们的、而非它的经验。<br />
它掉落在任何事物上也是如此 并不证明了它已经掉落 或仍在掉落。<br />
从窗口可以观看到很好的湖景 但是湖景本身是无法观看自己的 它存在于这个世界，<br />
没有颜色和形状 没有声音，没有味道，也没有痛苦。<br />
湖底对自己是无底的， 岸对自己也无岸。<br />
它的水对自己也是不湿不干的。<br />
它的波浪也不感单一或个别<br />
这些波浪在既不小也不大的石头周围<br />
对自己那听若无闻的轻声细语轻声细语。<br />
而这一切都是在一个本身没有天空的天空下发生的，<br />
太阳在那里一点也不沉落地沉落<br />
一点也不隐藏地隐藏在一朵非自愿的云团背后。<br />
风费力地拖着它没有任何理由 只不过是吹罢了。<br />
一秒过去，另一秒，第三秒。<br />
但是这只是我们的三秒。<br />
时间像一个带着急件的信使飞驰着。<br />
但着只是我们的比喻。<br />
一个创造出来的人物自己越讲越急， 而消息是无人性的。</p>
<p><em>波兰诗人 Wislawa Szymborska</em></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/rosettatranslation-professional-translation-service/" title="罗赛塔翻译，专业的翻译服务">罗赛塔翻译，专业的翻译服务</a> (0)</li><li><a href="http://www.mangguo.org/new-mangguo-theme-for-comments/" title="芒果小站新主题意见征集">芒果小站新主题意见征集</a> (40)</li><li><a href="http://www.mangguo.org/2012-third-year-of-mangguo/" title="2012，芒果小站三周年">2012，芒果小站三周年</a> (31)</li><li><a href="http://www.mangguo.org/recruitment-of-a-few-front-end-development-engineer/" title="<font color="red">招募一只前端开发攻城师</font>"><font color="red">招募一只前端开发攻城师</font></a> (79)</li><li><a href="http://www.mangguo.org/from-the-entry-to-the-master-programmer-mango-chicken-teach-you-draw/" title="程序员从入门到精通：芒果教你画小鸡">程序员从入门到精通：芒果教你画小鸡</a> (21)</li><li><a href="http://www.mangguo.org/adminunion-webmaster-gadgets/" title="站长军团，小众的站长查询工具">站长军团，小众的站长查询工具</a> (19)</li><li><a href="http://www.mangguo.org/good-mood-post-a-blog/" title="今天心情好，发个博客！">今天心情好，发个博客！</a> (22)</li><li><a href="http://www.mangguo.org/mangguo-host-no-1/" title="芒果 1 号主机开抢啦！">芒果 1 号主机开抢啦！</a> (38)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/watch-with-a-sand/">固定链接</a> | <a href="http://www.mangguo.org/watch-with-a-sand/#comments">8 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/mangguo/" rel="tag">mangguo</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/watch-with-a-sand/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>CodeIgniter 引入自定义公共函数</title>
		<link>http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/</link>
		<comments>http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/#comments</comments>
		<pubDate>Tue, 10 Apr 2012 03:31:46 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6646</guid>
		<description><![CDATA[CodeIgniter 中公共函数不能追加，可以通过 helper 辅助函数实现。 创建 common_helper.php 文件，定义所需公共函数，存放至 application/helpers 目录中。 在 application/config/autoload.php 中配置 $autoload['helper'] = array('common'); 即可。 推荐阅读PHP 获取目录的 md5 序列值 (3)PHP 和浏览器缓存机制 (3)file_put_contents 高并发与独占锁定 (1)PHP 函数 scandir 排除特定目录 (13)使用 rmdir 函数递归删除非空目录 (1)简单至极的 PHP 缓存类 (9)PHP 中的双引号和单引号 (11)16 进制颜色转换为 RGB 色值 (2) © 2010 芒果小站 &#124; 固定链接 &#124; 4 条评论 &#124; 标签 CodeIgniter, PHP]]></description>
			<content:encoded><![CDATA[<p>CodeIgniter 中公共函数不能追加，可以通过 helper 辅助函数实现。</p>
<p>创建 <code>common_helper.php</code> 文件，定义所需公共函数，存放至 <code>application/helpers</code> 目录中。</p>
<p>在 <code>application/config/autoload.php</code> 中配置 <code>$autoload['helper'] = array('common');</code> 即可。</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/" title="PHP 获取目录的 md5 序列值">PHP 获取目录的 md5 序列值</a> (3)</li><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li><li><a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/" title="file_put_contents 高并发与独占锁定">file_put_contents 高并发与独占锁定</a> (1)</li><li><a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/" title="PHP 函数 scandir 排除特定目录">PHP 函数 scandir 排除特定目录</a> (13)</li><li><a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/" title="使用 rmdir 函数递归删除非空目录">使用 rmdir 函数递归删除非空目录</a> (1)</li><li><a href="http://www.mangguo.org/the-simple-php-cache-class/" title="简单至极的 PHP 缓存类">简单至极的 PHP 缓存类</a> (9)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li><li><a href="http://www.mangguo.org/php-hex-color-to-rgb-color/" title="16 进制颜色转换为 RGB 色值">16 进制颜色转换为 RGB 色值</a> (2)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/">固定链接</a> | <a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/#comments">4 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/codeigniter/" rel="tag">CodeIgniter</a>, <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>PHP 函数 scandir 排除特定目录</title>
		<link>http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/</link>
		<comments>http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 05:01:56 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[array_diff]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[scandir]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6635</guid>
		<description><![CDATA[scandir() 函数返回一个数组，其中包含指定路径中的文件和目录。如下所示： 例子： &#60;?php print_r(scandir('test_directory')); ?&#62; 输出： Array ( [0] =&#62; . [1] =&#62; .. [2] =&#62; 1.txt [3] =&#62; 2.txt ) 大部分情况只需要该目录的文件列表数组，如下： Array ( [0] =&#62; 1.txt [1] =&#62; 2.txt ) 一般是通过排除 “.” 或者 “..” 的数组项解决的： &#60;?php function find_all_files($dir) {     $root = scandir($dir);     foreach($root as $value)     {         if($value [...]]]></description>
			<content:encoded><![CDATA[<p><code>scandir()</code> 函数返回一个数组，其中包含指定路径中的文件和目录。如下所示：</p>
<p>例子：</p>
<pre>&lt;?php
print_r(scandir('test_directory'));
?&gt;</pre>
<p>输出：</p>
<pre>Array
(
[0] =&gt; .
[1] =&gt; ..
[2] =&gt; 1.txt
[3] =&gt; 2.txt
)</pre>
<p>大部分情况只需要该目录的文件列表数组，如下：</p>
<pre>Array
(
[0] =&gt; 1.txt
[1] =&gt; 2.txt
)</pre>
<p>一般是通过排除 “.” 或者 “..” 的数组项解决的：</p>
<pre>&lt;?php
 function find_all_files($dir)
 {
     $root = scandir($dir);
     foreach($root as $value)
     {
         if(<strong>$value === '.' || $value === '..'</strong>) {continue;}
         if(is_file("$dir/$value")) {$result[]="$dir/$value";continue;}
         foreach(find_all_files("$dir/$value") as $value)
         {
             $result[]=$value;
         }
     }
     return $result;
 }
 ?&gt;</pre>
<p>另外一种方法，利用 <code>array_diff</code> 函数，剔除 <code>scandir</code> 函数执行得到的数组：</p>
<pre>&lt;?php
 $directory = '/path/to/my/directory';
 $scanned_directory = array_diff(scandir($directory), array('..', '.'));
 ?&gt;</pre>
<p>通常情况代码管理会产生 .svn 文件，或者限制目录访问权限的 .htaccess 等文件。所以通过 array_diff 函数来过滤会更方便。</p>
<p>参考资料：<a href="http://cn.php.net/manual/zh/function.scandir.php" target="_blank">http://cn.php.net/manual/zh/function.scandir.php</a></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/" title="PHP 获取目录的 md5 序列值">PHP 获取目录的 md5 序列值</a> (3)</li><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li><li><a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/" title="file_put_contents 高并发与独占锁定">file_put_contents 高并发与独占锁定</a> (1)</li><li><a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/" title="CodeIgniter 引入自定义公共函数">CodeIgniter 引入自定义公共函数</a> (4)</li><li><a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/" title="使用 rmdir 函数递归删除非空目录">使用 rmdir 函数递归删除非空目录</a> (1)</li><li><a href="http://www.mangguo.org/the-simple-php-cache-class/" title="简单至极的 PHP 缓存类">简单至极的 PHP 缓存类</a> (9)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li><li><a href="http://www.mangguo.org/php-hex-color-to-rgb-color/" title="16 进制颜色转换为 RGB 色值">16 进制颜色转换为 RGB 色值</a> (2)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/">固定链接</a> | <a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/#comments">13 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/array_diff/" rel="tag">array_diff</a>, <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>, <a href="http://www.mangguo.org/tag/scandir/" rel="tag">scandir</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>使用 rmdir 函数递归删除非空目录</title>
		<link>http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/</link>
		<comments>http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 08:44:25 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[rmdir]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6631</guid>
		<description><![CDATA[在 PHP 中 rmdir 函数只能删除空文件目录，如果目录非空，需要递归删除，记录下。 /**  * 删除非空目录  * @method rrmdir  */ function rrmdir ($dir) {     if (is_dir($dir)) {         $fs = array_slice(scandir($dir), 2);         foreach ($fs as $f) {             $path = $dir . '/' . $f;             is_dir($path) ? rrmdir($path) : unlink($path);         }    [...]]]></description>
			<content:encoded><![CDATA[<p>在 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/php">PHP</a></span> 中 rmdir 函数只能删除空文件目录，如果目录非空，需要递归删除，记录下。</p>
<pre>/**
 * 删除非空目录
 * @method rrmdir
 */
function rrmdir ($dir) {

    if (is_dir($dir)) {

        $fs = array_slice(scandir($dir), 2);
        foreach ($fs as $f) {
            $path = $dir . '/' . $f;
            is_dir($path) ? rrmdir($path) : unlink($path);
        }
        reset($fs);
        return rmdir($dir);
    }

}</pre>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/" title="PHP 获取目录的 md5 序列值">PHP 获取目录的 md5 序列值</a> (3)</li><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li><li><a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/" title="file_put_contents 高并发与独占锁定">file_put_contents 高并发与独占锁定</a> (1)</li><li><a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/" title="CodeIgniter 引入自定义公共函数">CodeIgniter 引入自定义公共函数</a> (4)</li><li><a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/" title="PHP 函数 scandir 排除特定目录">PHP 函数 scandir 排除特定目录</a> (13)</li><li><a href="http://www.mangguo.org/the-simple-php-cache-class/" title="简单至极的 PHP 缓存类">简单至极的 PHP 缓存类</a> (9)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li><li><a href="http://www.mangguo.org/php-hex-color-to-rgb-color/" title="16 进制颜色转换为 RGB 色值">16 进制颜色转换为 RGB 色值</a> (2)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/">固定链接</a> | <a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/#comments">1 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>, <a href="http://www.mangguo.org/tag/rmdir/" rel="tag">rmdir</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>芒果小站新主题意见征集</title>
		<link>http://www.mangguo.org/new-mangguo-theme-for-comments/</link>
		<comments>http://www.mangguo.org/new-mangguo-theme-for-comments/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 04:30:49 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[mangguo]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6627</guid>
		<description><![CDATA[时光荏苒，白驹过隙 -_-! 很感谢各位童鞋一如既往对芒果小站的支持！ 大四的时候心血来潮搞了这个博客，照着 delicious.com 的样子修修改改弄出了这个 WordPress 主题。鉴于很多朋友喜欢，近期考虑对这个主题施施工，重构一次，以便大家更好地使用。 所以，有什么问题，直接评论吧，我会一一参照，谢谢大家！ 推荐阅读芒果小站 WordPress 主题 (227)关于芒果小站主题的几点说明 (17)芒果“某某对某某说”的评论回应功能 (24)芒果升级到 WordPress 3.0.1 简体中文版 (6)WordPress 评论回复邮件通知的实现 (41)罗赛塔翻译，专业的翻译服务 (0)6 个超级实用的 WordPress 奇技淫巧 (3)用一粒沙观看 (8) © 2010 芒果小站 &#124; 固定链接 &#124; 40 条评论 &#124; 标签 mangguo, WordPress]]></description>
			<content:encoded><![CDATA[<p>时光荏苒，白驹过隙 <strong>-_-!</strong> 很感谢各位童鞋一如既往对芒果小站的支持！</p>
<p>大四的时候心血来潮搞了这个博客，照着 delicious.com 的样子修修改改弄出了这个 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 主题。鉴于很多朋友喜欢，近期考虑对这个主题施施工，重构一次，以便大家更好地使用。</p>
<p>所以，有什么问题，直接评论吧，我会一一参照，谢谢大家！</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/mangguo-wordpress-theme/" title="芒果小站 WordPress 主题">芒果小站 WordPress 主题</a> (227)</li><li><a href="http://www.mangguo.org/description-about-mangguo-theme/" title="关于芒果小站主题的几点说明">关于芒果小站主题的几点说明</a> (17)</li><li><a href="http://www.mangguo.org/someone-say-to-someone-comment-function-of-mangguo/" title="芒果“某某对某某说”的评论回应功能">芒果“某某对某某说”的评论回应功能</a> (24)</li><li><a href="http://www.mangguo.org/mangguo-upgrade-to-wordpress-301-zh-cn/" title="芒果升级到 WordPress 3.0.1 简体中文版">芒果升级到 WordPress 3.0.1 简体中文版</a> (6)</li><li><a href="http://www.mangguo.org/wordpress-comment-reply-email-announce-practice/" title="WordPress 评论回复邮件通知的实现">WordPress 评论回复邮件通知的实现</a> (41)</li><li><a href="http://www.mangguo.org/rosettatranslation-professional-translation-service/" title="罗赛塔翻译，专业的翻译服务">罗赛塔翻译，专业的翻译服务</a> (0)</li><li><a href="http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/" title="6 个超级实用的 WordPress 奇技淫巧">6 个超级实用的 WordPress 奇技淫巧</a> (3)</li><li><a href="http://www.mangguo.org/watch-with-a-sand/" title="用一粒沙观看">用一粒沙观看</a> (8)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/new-mangguo-theme-for-comments/">固定链接</a> | <a href="http://www.mangguo.org/new-mangguo-theme-for-comments/#comments">40 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/mangguo/" rel="tag">mangguo</a>, <a href="http://www.mangguo.org/tag/wordpress/" rel="tag">WordPress</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/new-mangguo-theme-for-comments/feed/</wfw:commentRss>
		<slash:comments>40</slash:comments>
		</item>
		<item>
		<title>10 条实用的 WordPress 数据库清理 SQL</title>
		<link>http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/</link>
		<comments>http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/#comments</comments>
		<pubDate>Tue, 20 Mar 2012 10:43:55 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[博客]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6607</guid>
		<description><![CDATA[温馨提示：所有的数据库 SQL 查询都是不可恢复的，使用前请注意备份。 1、清理 WordPress 中怪异的乱码字符 编码问题对于中文来说着实蛋疼。除了手工更新文章内容的方法外，这里也有份 SQL 语句可供你选择。 UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€œ', '“'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€ ', '”'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€™', '’'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€˜', '‘'); UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€”', '–'); UPDATE wp_posts SET post_content = [...]]]></description>
			<content:encoded><![CDATA[<p>温馨提示：所有的数据库 SQL 查询都是不可恢复的，使用前请注意备份。</p>
<p><strong>1、清理 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 中怪异的乱码字符</strong></p>
<p>编码问题对于中文来说着实蛋疼。除了手工更新文章内容的方法外，这里也有份 SQL 语句可供你选择。</p>
<pre>UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€œ', '“');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€ ', '”');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€™', '’');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€˜', '‘');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€”', '–');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€“', '—');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€¢', '-');
UPDATE wp_posts SET post_content = REPLACE(post_content, 'â€¦', '…');

UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€œ', '“');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€ ', '”');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€™', '’');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€˜', '‘');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€”', '–');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€“', '—');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€¢', '-');
UPDATE wp_comments SET comment_content = REPLACE(comment_content, 'â€¦', '…');</pre>
<p><strong>来自 <a href="http://digwp.com/2011/07/clean-up-weird-characters-in-database" target="_blank">http://digwp.com/2011/07/clean-up-weird-characters-in-database</a></strong></p>
<p><strong>2、一次性关闭所有文章的引用通知 (pingbacks, trackbacks) 功能</strong></p>
<p>你是否使用引用通知功能，也就是常说的 pingbacks 和 trackbacks 机制。很多人觉得没啥太大用途。为了摆脱这些东东，你可以逐篇文字进行关闭，但这很浪费生命。如果你还在为这事情纠结，赶紧用下面的代码吧！</p>
<pre>UPDATE wp_posts SET ping_status = 'closed';</pre>
<p><strong>来自 <a href="http://www.wprecipes.com/wordpress-tip-close-trackbacks-on-all-posts-at-once" target="_blank">http://www.wprecipes.com/wordpress-tip-close-trackbacks-on-all-posts-at-once</a></strong></p>
<p><strong>3、删除未使用的短代码 (shortcodes)</strong></p>
<p><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 的提供的短代码 (shortcodes) 功能非常强大，但如果停用某个短代码后，短代码的标签就会在文章中直接显现。这份 SQL 查询会帮助你清楚那些过时的短代码（其中 [tweet] 请按实际修改）：</p>
<pre>UPDATE wp_post SET post_content = replace(post_content, '[tweet]', '' ) ;</pre>
<p><strong>来自 <a href="http://www.wprecipes.com/wordpress-tip-get-rid-of-unused-shortcodes" target="_blank">http://www.wprecipes.com/wordpress-tip-get-rid-of-unused-shortcodes</a></strong></p>
<p><strong>4、删除指定的自定义字段 (postmeta)</strong></p>
<p>如果你添加过自定义字段，但后来又不想用了，可以通过这个方法删除：</p>
<pre>DELETE FROM wp_postmeta WHERE meta_key = 'YourMetaKey';</pre>
<p><strong><strong>来自</strong> <a href="http://www.esoftload.info/10-sql-statements-for-wordpress" target="_blank">http://www.esoftload.info/10-sql-statements-for-wordpress</a></strong></p>
<p><strong>5、删除未使用的文章标签</strong></p>
<p>标签随着文章数目的增长也是越来越多，不想再使用的标签，可以通过这个方法删除：</p>
<pre>DELETE FROM wp_terms WHERE term_id IN (SELECT term_id FROM wp_term_taxonomy WHERE count = 0 );
DELETE FROM wp_term_taxonomy WHERE term_id not IN (SELECT term_id FROM wp_terms);
DELETE FROM wp_term_relationships WHERE term_taxonomy_id not IN (SELECT term_taxonomy_id FROM wp_term_taxonomy);</pre>
<p><strong>来自 <a href="http://4rapiddev.com/tips-and-tricks/wordpress-delete-unused-post-tags-by-sql-command/" target="_blank">http://4rapiddev.com/tips-and-tricks/wordpress-delete…</a></strong></p>
<p><strong>6、删除 feed 缓存</strong></p>
<p><span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 将 feed 缓存存储在 wp_options 表中，如果你希望清空这些，可以使用以下代码：</p>
<pre>DELETE FROM `wp_options` WHERE `option_name` LIKE ('_transient%_feed_%')</pre>
<p><strong><strong>来自</strong> <a href="http://wpengineer.com/2114/delete-all-feed-cache-via-sql-in-wordpress/" target="_blank">http://wpengineer.com/2114/delete-all-feed-cache…</a></strong></p>
<p><strong>7、删除所有文章修订版和相关元数据</strong></p>
<p>文章修订版是非常实用的功能，但是如果不删除多余的修订版，数据库会随之变得冗余庞大。下面的代码可以用来删除这些修订版，并同时删除与其相关的元数据信息。</p>
<pre>DELETE a,b,c FROM wp_posts a WHERE a.post_type = 'revision' LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id) LEFT JOIN wp_postmeta c ON (a.ID = c.post_id);</pre>
<p><strong><strong>来自</strong> <a href="http://www.onextrapixel.com/2010/01/30/13-useful-wordpress-sql-queries-you-wish-you-knew-earlier/" target="_blank">http://www.onextrapixel.com/2010/01/30/13-useful-wordpress-sql-queries…</a></strong></p>
<p><strong>8、批量删除旧文章</strong></p>
<p>不想要几年前发布的文章了？那就用下面的代码删除之。这个示例用于删除 600 天以前的旧文章。</p>
<pre>DELETE FROM `wp_posts`
WHERE `post_type` = 'post'
AND DATEDIFF(NOW(), `post_date`) &gt; 600</pre>
<p><strong>来自 <a href="http://stackoverflow.com/questions/5317599/wordpress-automatically-delete-posts-that-are-x-days-old" target="_blank">http://stackoverflow.com/questions/5317599/wordpress-automatically-delete-posts…</a></strong></p>
<p><strong>9、清楚评论客户端信息</strong></p>
<p>默认情况下，当访客发布评论时，<span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 会自动在数据库中保存他们的客户端信息，这对于统计数据而言是非常有用的。但是绝大多数情况下是毫无意义的。这段代码将清空所有客户端信息，减少数据库体积。</p>
<pre>update wp_comments set comment_agent ='' ;</pre>
<p><strong><strong>来自</strong> <a href="http://www.rsatechnologies.in/best-sql-queries-for-wordpress-administrator.html" target="_blank">http://www.rsatechnologies.in/best-sql-queries-for…</a></strong></p>
<p><strong>10、批量禁用插件</strong></p>
<p>有些情况，比如 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/wordpress">WordPress</a></span> 升级等操作需要禁用所有插件。如果你安装了很多很多插件，面板操作需要执行很长时间。以下代码一次性禁用所有插件：</p>
<pre>UPDATE wp_options SET option_value = '' WHERE option_name = 'active_plugins';</pre>
<p><strong>来自 <a href="http://www.wprecipes.com/how-to-disable-all-your-plugins-in-a-second" target="_blank">http://www.wprecipes.com/how-to-disable-all-your-plugins…</a></strong></p>
<p><strong>11、改变所有文章作者属性</strong></p>
<p>需要改变博客的作者属性？那可能需要手工挨个修改，太麻烦了！</p>
<p>首先，你需要获得所有的用户 ID，在 phpMyAdmin 中执行以下语句：</p>
<pre>SELECT ID, display_name FROM wp_users;</pre>
<p>现在，phpMyAdmin 已经筛选出了所有的用户信息，包括他们的 ID。参照下面的语句按实际情况修改执行：</p>
<pre>UPDATE wp_posts SET post_author=NEW_AUTHOR_ID WHERE post_author=OLD_AUTHOR_ID;</pre>
<p>执行这段代码后，所有的文章中的旧作者就被替换为新作者了。</p>
<p>英文原稿：<a title="Permanent Link to 10+ useful SQL queries to clean up your WordPress database" href="http://www.catswhocode.com/blog/10-useful-sql-queries-to-clean-up-your-wordpress-database" rel="bookmark">10+ useful SQL queries to clean up your WordPress database</a><br />
翻译整理：<a title="Permanent Link to 10+ useful SQL queries to clean up your WordPress database" href="http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/">10 条实用的 WordPress 数据库清理 SQL</a></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/8-useful-wordpress-sql-hacks/" title="8 条实用 WordPress SQL 语句">8 条实用 WordPress SQL 语句</a> (4)</li><li><a href="http://www.mangguo.org/6-super-useful-wordpress-clever-wicked-craft/" title="6 个超级实用的 WordPress 奇技淫巧">6 个超级实用的 WordPress 奇技淫巧</a> (3)</li><li><a href="http://www.mangguo.org/new-mangguo-theme-for-comments/" title="芒果小站新主题意见征集">芒果小站新主题意见征集</a> (40)</li><li><a href="http://www.mangguo.org/gocodes-wordpress-plugin-link-redirects/" title="GoCodes，WordPress 链接重定向插件">GoCodes，WordPress 链接重定向插件</a> (25)</li><li><a href="http://www.mangguo.org/wp-clock-countdown-beautiful-wordpress-plugin/" title="WP Clock，漂亮的 WordPress 倒计时插件">WP Clock，漂亮的 WordPress 倒计时插件</a> (2)</li><li><a href="http://www.mangguo.org/how-to-display-the-latest-in-the-wordpress-google-content/" title="如何在 WordPress 中显示最新 Google+ 内容 ">如何在 WordPress 中显示最新 Google+ 内容 </a> (1)</li><li><a href="http://www.mangguo.org/use-htaccess-reduce-wordpress-comment-spam/" title="使用 .htaccess 减少 WordPress 垃圾评论">使用 .htaccess 减少 WordPress 垃圾评论</a> (17)</li><li><a href="http://www.mangguo.org/10-useful-wordpress-hacks/" title="10 个实用的 WordPress 技巧教程">10 个实用的 WordPress 技巧教程</a> (28)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/">固定链接</a> | <a href="http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/#comments">6 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/sql/" rel="tag">SQL</a>, <a href="http://www.mangguo.org/tag/wordpress/" rel="tag">WordPress</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>口碑已死，有事烧纸</title>
		<link>http://www.mangguo.org/the-word-of-mouth-is-dead-something-burning-paper/</link>
		<comments>http://www.mangguo.org/the-word-of-mouth-is-dead-something-burning-paper/#comments</comments>
		<pubDate>Wed, 14 Mar 2012 02:57:16 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[Koubei.com]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6613</guid>
		<description><![CDATA[老东家挂了，截图纪念。 一个极具创造性的公司，做的产品比牛毛多，成功的没有。活着的产品都是近一年出来的新产品。 吃喝玩乐衣食住行，两年就主要搞了个吃喝，一千多家签约商户。还没出杭州城就自挂东南枝了~ 推荐阅读CheckPageRank，PageRank 真假查询 (2)WordPress 的 10 个 .htaccess 技巧 (1)CO.CC，功能强大的免费二级域名 (3)感慨一下内容抄袭之怪现状 (10)Page SEO，查看所有页面的 PageRank 值 (0)28 款网页设计工具和生成器 (5)HostTracker，超强网站测速工具 (10)PHP 中的双引号和单引号 (11) © 2010 芒果小站 &#124; 固定链接 &#124; 20 条评论 &#124; 标签 Koubei.com]]></description>
			<content:encoded><![CDATA[<p>老东家挂了，截图纪念。<br />
一个极具创造性的公司，做的产品比牛毛多，成功的没有。活着的产品都是近一年出来的新产品。</p>
<p><a href="http://www.mangguo.org/wp-content/uploads/2012/03/2012-03-14_105626.png"><img src="http://www.mangguo.org/wp-content/uploads/2012/03/2012-03-14_105626.png" alt="" title="2012-03-14_105626" width="549" height="321" class="alignnone size-full wp-image-6614" /></a></p>
<p>吃喝玩乐衣食住行，两年就主要搞了个吃喝，一千多家签约商户。还没出杭州城就自挂东南枝了~</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/simple-feed-copyright-add-copyright-for-feed/" title="Simple Feed Copyright，为 Feed 添加版权信息">Simple Feed Copyright，为 Feed 添加版权信息</a> (0)</li><li><a href="http://www.mangguo.org/myipaddress-domain-ip-track-check-tool/" title="MyIPAddress，域名 IP 跟踪查询工具">MyIPAddress，域名 IP 跟踪查询工具</a> (1)</li><li><a href="http://www.mangguo.org/test-wordpress-for-iphone/" title="测试一下 iPhone 写博客">测试一下 iPhone 写博客</a> (37)</li><li><a href="http://www.mangguo.org/practical-wordpress-database-clean-up-the-sql-statement/" title="10 条实用的 WordPress 数据库清理 SQL">10 条实用的 WordPress 数据库清理 SQL</a> (6)</li><li><a href="http://www.mangguo.org/6-twitter-related-wordpress-plugin/" title="6 款 Twitter 相关的 WordPress 插件">6 款 Twitter 相关的 WordPress 插件</a> (2)</li><li><a href="http://www.mangguo.org/60-minimal-and-super-clean-web-designs-to-inspire-you/" title="60+ 清新小巧的网页设计">60+ 清新小巧的网页设计</a> (3)</li><li><a href="http://www.mangguo.org/7-css-online-optimize-tool/" title="7 款 CSS 在线优化工具">7 款 CSS 在线优化工具</a> (1)</li><li><a href="http://www.mangguo.org/super-screenshot-online-page-screenshot-tool/" title="SuperScreenshot，在线网页截图工具">SuperScreenshot，在线网页截图工具</a> (0)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/the-word-of-mouth-is-dead-something-burning-paper/">固定链接</a> | <a href="http://www.mangguo.org/the-word-of-mouth-is-dead-something-burning-paper/#comments">20 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/koubei-com/" rel="tag">Koubei.com</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/the-word-of-mouth-is-dead-something-burning-paper/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Google AdSense 向您发放了一笔付款</title>
		<link>http://www.mangguo.org/google-adsense-issued-payment/</link>
		<comments>http://www.mangguo.org/google-adsense-issued-payment/#comments</comments>
		<pubDate>Tue, 13 Mar 2012 12:56:18 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[Google Adsense]]></category>
		<category><![CDATA[WestUnion]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6610</guid>
		<description><![CDATA[收了 Google 的广告费，在农行取西联的账，刷刷刷刷填写各种表单，兑现 106.68 刀，人民币 673 元。呵呵，经济萧条啊~ 您好！ 请注意，最近我们向您发放了一笔针对您的 AdSense 收入的付款。 有关详情，请通过 https://www.google.com/adsense 登录到您的帐户，然后通过 https://www.google.com/adsense/reports-payment 进入“付款”页面。根据您所选择的付款方式，您可能还会在此页上找到一个用于跟踪或提取付款的参考号。 此致 Google AdSense 小组敬上 赚个主机费用，哈哈。 推荐阅读Google AdSense 广告是鸡肋，还是撤下吧 (78)AdSense for Feeds 广告是鸡肋，还是撤下吧 (5)Google Adsense 广告投影效果 (4)使用 JS 文件调用 Google AdSense 广告 (4) © 2010 芒果小站 &#124; 固定链接 &#124; 21 条评论 &#124; 标签 Google Adsense, WestUnion]]></description>
			<content:encoded><![CDATA[<p>收了 Google 的广告费，在农行取西联的账，刷刷刷刷填写各种表单，兑现 106.68 刀，人民币 673 元。呵呵，经济萧条啊~</p>
<pre>您好！

请注意，最近我们向您发放了一笔针对您的 AdSense 收入的付款。

有关详情，请通过 https://www.google.com/adsense 登录到您的帐户，然后通过 https://www.google.com/adsense/reports-payment 进入“付款”页面。根据您所选择的付款方式，您可能还会在此页上找到一个用于跟踪或提取付款的参考号。

此致

Google AdSense 小组敬上</pre>
<p><a href="http://www.mangguo.org/wp-content/uploads/2012/03/google_adsense.png"><img class="alignnone size-full wp-image-6611" title="google_adsense" src="http://www.mangguo.org/wp-content/uploads/2012/03/google_adsense.png" alt="" width="400" height="309" /></a></p>
<p>赚个主机费用，哈哈。</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/google-adsense-is-tasteless-not-as-remove-it/" title="Google AdSense 广告是鸡肋，还是撤下吧">Google AdSense 广告是鸡肋，还是撤下吧</a> (78)</li><li><a href="http://www.mangguo.org/google-adsense-for-feeds-is-tasteless-not-as-remove-it/" title="AdSense for Feeds 广告是鸡肋，还是撤下吧">AdSense for Feeds 广告是鸡肋，还是撤下吧</a> (5)</li><li><a href="http://www.mangguo.org/google-adsense-advertisement-shadow-effect/" title="Google Adsense 广告投影效果">Google Adsense 广告投影效果</a> (4)</li><li><a href="http://www.mangguo.org/use-js-file-call-google-adsense-ad/" title="使用 JS 文件调用 Google AdSense 广告">使用 JS 文件调用 Google AdSense 广告</a> (4)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/google-adsense-issued-payment/">固定链接</a> | <a href="http://www.mangguo.org/google-adsense-issued-payment/#comments">21 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/google-adsense/" rel="tag">Google Adsense</a>, <a href="http://www.mangguo.org/tag/westunion/" rel="tag">WestUnion</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/google-adsense-issued-payment/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>站长军团及 Chrome 插件新版发布</title>
		<link>http://www.mangguo.org/new-version-of-adminunion-and-chrome-extension/</link>
		<comments>http://www.mangguo.org/new-version-of-adminunion-and-chrome-extension/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 04:38:00 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[工具]]></category>
		<category><![CDATA[AdminUnion]]></category>
		<category><![CDATA[Chrome]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6597</guid>
		<description><![CDATA[站长军团（www.adminunion.com）升级到 3.0.0 了，连同新版 Chrome 插件一起发布哦！ 升级说明： 1、因为系统结构重新设计，原先的 PageRank 挂件调用地址调整为： http://pagerank.adminunion.com/widget.php?size=xl&#38;domain=mangguo.org 预览图： 这是芒果使用的挂件地址，如果你想用其他尺寸的图片，可以到以下地址生成：http://pagerank.adminunion.com 2、Chrome 插件转移至 Chrome 网上应用店 抱歉的是，之前在芒果发布的插件不能使用了，现在插件已经提交到了 Chrome 网上应用店，你可以在 Chrome 浏览器中访问以下地址安装： https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN 预览图： 网站地址：http://www.adminunion.com Chrome 插件地址：https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN 推荐阅读站长军团 Chrome 扩展插件 v1.0.0 (20)让 Chrome 崩溃的 CSS 代码 (19)站长军团，小众的站长查询工具 (19)表单中的隐藏域重置 (11)浏览器简史 (14)Fuck Firefox，Hello Chrome！ (26)Spoon，绿色低碳的浏览器沙盒插件 (14)Google Chrome 中文版最小字体限制 (22) © 2010 芒果小站 &#124; 固定链接 &#124; 26 条评论 &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>站长军团（<a href="http://www.adminunion.com" target="_blank">www.adminunion.com</a>）升级到 3.0.0 了，连同新版<a href="https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN" target="_blank"> Chrome 插件</a>一起发布哦！</p>
<p>升级说明：</p>
<p><strong>1、因为系统结构重新设计，原先的 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/pagerank">PageRank</a></span> 挂件调用地址调整为：</strong></p>
<pre>http://pagerank.adminunion.com/widget.php?size=xl&amp;domain=mangguo.org</pre>
<p>预览图：<br />
<img src="http://pagerank.adminunion.com/widget.php?size=xl&amp;domain=mangguo.org" alt="" /></p>
<p>这是芒果使用的挂件地址，如果你想用其他尺寸的图片，可以到以下地址生成：<a href="http://pagerank.adminunion.com" target="_blank">http://pagerank.adminunion.com</a></p>
<p><strong>2、Chrome 插件转移至 Chrome 网上应用店</strong></p>
<p>抱歉的是，之前在芒果发布的插件不能使用了，现在插件已经提交到了 Chrome 网上应用店，你可以在 Chrome 浏览器中访问以下地址安装：<br />
<a href="https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN" target="_blank">https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN</a></p>
<p>预览图：<br />
<a href="http://www.mangguo.org/wp-content/uploads/2012/02/adminunion_chrome_extension.png"><img class="alignnone size-full wp-image-6602" title="adminunion_chrome_extension" src="http://www.mangguo.org/wp-content/uploads/2012/02/adminunion_chrome_extension.png" alt="" width="330" height="355" /></a></p>
<p>网站地址：<a href="http://www.adminunion.com" target="_blank">http://www.adminunion.com</a><br />
Chrome 插件地址：<a href="https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN" target="_blank">https://chrome.google.com/webstore/detail/jiciopodjlcihnefplabkfbeppfpfeib?hl=zh-CN</a></p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/adminunion-chrome-extension-v1-0-0/" title="站长军团 Chrome 扩展插件 v1.0.0">站长军团 Chrome 扩展插件 v1.0.0</a> (20)</li><li><a href="http://www.mangguo.org/let-ben-collapse-css-chrome/" title="让 Chrome 崩溃的 CSS 代码">让 Chrome 崩溃的 CSS 代码</a> (19)</li><li><a href="http://www.mangguo.org/adminunion-webmaster-gadgets/" title="站长军团，小众的站长查询工具">站长军团，小众的站长查询工具</a> (19)</li><li><a href="http://www.mangguo.org/form-reset-hidden-field-issue/" title="表单中的隐藏域重置">表单中的隐藏域重置</a> (11)</li><li><a href="http://www.mangguo.org/the-history-of-web-browsers-infographic/" title="浏览器简史">浏览器简史</a> (14)</li><li><a href="http://www.mangguo.org/fuck-firefox-hello-chrome/" title="Fuck Firefox，Hello Chrome！">Fuck Firefox，Hello Chrome！</a> (26)</li><li><a href="http://www.mangguo.org/spoon-green-low-carbon-browser-sandbox-plugin/" title="Spoon，绿色低碳的浏览器沙盒插件">Spoon，绿色低碳的浏览器沙盒插件</a> (14)</li><li><a href="http://www.mangguo.org/google-chrome-chinese-minimum-font-size/" title="Google Chrome 中文版最小字体限制">Google Chrome 中文版最小字体限制</a> (22)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/new-version-of-adminunion-and-chrome-extension/">固定链接</a> | <a href="http://www.mangguo.org/new-version-of-adminunion-and-chrome-extension/#comments">26 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/adminunion/" rel="tag">AdminUnion</a>, <a href="http://www.mangguo.org/tag/chrome/" rel="tag">Chrome</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/new-version-of-adminunion-and-chrome-extension/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>2012，芒果小站三周年</title>
		<link>http://www.mangguo.org/2012-third-year-of-mangguo/</link>
		<comments>http://www.mangguo.org/2012-third-year-of-mangguo/#comments</comments>
		<pubDate>Sun, 12 Feb 2012 07:58:22 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[杂项]]></category>
		<category><![CDATA[2012]]></category>
		<category><![CDATA[mangguo]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6594</guid>
		<description><![CDATA[不知不觉，这个小站开了三年。 博客这种东西，说实话很难定义。有的时候在想坚持一件事情的理由，但又如何给定无法既定的答案呢？大部分的时候，我只是把博客当作笔记，以至于大家看到的这些文章，有一大部分都属于比较水的。 统计了下 2011 年，发了 91 篇文章，平均每 4 天 1 篇，不算高产，但还算持久。当然中间其实我存了很多草稿文档，写了一半然后清除。某些话题就是这样，想写的时候码个标题和几句提纲，过了几天就没那心情了。 这一年，旧去新来。想做些什么，那就从主题开始吧。新的芒果主题计划中，希望不会流产。 值此芒果小站三周年，发文已示纪念。 另外，我在新浪微博的帐号是：tinyhill，欢迎大家和我交流。 推荐阅读罗赛塔翻译，专业的翻译服务 (0)用一粒沙观看 (8)芒果小站新主题意见征集 (40)招募一只前端开发攻城师 (79)程序员从入门到精通：芒果教你画小鸡 (21)站长军团，小众的站长查询工具 (19)今天心情好，发个博客！ (22)芒果 1 号主机开抢啦！ (38) © 2010 芒果小站 &#124; 固定链接 &#124; 31 条评论 &#124; 标签 2012, mangguo]]></description>
			<content:encoded><![CDATA[<p>不知不觉，这个小站开了三年。</p>
<p>博客这种东西，说实话很难定义。有的时候在想坚持一件事情的理由，但又如何给定无法既定的答案呢？大部分的时候，我只是把博客当作笔记，以至于大家看到的这些文章，有一大部分都属于比较水的。</p>
<p>统计了下 2011 年，发了 91 篇文章，平均每 4 天 1 篇，不算高产，但还算持久。当然中间其实我存了很多草稿文档，写了一半然后清除。某些话题就是这样，想写的时候码个标题和几句提纲，过了几天就没那心情了。</p>
<p>这一年，旧去新来。想做些什么，那就从主题开始吧。新的芒果主题计划中，希望不会流产。</p>
<p>值此芒果小站三周年，发文已示纪念。</p>
<p>另外，我在新浪微博的帐号是：<a href="http://weibo.com/tinyhill" target="_blank">tinyhill</a>，欢迎大家和我交流。</p>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/rosettatranslation-professional-translation-service/" title="罗赛塔翻译，专业的翻译服务">罗赛塔翻译，专业的翻译服务</a> (0)</li><li><a href="http://www.mangguo.org/watch-with-a-sand/" title="用一粒沙观看">用一粒沙观看</a> (8)</li><li><a href="http://www.mangguo.org/new-mangguo-theme-for-comments/" title="芒果小站新主题意见征集">芒果小站新主题意见征集</a> (40)</li><li><a href="http://www.mangguo.org/recruitment-of-a-few-front-end-development-engineer/" title="<font color="red">招募一只前端开发攻城师</font>"><font color="red">招募一只前端开发攻城师</font></a> (79)</li><li><a href="http://www.mangguo.org/from-the-entry-to-the-master-programmer-mango-chicken-teach-you-draw/" title="程序员从入门到精通：芒果教你画小鸡">程序员从入门到精通：芒果教你画小鸡</a> (21)</li><li><a href="http://www.mangguo.org/adminunion-webmaster-gadgets/" title="站长军团，小众的站长查询工具">站长军团，小众的站长查询工具</a> (19)</li><li><a href="http://www.mangguo.org/good-mood-post-a-blog/" title="今天心情好，发个博客！">今天心情好，发个博客！</a> (22)</li><li><a href="http://www.mangguo.org/mangguo-host-no-1/" title="芒果 1 号主机开抢啦！">芒果 1 号主机开抢啦！</a> (38)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/2012-third-year-of-mangguo/">固定链接</a> | <a href="http://www.mangguo.org/2012-third-year-of-mangguo/#comments">31 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/2012/" rel="tag">2012</a>, <a href="http://www.mangguo.org/tag/mangguo/" rel="tag">mangguo</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/2012-third-year-of-mangguo/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>简单至极的 PHP 缓存类</title>
		<link>http://www.mangguo.org/the-simple-php-cache-class/</link>
		<comments>http://www.mangguo.org/the-simple-php-cache-class/#comments</comments>
		<pubDate>Wed, 08 Feb 2012 13:28:47 +0000</pubDate>
		<dc:creator>芒果</dc:creator>
				<category><![CDATA[代码]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.mangguo.org/?p=6592</guid>
		<description><![CDATA[网上关于 PHP 缓存类的资料很多，不过这个类应该是我见过功能满足需求，但又无比简洁的一个。废话不多说，直接看代码吧！ 使用说明： 1、实例化 $cache = new Cache(); 2、设置缓存时间和缓存目录 $cache = new Cache(60, '/any_other_path/'); 第一个参数是缓存秒数，第二个参数是缓存路径，根据需要配置。 默认情况下，缓存时间是 3600 秒，缓存目录是 cache/ 3、读取缓存 $value = $cache->get('data_key'); 4、写入缓存 $value = $cache->put('data_key', 'data_value'); 完整实例： $cache = new Cache(); //从缓存从读取键值 $key 的数据 $values = $cache->get($key); //如果没有缓存数据 if ($values == false) { //insert code here... //写入键值 $key 的数据 $cache->put($key, $values); } [...]]]></description>
			<content:encoded><![CDATA[<p>网上关于 <span class='bm_keywordlink'><a href="http://www.mangguo.org/tag/php">PHP</a></span> 缓存类的资料很多，不过这个类应该是我见过功能满足需求，但又无比简洁的一个。废话不多说，直接看代码吧！</p>
<p><strong>使用说明：</strong></p>
<p><strong>1、实例化</strong></p>
<pre>$cache = new Cache();</pre>
<p><strong>2、设置缓存时间和缓存目录</strong></p>
<pre>$cache = new Cache(60, '/any_other_path/');</pre>
<p>第一个参数是缓存秒数，第二个参数是缓存路径，根据需要配置。<br />
默认情况下，缓存时间是 3600 秒，缓存目录是 cache/</p>
<p><strong>3、读取缓存</strong></p>
<pre>$value = $cache->get('data_key');</pre>
<p><strong>4、写入缓存</strong></p>
<pre>$value = $cache->put('data_key', 'data_value');</pre>
<p><strong>完整实例：</strong></p>
<pre>$cache = new Cache();

//从缓存从读取键值 $key 的数据
$values = $cache->get($key);

//如果没有缓存数据
if ($values == false) {
	//insert code here...
	//写入键值 $key 的数据
	$cache->put($key, $values);
} else {
	//insert code here...
}
</pre>
<p><strong>Cache.class.php</strong></p>
<pre>&lt;?php
class Cache {
	private $cache_path;//path for the cache
	private $cache_expire;//seconds that the cache expires

	//cache constructor, optional expiring time and cache path
	public function Cache($exp_time=3600,$path="cache/"){
		$this-&gt;cache_expire=$exp_time;
		$this-&gt;cache_path=$path;
	}

	//returns the filename for the cache
	private function fileName($key){
		return $this-&gt;cache_path.md5($key);
	}

	//creates new cache files with the given data, $key== name of the cache, data the info/values to store
	public function put($key, $data){
		$values = serialize($data);
		$filename = $this-&gt;fileName($key);
		$file = fopen($filename, 'w');
	    if ($file){//able to create the file
	        fwrite($file, $values);
	        fclose($file);
	    }
	    else return false;
	}

	//returns cache for the given key
	public function get($key){
		$filename = $this-&gt;fileName($key);
		if (!file_exists($filename) || !is_readable($filename)){//can't read the cache
			return false;
		}
		if ( time() &lt; (filemtime($filename) + $this-&gt;cache_expire) ) {//cache for the key not expired
			$file = fopen($filename, "r");// read data file
	        if ($file){//able to open the file
	            $data = fread($file, filesize($filename));
	            fclose($file);
	            return unserialize($data);//return the values
	        }
	        else return false;
		}
		else return false;//was expired you need to create new
 	}
}
?&gt;</pre>
<h3  class="related_post_title">推荐阅读</h3><ul class="related_post"><li><a href="http://www.mangguo.org/php-access-to-the-directory-md5-sequence-value/" title="PHP 获取目录的 md5 序列值">PHP 获取目录的 md5 序列值</a> (3)</li><li><a href="http://www.mangguo.org/php-and-the-browser-cache-mechanism/" title="PHP 和浏览器缓存机制">PHP 和浏览器缓存机制</a> (3)</li><li><a href="http://www.mangguo.org/the-the-the-file_put_contents-high-concurrent-and-exclusive-lock/" title="file_put_contents 高并发与独占锁定">file_put_contents 高并发与独占锁定</a> (1)</li><li><a href="http://www.mangguo.org/codeigniter-introduction-of-custom-public-function/" title="CodeIgniter 引入自定义公共函数">CodeIgniter 引入自定义公共函数</a> (4)</li><li><a href="http://www.mangguo.org/the-php-function-scandir-exclude-specific-directories/" title="PHP 函数 scandir 排除特定目录">PHP 函数 scandir 排除特定目录</a> (13)</li><li><a href="http://www.mangguo.org/use-rmdir-recursive-function-to-delete-a-non-empty-directory/" title="使用 rmdir 函数递归删除非空目录">使用 rmdir 函数递归删除非空目录</a> (1)</li><li><a href="http://www.mangguo.org/in-php-a-double-quotes-and-the-single-quotes/" title="PHP 中的双引号和单引号">PHP 中的双引号和单引号</a> (11)</li><li><a href="http://www.mangguo.org/php-hex-color-to-rgb-color/" title="16 进制颜色转换为 RGB 色值">16 进制颜色转换为 RGB 色值</a> (2)</li></ul><hr />
© 2010 芒果小站 | <a href="http://www.mangguo.org/the-simple-php-cache-class/">固定链接</a> | <a href="http://www.mangguo.org/the-simple-php-cache-class/#comments">9 条评论</a> | 标签 <a href="http://www.mangguo.org/tag/php/" rel="tag">PHP</a>]]></content:encoded>
			<wfw:commentRss>http://www.mangguo.org/the-simple-php-cache-class/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>

