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

<channel>
	<title>蜗牛的牛窝 &#187; 优化</title>
	<atom:link href="http://www.woniu.us/category/optimization/feed" rel="self" type="application/rss+xml" />
	<link>http://www.woniu.us</link>
	<description>php开发、PHP程序分析、Python程序设计、心情随笔</description>
	<lastBuildDate>Mon, 09 Aug 2010 13:44:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>lamper第二期聚会&#8211;WEB缓存加速&#8211;摘要+PPT</title>
		<link>http://www.woniu.us/optimization/371.html</link>
		<comments>http://www.woniu.us/optimization/371.html#comments</comments>
		<pubDate>Sun, 08 Aug 2010 06:55:20 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[优化]]></category>
		<category><![CDATA[缓存]]></category>

		<guid isPermaLink="false">http://www.woniu.us/?p=371</guid>
		<description><![CDATA[非常成功的一次聚会，期间非常多的大牛都交流了各自的心得，期间的一些知识避免以后忘记，暂时做个记录在这里。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.woniu.us/wp-content/uploads/2010/08/69660c13h8d3d06f609fe690.jpg"><img src="http://www.woniu.us/wp-content/uploads/2010/08/69660c13h8d3d06f609fe690.jpg" alt="" title="69660c13h8d3d06f609fe&amp;690" width="337" height="225" class="alignnone size-full wp-image-372" /></a></p>
<p>非常成功的一次聚会，期间非常多的大牛都交流了各自的心得，期间的一些知识避免以后忘记，暂时做个记录在这里。</p>
<p>PPT也提供下载了 <a href='http://www.woniu.us/wp-content/uploads/2010/08/2.ppt'>WEB缓存加速PPT</a><br />
<strong>前端</strong></p>
<p>浏览器缓存</p>
<p>浏览器与服务器之间传输GZIP</p>
<p>HTML静态化</p>
<p>图片服务器分离</p>
<p><strong>后端</strong></p>
<p>数据库集群</p>
<p>缓存</p>
<p>缓存常规简单做法：（1个进消息队列写数据库用来作长久备份,1个直接写进Memcached进行缓存）</p>
<p>为什么要使用ADODB这类数据中间层：是为了方便控制数据库的主从</p>
<p>最好在Memcached的前面再加一个SERVER,这个SERVER负责调度</p>
<p><strong>缓存的属性</strong><br />
存储介质（内存，磁盘）<br />
成本(开发，部署，硬件)，<br />
效率：SET效率，GET效率，序列算法，哈希算法，分布式算法<br />
命中率：（从缓存中返回正确数据的次数/总请求）<br />
容量：超过该值，启用一定的策略：转移到磁盘，远端，清空部分</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/optimization/371.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[转]PHP效率高写法</title>
		<link>http://www.woniu.us/optimization/298.html</link>
		<comments>http://www.woniu.us/optimization/298.html#comments</comments>
		<pubDate>Sat, 10 Apr 2010 17:07:34 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[优化]]></category>
		<category><![CDATA[php优化]]></category>
		<category><![CDATA[php缓存]]></category>

		<guid isPermaLink="false">http://www.woniu.us/?p=298</guid>
		<description><![CDATA[下面是一些提高php执行效率的方法，由于没找到原作者是谁，所以原文链接接不给出了。这里有些是我深有体会的，有些我没有测试过，先放这里，大家看看，同时也当作一个笔记放在这里供以后慢慢看]]></description>
			<content:encoded><![CDATA[<p>下面是一些提高php执行效率的方法，由于没找到原作者是谁，所以原文链接接不给出了。这里有些是我深有体会的，有些我没有测试过，先放这里，大家看看，同时也当作一个笔记放在这里供以后慢慢看</p>
<p>0、用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有echo能这么做，它是一种可以把多个字符串当作参数的“函数”（译注：PHP手册中说echo是语言结构，不是真正的函数，故把函数加上了双引号）。<br />
1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。</p>
<p>2、$row[’id’] 的速度是$row[id]的7倍。</p>
<p>3、echo 比 print 快，并且使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接，比如echo $str1,$str2。</p>
<p>4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。</p>
<p>5、注销那些不用的变量尤其是大数组，以便释放内存。</p>
<p>6、尽量避免使用__get，__set，__autoload。</p>
<p>7、require_once()代价昂贵。</p>
<p>8、include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。</p>
<p>9、如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。</p>
<p>10、函数代替正则表达式完成相同功能。</p>
<p>11、str_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。</p>
<p>12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。</p>
<p>13、使用选择分支语句（译注：即switch case）好于使用多个if，else if语句。</p>
<p>14、用@屏蔽错误消息的做法非常低效，极其低效。</p>
<p>15、打开apache的mod_deflate模块，可以提高网页的浏览速度。</p>
<p>16、数据库连接当使用完毕时应关掉，不要用长连接。</p>
<p>17、错误消息代价昂贵。</p>
<p>18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</p>
<p>19、递增一个全局变量要比递增一个局部变量慢2倍。</p>
<p>20、递增一个对象属性（如：$this->prop++）要比递增一个局部变量慢3倍。</p>
<p>21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</p>
<p>22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。</p>
<p>23、方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。</p>
<p>24、派生类中的方法运行起来要快于在基类中定义的同样的方法。</p>
<p>25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</p>
<p>26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</p>
<p>27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</p>
<p>28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</p>
<p>29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval 结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。</p>
<p>（举例如下）<br />
if (strlen($foo) < 5) { echo “Foo is too short”$$ }<br />
（与下面的技巧做比较）<br />
if (!isset($foo{5})) { echo “Foo is too short”$$ }</p>
<p>调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。</p>
<p>34、当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商（ISPs）和服务器。</p>
<p>35、并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
<p>36、并非要用类实现所有的数据结构，数组也很有用。</p>
<p>37、不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码？</p>
<p>38、当你需要时，你总能把代码分解成方法。</p>
<p>39、尽量采用大量的PHP内置函数。</p>
<p>40、如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
<p>41、评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
<p>42、mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
<p>43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下，尽量用file_get_contents，因为他的效率高得多！但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题；</p>
<p>44、尽量的少进行文件操作，虽然PHP的文件操作效率也不低的；</p>
<p>45、优化Select SQL语句，在可能的情况下尽量少的进行Insert、Update操作(在update上，我被恶批过)；</p>
<p>46、尽可能的使用PHP内部函数（但是我却为了找个PHP里面不存在的函数，浪费了本可以写出一个自定义函数的时间，经验问题啊！）；</p>
<p>47、循环内部不要声明变量，尤其是大变量：对象(这好像不只是PHP里面要注意的问题吧？)；</p>
<p>48、多维数组尽量不要循环嵌套赋值；</p>
<p>49、在可以用PHP内部字符串操作函数的情况下，不要用正则表达式；</p>
<p>50、foreach效率更高，尽量用foreach代替while和for循环；</p>
<p>51、用单引号替代双引号引用字符串；</p>
<p>52、“用i+=1代替i=i+1。符合c/c++的习惯，效率还高”；</p>
<p>53、对global变量，应该用完就unset()掉；</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/optimization/298.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[转]雅虎网站优化建议（中文版）</title>
		<link>http://www.woniu.us/web_ui/135.html</link>
		<comments>http://www.woniu.us/web_ui/135.html#comments</comments>
		<pubDate>Fri, 04 Dec 2009 02:41:21 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[web前端]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://snail.comsing.com/?p=135</guid>
		<description><![CDATA[Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了各种工具、写了大量的文章和博客并在各种会议上参与探讨。最佳实践的核心就是旨在提高网站性能。 
Excetional Performance团队总结出了一系列可以提高网站速度的方法。可以分为7大类34条。包括内容、服务器、cookie、CSS、JavaScript、图片、移动应用等七部分。 ]]></description>
			<content:encoded><![CDATA[<p>Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了各种工具、写了大量的文章和博客并在各种会议上参与探讨。最佳实践的核心就是旨在提高网站性能。<br />
Excetional Performance团队总结出了一系列可以提高网站速度的方法。可以分为7大类34条。包括内容、服务器、cookie、CSS、JavaScript、图片、移动应用等七部分。<br />
其中内容部分一共十条建议：<br />
一、内容部分<br />
1. 尽量减少HTTP请求</p>
<p>2. 减少DNS查找 <br />
3. 避免跳转 <br />
4. 缓存Ajxa <br />
5. 推迟加载 <br />
6. 提前加载 <br />
7. 减少DOM元素数量 <br />
8. 用域名划分页面内容 <br />
9. 使frame数量最少 <br />
10. 避免404错误 <br />
1、尽量减少HTTP请求次数 终端用户响应的时间中，有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少HTTP请求的次数。这是提高网页速度的关键步骤。 减少页面组件的方法其实就是简化页面设计。那么有没有一种方法既能保持页面内容的丰富性又能达到加快响应时间的目的呢？这里有几条减少HTTP请求次数同时又可能保持页面内容丰富的技术。<br />
合并文件是通过把所有的脚本放到一个文件中来减少HTTP请求的方法，如可以简单地把所有的CSS文件都放入一个样式表中。当脚本或者样式表在不同页面中使用时需要做不同的修改，这可能会相对麻烦点，但即便如此也要把这个方法作为改善页面性能的重要一步。<br />
CSS Sprites是减少图像请求的有效方法。把所有的背景图像都放到一个图片文件中，然后通过CSS的background-image和background-position属性来显示图片的不同部分；<br />
图片地图是把多张图片整合到一张图片中。虽然文件的总体大小不会改变，但是可以减少HTTP请求次数。图片地图只有在图片的所有组成部分在页面中是紧挨在一起的时候才能使用，如导航栏。确定图片的坐标和可能会比较繁琐且容易出错，同时使用图片地图导航也不具有可读性，因此不推荐这种方法；<br />
内联图像是使用data:URL scheme的方法把图像数据加载页面中。这可能会增加页面的大小。把内联图像放到样式表（可缓存）中可以减少HTTP请求同时又避免增加页面文件的大小。但是内联图像现在还没有得到主流浏览器的支持。<br />
减少页面的HTTP请求次数是你首先要做的一步。这是改进首次访问用户等待时间的最重要的方法。如同Tenni Theurer的他的博客Browser Cahe Usage – Exposed!中所说，HTTP请求在无缓存情况下占去了40%到60%的响应时间。让那些初次访问你网站的人获得更加快速的体验吧！  2、减少DNS查找次数 域名系统（DNS）提供了域名和IP的对应关系，就像电话本中人名和他们的电话号码的关系一样。当你在浏览器地址栏中输入<a href="http://Snail.comsing.com">http://Snail.comsing.com</a> 时，DNS解析服务器就会返回这个域名对应的IP地址。DNS解析的过程同样也是需要时间的。一般情况下返回给定域名对应的IP地址会花费20到120毫秒的时间。而且在这个过程中浏览器什么都不会做直到DNS查找完毕。<br />
缓存DNS查找可以改善页面性能。这种缓存需要一个特定的缓存服务器，这种服务器一般属于用户的ISP提供商或者本地局域网控制，但是它同样会在用户使用的计算机上产生缓存。DNS信息会保留在操作系统的DNS缓存中（微软Windows系统中DNS Client Service）。大多数浏览器有独立于操作系统以外的自己的缓存。由于浏览器有自己的缓存记录，因此在一次请求中它不会受到操作系统的影响。<br />
Internet Explorer默认情况下对DNS查找记录的缓存时间为30分钟，它在注册表中的键值为DnsCacheTimeout。Firefox对DNS的查找记录缓存时间为1分钟，它在配置文件中的选项为network.dnsCacheExpiration（Fasterfox把这个选项改为了1小时）。<br />
当客户端中的DNS缓存都为空时（浏览器和操作系统都为空），DNS查找的次数和页面中主机名的数量相同。这其中包括页面中URL、图片、脚本文件、样式表、Flash对象等包含的主机名。减少主机名的数量可以减少DNS查找次数。<br />
减少主机名的数量还可以减少页面中并行下载的数量。减少DNS查找次数可以节省响应时间，但是减少并行下载却会增加响应时间。我的指导原则是把这些页面中的内容分割成至少两部分但不超过四部分。这种结果就是在减少DNS查找次数和保持较高程度并行下载两者之间的权衡了。<br />
3、避免跳转 跳转是使用301和302代码实现的。下面是一个响应代码为301的HTTP头： HTTP/1.1 301 Moved Permanently Location: <a href="http://example.com/newuri">http://example.com/newuri</a> Content-Type: text/html 浏览器会把用户指向到Location中指定的URL。头文件中的所有信息在一次跳转中都是必需的，内容部分可以为空。不管他们的名称，301和302响应都不会被缓存除非增加一个额外的头选项，如Expires或者Cache-Control来指定它缓存。&lt;meat /&gt;元素的刷新标签和JavaScript也可以实现URL的跳转，但是如果你必须要跳转的时候，最好的<br />
方法就是使用标准的3XXHTTP状态代码，这主要是为了确保“后退”按钮可以正确地使用。<br />
但是要记住跳转会降低用户体验。在用户和HTML文档中间增加一个跳转，会拖延页面中所有元素的显示，因为在HTML文件被加载前任何文件（图像、Flash等）都不会被下载。<br />
有一种经常被网页开发者忽略却往往十分浪费响应时间的跳转现象。这种现象发生在当URL本该有斜杠（/）却被忽略掉时。例如，当我们要访问<a href="http://astrology.yahoo.com/astrology">http://astrology.yahoo.com/astrology</a> 时，实际上返回的是一个包含301代码的跳转，它指向的是<a href="http://astrology.yahoo.com/astrology/">http://astrology.yahoo.com/astrology/</a> （注意末尾的斜杠）。在Apache服务器中可以使用Alias 或者 mod_rewrite或者the DirectorySlash来避免。<br />
连接新网站和旧网站是跳转功能经常被用到的另一种情况。这种情况下往往要连接网站的不同内容然后根据用户的不同类型（如浏览器类型、用户账号所属类型）来进行跳转。使用跳转来实现两个网站的切换十分简单，需要的代码量也不多。尽管使用这种方法对于开发者来说可以降低复杂程度，但是它同样降低用户体验。一个可替代方法就是如果两者在同一台服务器上时使用Alias和mod_rewrite和实现。如果是因为域名的不同而采用跳转，那么可以通过使用Alias或者mod_rewirte建立CNAME（保存一个域名和另外一个域名之间关系的DNS记录）来替代。<br />
4、可缓存的AJAX Ajax经常被提及的一个好处就是由于其从后台服务器传输信息的异步性而为用户带来的反馈的即时性。但是，使用Ajax并不能保证用户不会在等待异步的JavaScript和XML响应上花费时间。在很多应用中，用户是否需要等待响应取决于Ajax如何来使用。例如，在一个基于Web的Email客户端中，用户必须等待Ajax返回符合他们条件的邮件查询结果。记住一点，“异步”并不异味着“即时”，这很重要。<br />
为了提高性能，优化Ajax响应是很重要的。提高Ajxa性能的措施中最重要的方法就是使响应具有可缓存性，具体的讨论可以查看Add an Expires or a Cache-Control Header。其它的几条规则也同样适用于Ajax： Gizp压缩文件，减少DNS查找次数，精简JavaScript，避免跳转，配置ETags<br />
让我们来看一个例子：一个Web2.0的Email客户端会使用Ajax来自动完成对用户地址薄的下载。如果用户在上次使用过Email web应用程序后没有对地址薄作任何的修改，而且Ajax响应通过Expire或者Cacke-Control头来实现缓存，那么就可以直接从上一次的缓存中读取地址薄了。必须告知浏览器是使用缓存中的地址薄还是发送一个新的请求。这可以通过为读取地址薄的Ajax URL增加一个含有上次编辑时间的时间戳来实现，例如，&amp;t=11900241612等。如果地址薄在上次下载后没有被编辑过，时间戳就不变，则从浏览器的缓存中加载从而减少了一次HTTP请求过程。如果用户修改过地址薄，时间戳就会用来确定新的URL和缓存响应并不匹配，浏览器就会重要请求更新地址薄。 即使你的Ajxa响应是动态生成的，哪怕它只适用于一个用户，那么它也应该被缓存起来。这样做可以使你的Web2.0应用程序更加快捷。<br />
5、推迟加载内容 你可以仔细看一下你的网页，问问自己“哪些内容是页面呈现时所必需首先加载的？哪些内容和结构可以稍后再加载？ 把整个过程按照onload事件分隔成两部分，JavaScript是一个理想的选择。例如，如果你有用于实现拖放和动画的JavaScript，那么它就以等待稍后加载，因为页面上的拖放元素是在初始化呈现之后才发生的。其它的例如隐藏部分的内容（用户操作之后才显现的内容）和处于折叠部分的图像也可以推迟加载 工具可以节省你的工作量：YUI Image Loader可以帮你推迟加载折叠部分的图片，YUI Get utility是包含JS和 CSS的便捷方法。比如你可以打开Firebug的Net选项卡看一下Yahoo的首页。 当性能目标和其它网站开发实践一致时就会相得益彰。这种情况下，通过程序提高网站性能的方法告诉我们，在支持JavaScript的情况下，可以先去除用户体验，不过这要保证你的网站在没有JavaScript也可以正常运行。在确定页面运行正常后，再加载脚本来实现如拖放和动画等更加花哨的效果。<br />
6、预加载 预加载和后加载看起来似乎恰恰相反，但实际上预加载是为了实现另外一种目标。预加载是在浏览器空闲时请求将来可能会用到的页面内容（如图像、样式表和脚本）。使用这种方法，当用户要访问下一个页面时，页面中的内容大部分已经加载到缓存中了，因此可以大大改善访问速度。<br />
下面提供了几种预加载方法： 无条件加载：触发onload事件时，直接加载额外的页面内容。以Google.com为例，你可以看一下它的spirit image图像是怎样在onload中加载的。这个spirit image图像在google.com主页中是不需要的，但是却可以在搜索结果页面中用到它。 有条件加载：根据用户的操作来有根据地判断用户下面可能去往的页面并相应的预加载页面内容。在search.yahoo.com中你可以看到如何在你输入内容时加载额外的页面内容。 有预期的加载：载入重新设计过的页面时使用预加载。这种情况经常出现在页面经过重新设计后用户抱怨“新的页面看起来很酷，但是却比以前慢”。问题可能出在用户对于你的旧站点建立了完整的缓存，而对于新站点却没有任何缓存内容。因此你可以在访问新站之前就加载一部内容来避免这种结果的出现。在你的旧站中利用浏览器的空余时间加载新站中用到的图像的和脚本来提高访问速度。<br />
7、减少DOM元素数量 一个复杂的页面意味着需要下载更多数据，同时也意味着JavaScript遍历DOM的效率越慢。比如当你增加一个事件句柄时在500和5000个DOM元素中循环效果肯定是不一样的。 大量的DOM元素的存在意味着页面中有可以不用移除内容只需要替换元素标签就可以精简的部分。你在页面布局中使用表格了吗？你有没有仅仅为了布局而引入更多的&lt;div&gt;元素呢？也许会存在一个适合或者在语意是更贴切的标签可以供你使用。 YUI CSS utilities可以给你的布局带来巨大帮助：grids.css可以帮你实现整体布局，font.css和reset.css可以帮助你移除浏览器默认格式。它提供了一个重新审视你页面中标签的机会，比如只有在语意上有意义时才使用&lt;div&gt;，而不是因为它具有换行效果才使用它。 DOM元素数量很容易计算出来，只需要在Firebug的控制台内输入：<br />
document.getElementsByTagName(’*&#8217;).length 那么多少个DOM元素算是多呢？这可以对照有很好标记使用的类似页面。比如Yahoo!主页<br />
是一个内容非常多的页面，但是它只使用了700个元素（HTML标签）。<br />
8、根据域名划分页面内容 把页面内容划分成若干部分可以使你最大限度地实现平行下载。由于DNS查找带来的影响你首先要确保你使用的域名数量在2个到4个之间。例如，你可以把用到的HTML内容和动态内容放在<a href="http://www.example.org">www.example.org</a>上，而把页面各种组件（图片、脚本、CSS)分别存放在statics1.example.org和statics.example.org上。 你可在Tenni Theurer和Patty Chi合写的文章Maximizing Parallel Downloads in the Carpool Lane找到更多相关信息。<br />
9、使iframe的数量最小 ifrmae元素可以在父文档中插入一个新的HTML文档。了解iframe的工作理然后才能更加有效地使用它，这一点很重要。<br />
&lt;iframe&gt;优点：<br />
 . 决加载缓慢的第三方内容如图标和广告等的加载问题 <br />
 . rity sandbox <br />
 . 行加载脚本 </p>
<p>&lt;iframe&gt;的缺点：<br />
 . 时内容为空，加载也需要时间 <br />
 . 阻止页面加载 <br />
 . 有语意 </p>
<p>10、不要出现404错误 HTTP请求时间消耗是很大的，因此使用HTTP请求来获得一个没有用处的响应（例如404没有找到页面）是完全没有必要的，它只会降低用户体验而不会有一点好处。 有些站点把404错误响应页面改为“你是不是要找***”，这虽然改进了用户体验但是同样也会浪费服务器资源（如数据库等）。最糟糕的情况是指向外部JavaScript的链接出现问题并返回404代码。首先，这种加载会破坏并行加载；其次浏览器会把试图在返回的404响应内容中找到可能有用的部分当作JavaScript代码来执行。<br />
二、服务器端<br />
除了在网站在内容上的改进外，在网站服务器端上也有需要注意和改进的地方，它们包括：<br />
1. 使用内容分发网络</p>
<p>2. 为文件头指定Expires或Cache-Control <br />
3. Gzip压缩文件内容 <br />
4. 配置ETag <br />
5. 尽早刷新输出缓冲 <br />
6. 使用GET来完成AJAX请求 <br />
 11、使用内容分发网络 用户与你网站服务器的接近程度会影响响应时间的长短。把你的网站内容分散到多个、处于不同地域位置的服务器上可以加快下载速度。但是首先我们应该做些什么呢？ 按地域布置网站内容的第一步并不是要尝试重新架构你的网站让他们在分发服务器上正常运行。根据应用的需求来改变网站结构，这可能会包括一些比较复杂的任务，如在服务器间同步Session状态和合并数据库更新等。要想缩短用户和内容服务器的距离，这些架构步骤可能是不可避免的。 要记住，在终端用户的响应时间中有80%到90%的响应时间用于下载图像、样式表、脚本、Flash等页面内容。这就是网站性能黄金守则。和重新设计你的应用程序架构这样比较困难的任务相比，首先来分布静态内容会更好一点。这不仅会缩短响应时间，而且对于内容分发网络来说它更容易实现。 内容分发网络（Content Delivery Network，CDN）是由一系列分散到各个不同地理位置上的Web服务器组成的，它提高了网站内容的传输速度。用于向用户传输内容的服务器主要是根据和用户在网络上的靠近程度来指定的。例如，拥有最少网络跳数（network hops）和响应速度最快的服务器会被选定。 一些大型的网络公司拥有自己的CDN，但是使用像Akamai Technologies，Mirror Image Internet， 或者Limelight Networks这样的CDN服务成本却非常高。对于刚刚起步的企业和个人网站来说，可能没有使用CDN的成本预算，但是随着目标用户群的不断扩大和更加全球化，CDN就是实现快速响应所必需的了。以Yahoo来说，他们转移到CDN上的网站程序静态内容节省了终端用户20%以上的响应时间。使用CDN是一个只需要相对简单地修改代码实现显著改善网站访问速度的方法。<br />
12、为文件头指定Expires或Cache-Control  这条守则包括两方面的内容： 对于静态内容：设置文件头过期时间Expires的值为“Never expire”（永不过期） 对于动态内容：使用恰当的Cache-Control文件头来帮助浏览器进行有条件的请求 网页内容设计现在越来越丰富，这就意味着页面中要包含更多的脚本、样式表、图片和Flash。第一次访问你页面的用户就意味着进行多次的HTTP请求，但是通过使用Expires文件头就可以使这样内容具有缓存性。它避免了接下来的页面访问中不必要的HTTP请求Expires文件头经常用于图像文件，但是应该在所有的内容都使用他，包括脚本、样式表和Flash等。 浏览器（和代理）使用缓存来减少HTTP请求的大小和次数以加快页面访问速度。Web服务器在HTTP响应中使用Expires文件头来告诉客户端内容需要缓存多长时间。下面这个例子是一个较长时间的Expires文件头，它告诉浏览器这个响应直到2010年4月15日才过期。 Expires: Thu, 15 Apr 2010 20:00:00 GMT 如果你使用的是Apache服务器，可以使用ExpiresDefault来设定相对当前日期的过期时间。下面这个例子是使用ExpiresDefault来设定请求时间后10年过期的文件头： ExpiresDefault “access plus 10 years”<br />
要切记，如果使用了Expires文件头，当页面内容改变时就必须改变内容的文件名。依Yahoo!来说我们经常使用这样的步骤：在内容的文件名中加上版本号，如yahoo_2.0.6.js。 使用Expires文件头只有会在用户已经访问过你的网站后才会起作用。当用户首次访问你的网站时这对减少HTTP请求次数来说是无效的，因为浏览器的缓存是空的。因此这种方法对于你网站性能的改进情况要依据他们“预缓存”存在时对你页面的点击频率（“预缓存”中已经包含了页面中的所有内容）。Yahoo!建立了一套测量方法<br />
，我们发现所有的页面浏览量中有75~85%都有“预缓存”。通过使用Expires文件头，增加了缓存在浏览器中内容的数量，并且可以在用户接下来的请求中再次使用这些内容，这甚至都不需要通过用户发送一个字节的请求。<br />
13、Gzip压缩文件内容 网络传输中的HTTP请求和应答时间可以通过前端机制得到显著改善。的确，终端用户的带宽、互联网提供者、与对等交换点的靠近程度等都不是网站开发者所能决定的。但是还有其他因素影响着响应时间。通过减小HTTP响应的大小可以节省HTTP响应时间。 从HTTP/1.1开始，web客户端都默认支持HTTP请求中有Accept-Encoding文件头的压缩格式： Accept-Encoding: gzip, deflate 如果web服务器在请求的文件头中检测到上面的代码，就会以客户端列出的方式压缩响应内容。Web服务器把压缩方式通过响应文件头中的Content-Encoding来返回给浏览器。 Content-Encoding: gzip Gzip是目前最流行也是最有效的压缩方式。这是由GNU项目开发并通过RFC 1952来标准化的。另外仅有的一个压缩格式是deflate，但是它的使用范围有限效果也稍稍逊色。 Gzip大概可以减少70%的响应规模。目前大约有90%通过浏览器传输的互联网交换支持gzip格式。如果你使用的是Apache，gzip模块配置和你的版本有关：Apache 1.3使用mod_zip，而Apache 2.x使用moflate。 浏览器和代理都会存在这样的问题：浏览器期望收到的和实际接收到的内容会存在不匹配的现象。幸好，这种特殊情况随着旧式浏览器使用量的减少在减少。Apache模块会通过自动添加适当的Vary响应文件头来避免这种状况的出现。 服务器根据文件类型来选择需要进行gzip压缩的文件，但是这过于限制了可压缩的文件大多数web服务器会压缩HTML文档。对脚本和样式表进行压缩同样也是值得做的事情，但是很多web服务器都没有这个功能。实际上，压缩任何一个文本类型的响应，包括XML和JSON，都值得的。图像和PDF文件由于已经压缩过了所以不能再进行gzip压缩。如果试图gizp压缩这些文件的话不但会浪费CPU资源还会增加文件的大小。 Gzip压缩所有可能的文件类型是减少文件体积增加用户体验的简单方法。<br />
14、配置ETag  Entity tags（ETags）（实体标签）是web服务器和浏览器用于判断浏览器缓存中的内容和服务器中的原始内容是否匹配的一种机制（“实体”就是所说的“内容”，包括图片、脚本、样式表等）。增加ETag为实体的验证提供了一个比使用“last-modified date（上次编辑时间）”更加灵活的机制。Etag是一个识别内容版本号的唯一字符串。唯一的格式限制就是它必须包含在双引号内。原始服务器通过含有ETag文件头的响应指定页面内容的ETag。 HTTP/1.1 200 OK<br />
Last-Modified: Tue, 12 Dec 2006 03:03:59 GMT ETag: “10c24bc-4ab-457e1c1f” Content-Length: 12195 稍后，如果浏览器要验证一个文件，它会使用If-None-Match文件头来把ETag传回给原始服务器。在这个例子中，如果ETag匹配，就会返回一个304状态码，这就节省了12195字节的响应。      GET /i/yahoo.gif HTTP/1.1 Host: us.yimg.com If-Modified-Since: Tue, 12 Dec 2006 03:03:59 GMT If-None-Match: “10c24bc-4ab-457e1c1f” HTTP/1.1 304 Not Modified ETag的问题在于，它是根据可以辨别网站所在的服务器的具有唯一性的属性来生成的。当浏览器从一台服务器上获得页面内容后到另外一台服务器上进行验证时ETag就会不匹配，这种情况对于使用服务器组和处理请求的网站来说是非常常见的。默认情况下，Apache和IIS都会把数据嵌入ETag中，这会显著减少多服务器间的文件验证冲突。 Apache 1.3和2.x中的ETag格式为inode-size-timestamp。即使某个文件在不同的服务器上会处于相同的目录下，文件大小、权限、时间戳等都完全相同，但是在不同服务器上他们的内码也是不同的。 IIS 5.0和IIS 6.0处理ETag的机制相似。IIS中的ETag格式为Filetimestamp:ChangeNumber。用ChangeNumber来跟踪IIS配置的改变。网站所用的不同IIS服务器间ChangeNumber也不相同。 不同的服务器上的Apache和IIS即使对于完全相同的内容产生的ETag在也不相同，用户并不会接收到一个小而快的304响应；相反他们会接收一个正常的200响应并下载全部内容。如果你的网站只放在一台服务器上，就不会存在这个问题。但是如果你的网站是架设在多个服务器上，并且使用Apache和IIS产生默认的ETag配置，你的用户获得页面就会相对慢一点，服务器会传输更多的内容，占用更多的带宽，代理也不会有效地缓存你的网站内容。即使你的内容拥有Expires文件头，无论用户什么时候点击“刷新”或者“重载”按钮都会发送相应的GET请求。 如果你没有使用ETag提供的灵活的验证模式，那么干脆把所有的ETag都去掉会更好。Last-Modified文件头验证是基于内容的时间戳的。去掉ETag文件头会减少响应和下次请求中文件的大小。微软的这篇支持文稿<br />
讲述了如何去掉ETag。在Apache中，只需要在配置文件中简单添加下面一行代码就可以了： FileETag none<br />
15、尽早刷新输出缓冲 当用户请求一个页面时，无论如何都会花费200到500毫秒用于后台组织HTML文件。在这期间，浏览器会一直空闲等待数据返回。在PHP中，你可以使用flush()方法，它允许你把已经编译的好的部分HTML响应文件先发送给浏览器，这时浏览器就会可以下载文件中的内容（脚本等）而后台同时处理剩余的HTML页面。这样做的效果会在后台烦恼或者前台较空闲时更加明显。 输出缓冲应用最好的一个地方就是紧跟在&lt;head /&gt;之后，因为HTML的头部分容易生成而且头部往往包含CSS和JavaScript文件，这样浏览器就可以在后台编译剩余HTML的同时并行下载它们。 例子：<br />
… &lt;!– css, js –&gt; &lt;/head&gt;<br />
&lt;?php flush(); ?&gt; &lt;body&gt; … &lt;!– content –&gt;<br />
为了证明使用这项技术的好处，Yahoo!搜索率先研究并完成了用户测试。<br />
16、使用GET来完成AJAX请求 Yahoo!Mail团队发现，当使用XMLHttpRequest时，浏览器中的POST方法是一个“两步走的过程：首先发送文件头，然后才发送数据。因此使用GET最为恰当，因为它只需发送一个TCP包（除非你有很多cookie）。IE中URL的最大长度为2K，因此如果你要发送一个超过2K的数据时就不能使用GET了。 一个有趣的不同就是POST并不像GET那样实际发送数据。根据HTTP规范，GET意味着“获取”数据，因此当你仅仅获取数据时使用GET更加有意义（从语意上讲也是如此），相反，发送并在服务端保存数据时使用POST。<br />
三、JavaScript和CSS<br />
除此之外，JavaScript和CSS也是我们页面中经常用到的内容，对它们的优化也提高网站性能的重要方面： CSS：<br />
1. 把样式表置于顶部</p>
<p>2. 避免使用CSS表达式（Expression） <br />
3. 使用外部JavaScript和CSS <br />
4. 削减JavaScript和CSS <br />
5. 用&lt;link&gt;代替@import <br />
6. 避免使用滤镜 <br />
JavaScript<br />
1. <br />
把脚本置于页面底部<br />
2. 使用外部JavaScript和CSS <br />
3. 削减JavaScript和CSS <br />
4. 剔除重复脚本 <br />
5. 减少DOM访问 <br />
6. 开发智能事件处理程序 <br />
17、把样式表置于顶部 在研究Yahoo!的性能表现时，我们发现把样式表放到文档的&lt;head /&gt;内部似乎会加快页面的下载速度。这是因为把样式表放到&lt;head /&gt;内会使页面有步骤的加载显示。 注重性能的前端服务器往往希望页面有秩序地加载。同时，我们也希望浏览器把已经接收到内容尽可能显示出来。这对于拥有较多内容的页面和网速较慢的用户来说特别重要向用户返回可视化的反馈，比如进程指针，已经有了较好的研究并形成了正式文档<br />
。在我们的研究中HTML页面就是进程指针。当浏览器有序地加载文件头、导航栏、顶部的logo<br />
等对于等待页面加载的用户来说都可以作为可视化的反馈。这从整体上改善了用户体验。把样式表止内容的有序呈现。浏览器中止呈现是为了避免样式改变引起的页面元素重绘。用户不得不面对一个空白页面。 HTML规范<br />
清楚指出样式表要只能出现在文档的&lt;head /&gt;区域内，尽管它可以多次使用它”。无论是引起白屏还是出现没有样式化的内容都不值得去尝试。最好的方案就是按照HTML规范在文档&lt;head /&gt;内加载你的样式表。<br />
CSS表达式是动态设置CSS属性的强大（但危本开始支持CSS表达式。下面的例子中，使用CSS表达式可以实现隔一个小时切换一次背景颜色： background“#F08A00″ ); 如上所示，expres计算结果来设置。expression方法在其它浏览器中不起作用，因此在跨浏览器的设计中单独针对Internet Explorer设置时会比较有用。 表达式的问题就在于它的计算频率要比我们想象的多就是在页面滚动、乃至移动鼠标时都会要重新计算一次。给CSS表达式增加一个计数器可以跟踪表达式的计算频率。在页面中随便移动鼠标都可以轻松达到10000次以上的计算量。 一个减少果赋给指定的样式属性，并用这个属性来代替CSS表达式。如果样式属性必须在页面周期内动态地改变，使用事件句柄来代替CSS表达式是一个可行办法。如果必须使用CSS表达式，一定要记住它们要计算成千上万次并且可能会对你页面的性能产生影响。<br />
很多性能规则都是关于如何处理外一个更基本的问题：JavaScript和CSS是应该放在外部文件中呢还是把它们放在页面本身之内呢？ 在实际应用中器中产生缓存。内置在HTML文档中的JavaScript和CSS则会在每次请求中随HTML文档重新下载。这虽然减少了HTTP请求的次数，却增加了HTML文档的大小。从另一方面来说，如果外部文件中的JavaScript和CSS被浏览器缓存，在没有增加HTTP请求次数的同时可以减少HTML文档的大小。 关键问题是，外部JavaScri有一定的难度，但是仍然有一些指标可以一测量它。如果一个会话中用户会浏览你网站中的多个页面，并且这些页面中会重复使用相同的脚本和样式表，缓存外部文件就会带来更大的益处。 许多网站没有功能JavaScript和CSS作为外部文件引用。比较适合使用内置代码的例外就是网站的如Yahoo!主页<br />
和My Yahoo!<br />
。主页在一次会话中拥有较少（可能只有一次）的浏览量，你可以发现内置JavaScript和CSS对于终端用户来说会加快响应时 间。<br />
对于拥有较大浏览量的首页来说，有一种技术可以平衡内置代码带来的HT通过使用外部文件进行缓存带来的好处。其中一个就是在首页中内置JavaScript和CSS，但是在页面下载完成后动态下载外部文件，在子页面中使用到这些文件时，它们已经缓存到浏览器了。<br />
精简是指从去除代码不必要的的注释、不需要的空白字符（空格、换行、tab缩进）等都要去掉。在JavaScript中，由于需要下载的文件体积变小了从而节省了响应时间。精简JavaScript中目前用到的最广泛的两个工具是JSMin和YUI Compressor。YUI Compressor还可用于精简CSS。 混淆是另外一种可用于源代码优化的方法。这种方法要比精简复杂一些并且在混淆程更易产生问题。在对美国前10大网站的调查中发现，精简也可以缩小原来代码体积的21%，而混淆可以达到25%。尽管混淆法可以更好地缩减代码，但是对于JavaScript来说精简的风险更小。 除消减外部的脚本和样式减。即使你用Gzip压缩过脚本和样式表，精简这些文件仍然可以节省5%以上的空间。由于JavaScript和CSS的功能和体积的增加，消减代码将会获得益处。<br />
前面的最佳实现中提到CSS应该放置在顶端在IE中，页面底部@import和使用&lt;link&gt;作用是一样的，因此最好不<br />
IE独有属性AlphaIm这个滤镜的问题在于浏览器加载图片时它会终止内容的呈现并且冻结浏览器。在每一个元素（不仅仅是图片）它都会运算一次，增加了内存开支，因此它的问题是多方面的。 完全避免使用AlphaImageLoader的最好方法就是使用PNG8格式来代替，这种格式能在IE中很好地工作。如果你确实需要使用AlphaImageLoader，请使用下划线_filter又使之对IE7以上版本的用户无效。<br />
脚本带来的问题就是它阻止名的并行下载内容不超过两个。如果你的图片放在多个主机名上，你可以在每个并行下载中同时下载2个以上的文件。但是当下载脚本时，浏览器就不会同时下载其它文件了，即便是主机名不相同。 在某些情况下把脚本移到document.write来插入页面内容，它就不能被往下移动了。这里可能还会有作用题。很多情况下，都会遇到这方面的问题。 一个经常用到的替代方法就是使用延迟脚本。document.write，它告诉浏览器继续显示。不幸的是，Firefox并不支持DEFERInternet Explorer中，脚本可能会被延迟但效果也不会像我们所期望的那样。如果脚本可以被延迟，那么它就可以移到页面的底部。这会让你的页面加载的快一点。<br />
并不多见。对于美国两种主要因素导致一个脚本被重复引用的奇怪现象发生：团队规模和脚本数量。如果真的存在这种情况，重复脚本会引起不必要的HTTP请求和无用的JavaScript运算，这降低了网站性能。 在Internet Explorer中会产生不必要的HTTP请求，而在Firefox却不会。在Internet Explorer中，如果生两次HTTP请求。即时脚本可以缓存，当用户重载页面时也会产生额外的HTTP请求。 除增加额外的HTTP请求外，多次运算脚本也会浪费时间。在Internet Explorer和Firefox中不管脚本是否可缓存，它们都存在重复运算JavaScript的问题。 一个避免偶尔发生的两次引用同一脚本的方法是在模板中使用脚本管理模块引用脚本在HTML页面中使用&lt;script /&gt;标签引用脚本的最常见方法就是： &lt;script type=”text/javascript” src=”menu_1.0.17.js”&gt;&lt;/script&gt;  在PHP中可以通过创建名为insertScript的方法来替代： &lt;?php insertScript(”menu.js”) ?&gt;  为了防止多次重复引用脚本，这个方法中还应该使用其它机制录和为脚本文件名中增加版本号以用于25、减少DOM访问<br />
• 缓存已经访问过的有关元素 <br />
 .  避免使用JavaScript来修改页<br />
 . 关此方面的更多信息请查看Julien Lecomte在</p>
<p>26、开发<br />
些事件句病被频繁地触发。这好方法了。如果你在一个div中有10个按钮，你只需要在div上附加一次事件句柄就可以了，而不用去为每一个按钮增加一个句柄。事件冒泡时你可以捕捉到事件并判断出是哪个事件发出的。 你同样也不用为了操作DOM树而等待onload事件的发生。你需要做的就是等待树结构中你要访问的元素出现你可能会希望用DOMContentLoaded事件来代替onload，但是在所有浏览器都支持它之前你可使用YUI 事件应用程序中的onAvailable方法。 有关此方面的更多信息请查看Julien Lecomte在YUI专题中的文章“高性能Ajax应该程序”。 四、Cookie，图片及移动应用<br />
图片和Coockie也是我们网站中几乎不可缺少组成部分，此外随着移动设备的流行，对于移动应用的优化也十分重要。这主要包括： Coockie:<br />
1.  减小Cookie体积 </p>
<p>2. 对于页面内容使用无coockie域名 <br />
图片：<br />
1.  优化图像 </p>
<p>2. 优化CSS Spirite <br />
3. 不要在HTML中缩放图像 <br />
4. favicon.ico要小而且可缓存 <br />
移动应用：<br />
1.  保持单个内容小于25K </p>
<p>2. 打包组件成复合文本 <br />
 27、减小Cookie体积 HTTP coockie可以用于权限验证和个性化身份等多种用途。coockie内的有关信息是通过HTTP文件头来在web服务器和浏览器之间进行交流的。因此保持coockie尽可能的小以减少用户的响应时间十分重要。 有关更多信息可以查看Tenni Theurer和Patty Chi的文章“When the Cookie Cru这们研究中主要包括：<br />
 . 除不必要的coockie <br />
 . coockie体积尽量小以减少对用户响应的影响 <br />
 . 意在适应级别的域名上设置coockie以便使子域名不受影响 <br />
 . 置合理的过期时间。较早地Expire时间和不要过早去清除coockie，都会改善用户的响应时间。 </p>
<p>28、对于页面内容使用无coockie域名 当浏览器在请求中同时请求一张静态的图片和发送coockie时，服务器对于这些coockie不会做任何地使用。因此他们只是因为某些负面因素而创建的网络传输。所有你应该确定对于静态内容的请求是无coockie的请求。创建一个子域名并用他来存放所有静态内容。 如果你的域名是<a href="http://www.example.org">www.example.org</a>，你可以在static.example.org上存在静态内容。但是，如果你不是在<a href="http://www.example.org">www.example.org</a>上而是在顶级域名example.org设置了coockie，那么所有对于static.example.org的请求都包含coockie。在这种情况下，你可以再重新购买一个新的域名来存在静态内容，并且要保持这个域名是无coockie的。Yahoo!使用的是ymig.com，YouTube使用的是ytimg.com，Amazon使用的是images-anazon.com等等。 使用无coockie域名存在静态内容的另外一个好处就是一些代理（服务器）可能会拒绝对coockie的内容请求进行缓存。一个相关的建议就是，如果你想确定应该使用<br />
example.org还是<a href="http://www.example.org">www.example.org</a>作为你的一主页，你要考虑到coockie带来的影响。忽略掉www会使你除了把coockie设置到*.example.org（*是泛域名解析，代表了所有子域名译者dudo注<br />
）外没有其它选择，因此出于性能方面的考虑最好是使用带有www的子域名并且在它上面设置coockie。<br />
29、优化图像 设计人员完成对页面的设计之后，不要急于将它们上传到web服务器，这里还需要做几件事：<br />
 . 可以检查一下你的GIF图片中图像颜色的数量是否和调色板规格一致。 使用imagemagick中下面的命令行很容易检查： identify -verbose image.gif  如果你发现图片中只用到了4种颜色，而在调色板的中显示的256色的颜色槽，那么这张图片就还有压缩的空间。 </p>
<p>• 尝试把GIF格式转换成PNG格式，看看是否节省空间。大多数情况下是可以压缩的。由于浏览器支持有限，设计者们往往不太乐意使用PNG格式的图片，不过这都是过去的事情了。现在只有一个问题就是在真彩PNG格式中的alpha通道半透明问题，不过同样的，GIF也不是真彩格式也不支持半透明。因此GIF能做到的，PNG（PNG8）同样也能做到（除了动画）。下面这条简单的命令可以安全地把GIF格式转换为PNG格式： convert image.gif image.png “我们要说的是：给PNG一个施展身手的机会吧！” <br />
• 在所有的PNG图片上运行pngcrush（或者其它PNG优化工具）。例如： pngcrush image.png -rem alla -reduce -brute result.png <br />
• 在所有的JPEG图片上运行jpegtran。这个工具可以对图片中的出现的锯齿等做无损操作，同时它还可以用于优化和清除图片中的注释以及其它无用信息（如EXIF信息）： jpegtran -copy none -optimize -perfect src.jpg dest.jpg <br />
30、优化CSS Spirite<br />
 . Spirite中水平排列你的图片，垂直排列会稍稍增加文件大小； <br />
 . 中把颜色较近的组合在一起可以降低颜色数，理想状况是低于256色以便适用PNG8格式； <br />
 . 于移动，不要在Spirite的图像中间留有较大空隙。这虽然不大会增加文件大小但对于用户代理来说它需要更少的内存来把图片解压为像素地图。100×100的图片为1万像素，而1000×1000就是100万像素。 </p>
<p>31、不要在HTML中缩放图像 不要为了在HTML中设置长宽而使用比实际需要大的图片。如果你需要： &lt;img width=”100″ height=”100″ src=”mycat.jpg” alt=”My Cat” /&gt; 那么你的图片（mycat.jpg）就应该是100×100像素而不是把一个500×500像素的图片缩小使用。<br />
32、favicon.ico要小而且可缓存 favicon.ico是位于服务器根目录下的一个图片文件。它是必定存在的，因为即使你不关心它是否有用，浏览器也会对它发出请求，因此最好不要返回一个404 Not Found的响应。由于是在同一台服务器上，它每被请求一次coockie就会被发送一次。这个图片文件还会影响下载顺序，例如在IE中当你在onload中请求额外的文件时，favicon会在这些额外内容被加载前下载。 因此，为了减少favicon.ico带来的弊端，要做到：<br />
 . 件尽量地小，最好小于1K <br />
 . 适当的时候（也就是你不要打算再换favicon.ico的时候，因为更换新文件时不能对它进行重命名）为它设置Expires文件头。你可以很安全地把Expires文件头设置为未来的几个月。你可以通过核对当前favicon.ico的上次编辑时间来作出判断。 </p>
<p>Imagemagick可以帮你创建小巧的favicon。<br />
33、保持单个内容小于25K 这条限制主要是因为iPhone不能缓存大于25K的文件。注意这里指的是解压缩后的大小。由于单纯gizp压缩可能达不要求，因此精简文件就显得十分重要。 查看更多信息，请参阅Wayne Shea和Tenni Theurer的文件“Performance Research, Part 5: iPhone Cacheability – Making it Stick”。<br />
34、打包组件成复合文本 把页面内容打包成复合文本就如同带有多附件的Email，它能够使你在一个HTTP请求中取得多个组件（切记：HTTP请求是很奢侈的）。当你使用这条规则时，首先要确定用户代理是否支持（iPhone就不支持）。<br />
 </p>
<p>PDF下载<a href="http://snail.comsing.com/wp-content/uploads/Yahooyouhua.pdf">http://snail.comsing.com/wp-content/uploads/Yahooyouhua.pdf</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/web_ui/135.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>页面缓存的小细节</title>
		<link>http://www.woniu.us/servers/133.html</link>
		<comments>http://www.woniu.us/servers/133.html#comments</comments>
		<pubDate>Fri, 04 Dec 2009 01:48:48 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[WEB服务器]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[html缓存]]></category>
		<category><![CDATA[php缓存]]></category>
		<category><![CDATA[缓存]]></category>
		<category><![CDATA[缓存时间]]></category>
		<category><![CDATA[页面缓存]]></category>

		<guid isPermaLink="false">http://snail.comsing.com/servers/133.html</guid>
		<description><![CDATA[通过发送cache-control头文件来通知客户端浏览器的缓存方案，常见的取值有private、no-cache、max-age、must-revalidate等，默认为private。]]></description>
			<content:encoded><![CDATA[<p><strong><span style="color: #004000; font-size: large;">http头Cache-control</span></strong></p>
<p>通过发送cache-control头文件来通知客户端浏览器的缓存方案，常见的取值有private、no-cache、max-age、must-revalidate等，默认为private。</p>
<p><strong>Cache-Control: max-age=31536000</strong></p>
<p>此种情况的话，打开新窗口或者在地址栏回车,的时候如果在这个时间内就不会重新访问服务器，上面表示缓存时间为1年。若按后退按扭则不会重新访问服务器，无论过没过期，按刷新按钮的话，无论过没过期都会重新访问。</p>
<p><strong>Cache-Control:private</strong></p>
<p>此种情况在打开新窗口以及刷新的时候会访问服务器，在地址栏输入的时候则只有第一次访问时会访问服务器，以后就不再访问，按后退按钮也不会访问服务器</p>
<p><strong>Cache-Control:no-cache</strong></p>
<p>此种情况的话每次都会访问服务器</p>
<p><strong>Cache-Control:must-revalidate</strong></p>
<p>此种情况与Cache-Control:private一样</p>
<p><strong> </strong></p>
<p><strong><span style="color: #004000;">Expires: Sat, 04 Dec 2010 01:00:43 GMT</span></strong></p>
<p>Expires用于控制请求文件的有效时间，当请求数据在有效期内时客户端浏览器从缓存请求数据而不是服务器端. 当缓存中数据失效或过期，才决定从服务器更新数据。<br />
可以使用Apache的mod_expires 模块来设置，这包括控制应答时的<strong>Expires</strong>头内容和Cache-Control头的max-age指令</p>
<p>当设置了expires后，会自动输出Cache-Control 的max-age 信息，这个数值是expires有效期内的秒数</p>
<p> </p>
<p><strong><span style="color: #004000;">Last-Modified: Wed, 22 Apr 2009 05:48:04 GMT</span></strong></p>
<p>什么是”Last-Modified”?<br />
在浏览器第一次请求某一个URL时，服务器端的返回状态会是200，内容是你请求的资源，同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间</p>
<p>客户端第二次请求此URL时，根据 HTTP 协议的规定，浏览器会向服务器传送 If-Modified-Since 报头，询问该时间之后文件是否有被修改过。如果服务器端的资源没有变化，则自动返回HTTP/1.x 304 Not Modified状态码，内容为空，这样就节省了传输数据量</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/servers/133.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php使用gzip压缩网页传输的文件大小</title>
		<link>http://www.woniu.us/php_basic/127.html</link>
		<comments>http://www.woniu.us/php_basic/127.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 09:27:12 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[PHP基础知识]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[gzip]]></category>
		<category><![CDATA[php压缩]]></category>
		<category><![CDATA[php缓存]]></category>

		<guid isPermaLink="false">http://snail.comsing.com/php_basic/127.html</guid>
		<description><![CDATA[关于如何开启服务器的gzip支持这里就不多说了。我以前很长一段时间将自己的服务器的gzip压缩开启了，以为这样任何文件的传输都自动会压缩了。但是事实上并不是如此的。直到有一天我下载了一个火狐的http头插件，打开谷歌的时候查看其头信息，发现了两个gzip才知道Accept-Encoding: gzip,deflate表示浏览器支持gzip而Content-Encoding: gzip表示所请求的页面是通过gzip压缩传输的，然后我打开我的网站发现并没有Content-Encoding: gzip这个，我才知道原来服务器开启了gzip是一码事，在程序中使没使用是另外一回事]]></description>
			<content:encoded><![CDATA[<p><strong>关于gzip的误区</strong></p>
<p>关于如何开启服务器的gzip支持这里就不多说了。我以前很长一段时间将自己的服务器的gzip压缩开启了，以为这样任何文件的传输都自动会压缩了。但是事实上并不是如此的。直到有一天我下载了一个火狐的http头插件，打开谷歌的时候查看其头信息，发现了两个gzip才知道Accept-Encoding: gzip,deflate表示浏览器支持gzip而Content-Encoding: gzip表示所请求的页面是通过gzip压缩传输的，然后我打开我的网站发现并没有Content-Encoding: gzip这个，我才知道原来服务器开启了gzip是一码事，在程序中使没使用是另外一回事。</p>
<p>下面是http头</p>
<p><a href="http://www.google.com/">http://www.google.com/</a></p>
<p>GET / HTTP/1.1<br />
Host: www.google.com<br />
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.8.0.5) Gecko/20060719 (FoxPlus) Firefox/1.5.0.5<br />
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5<br />
Accept-Language: zh-cn,zh;q=0.5<br />
Accept-Encoding: gzip,deflate<br />
Accept-Charset: gb2312,utf-8;q=0.7,*;q=0.7<br />
Keep-Alive: 300<br />
Connection: keep-alive</p>
<p>HTTP/1.x 200 OK<br />
Date: Thu, 03 Dec 2009 09:04:14 GMT<br />
Expires: -1<br />
Cache-Control: private, max-age=0<br />
Content-Type: text/html; charset=UTF-8<br />
Content-Encoding: gzip</p>
<p>为什么需要程序员自己决定什么时候启用gzip传输？因为调用gzip会消耗一定的系统资源，所以至于究竟要如何操作，apache或者说webserver将控制权交给了程序员。</p>
<p><strong>PHP如何使用gzip压缩</strong></p>
<p>1：用.htaccess文件实现</p>
<p>在.htaccess加入如下代码</p>
<p>php_flag zlib.output_compression on<br />
php_value zlib.output_compression_level 2</p>
<p>2：用PHP代码实现</p>
<div class="codecolorer-container php vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">//启用GIP </span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/function_exists"><span style="color: #990000;">function_exists</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ob_gzhandler'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #666666; font-style: italic;">//判断服务器是否支持 </span><br />
&nbsp; <a href="http://www.php.net/ob_start"><span style="color: #990000;">ob_start</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'ob_gzhandler'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">--&gt;</span></div></div>
<p>这里还有更加详细的介绍 <a title="http://www.xueit.com/html/2009-04/22_1062_00.html" href="http://www.xueit.com/html/2009-04/22_1062_00.html">http://www.xueit.com/html/2009-04/22_1062_00.html</a></p>
<p> </p>
<p>This should be a compressed page.</p>
<p> </p>
<p>压缩css的实例：</p>
<p>首先新建一个gzip-css.php文件，代码如下</p>
<div class="codecolorer-container php vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/ob_start"><span style="color: #990000;">ob_start</span></a> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;ob_gzhandler&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-type: text/css; charset: UTF-8&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Cache-Control: must-revalidate&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$offset</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$ExpStr</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Expires: &quot;</span> <span style="color: #339933;">.</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/gmdate"><span style="color: #990000;">gmdate</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;D, d M Y H:i:s&quot;</span><span style="color: #339933;">,</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/time"><span style="color: #990000;">time</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$offset</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot; GMT&quot;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <a href="http://www.php.net/header"><span style="color: #990000;">header</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ExpStr</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p>.htaccess设置如下</p>
<pre>AddHandler application/x-httpd-php .css
php_value auto_prepend_file gzip-css.php
php_flag zlib.output_compression On</pre>
<p>ob_start详解<br />
ob_start  ([  callback $output_callback  [,  int $chunk_size  [,  bool $erase  ]]] )<br />
output_callback表示回调函数，该回调函数接受的参数是缓冲区的内容，返回的值也是缓冲区的内容</p>
<div class="codecolorer-container php vibrant" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<br />
<span style="color: #000000; font-weight: bold;">function</span> callback<span style="color: #009900;">&#40;</span><span style="color: #000088;">$buffer</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
  <span style="color: #666666; font-style: italic;">// replace all the apples with oranges</span><br />
  <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><a href="http://www.php.net/str_replace"><span style="color: #990000;">str_replace</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;apples&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;oranges&quot;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$buffer</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<a href="http://www.php.net/ob_start"><span style="color: #990000;">ob_start</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;callback&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">?&gt;</span><br />
&lt;html&gt;<br />
&lt;body&gt;<br />
&lt;p&gt;It's like comparing apples to oranges&lt;/p&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
<span style="color: #000000; font-weight: bold;">&lt;?php</span><br />
<br />
<a href="http://www.php.net/ob_end_flush"><span style="color: #990000;">ob_end_flush</span></a><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">?&gt;</span></div></div>
<p><span style="color: #ff0000;"><strong>注意：</strong></span>虽然可以在APACHE里设置对任何CSS以及JS文件进行ZIP压缩，但是如果每次对所有的CSS以及JS，HTML文件进行GZIP压缩的确是能加快传输速度，<span style="color: #ff0000;">但是！却会增加服务器的负荷</span>，因为启用gzip压缩不单单要耗费内存，还要耗费CPU资源。最好的办法是先通过gzip工具将JS CSS文件压缩，然后再直接使用<br />
相关阅读</p>
<p><a href="http://developer.yahoo.com/performance/rules.html">http://developer.yahoo.com/performance/rules.html</a> 雅虎的网页提速建议</p>
<p><a href="http://w3er.com/blog/2009/02/self-auto-gzip-for-js-and-css/">http://w3er.com/blog/2009/02/self-auto-gzip-for-js-and-css/</a> 半自动化gzip优化</p>
<p><a href="http://www.ksarea.com/articles/20070626_gzip_compress_css_and_js_documents.html">http://www.ksarea.com/articles/20070626_gzip_compress_css_and_js_documents.html</a> GZIP压缩CSS与JS</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/php_basic/127.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>APC VS Memcached</title>
		<link>http://www.woniu.us/servers/125.html</link>
		<comments>http://www.woniu.us/servers/125.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 07:17:57 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[WEB服务器]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[php缓存]]></category>

		<guid isPermaLink="false">http://snail.comsing.com/servers/125.html</guid>
		<description><![CDATA[其实很多人都觉得APC跟Memcached是两个不相关的东西。在国人的映像中APC只是一个预编译的东西而已，大部分人只看到这样的描述]]></description>
			<content:encoded><![CDATA[<p>其实很多人都觉得APC跟Memcached是两个不相关的东西。在国人的映像中APC只是一个预编译的东西而已，大部分人只看到这样的描述</p>
<p><strong>APC</strong>：它对php opcode进行缓冲，而不是迫使php在每一次执行的时候都重新解释每一个脚本。有了APC之后PHP代码只需要编译一次就行了</p>
<p><strong>Memcached</strong>：将你从数据库查询出来的数据，或者其他代码得到的结果存在内存中，下次要用了可以直接从内存中取出。</p>
<p>而事实上呢</p>
<p><strong>APC</strong>:不但具有opcode缓存功能，还具有上面的memcached的功能——将数据存在内存中，并从内存中取出数据。（注：本人也不清楚是否是存在内存中，官方的说法是Caches a variable in the data store, only if it&#8217;s not already stored）详情查看APC手册<a title="http://docs.php.net/manual/zh/book.apc.php" href="http://docs.php.net/manual/zh/book.apc.php">http://docs.php.net/manual/zh/book.apc.php</a></p>
<p>至于比较准确的APC介绍 <a title="http://162cm.javaeye.com/blog/220197" href="http://162cm.javaeye.com/blog/220197">http://162cm.javaeye.com/blog/220197</a></p>
<p><strong>Memcached</strong>：Memcached并不是单独为了PHP还设计的（而APC则是专门为PHP设计），Memcached最强大的功能是他的分布式内存，就是说安装Memcached的服务器就是服务端，可以有很多这样的服务端分布在不同的服务器上，客户端（比如PHP）可以使用这些服务群上任何一个服务端的内存</p>
<p>关于Memcached的安装与使用请看这里 <a title="http://www.nioxiao.com/php-memcached" href="http://www.nioxiao.com/php-memcached">http://www.nioxiao.com/php-memcached</a></p>
<p>所以如果只使用本地内存的话建议是用APC，如果你有很多服务器的话建议是用Memcached</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/servers/125.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WEB服务器apache lighttpd nginx详解[资料整理]</title>
		<link>http://www.woniu.us/servers/124.html</link>
		<comments>http://www.woniu.us/servers/124.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 05:29:14 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[WEB服务器]]></category>
		<category><![CDATA[优化]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[Lighttpd]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[并发连接数]]></category>

		<guid isPermaLink="false">http://snail.comsing.com/servers/124.html</guid>
		<description><![CDATA[在说WEB服务器之前先说说线程、进程、以及并发连接数

进程与线程

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位]]></description>
			<content:encoded><![CDATA[<p>在说WEB服务器之前先说说线程、进程、以及并发连接数</p>
<p><strong>进程与线程</strong></p>
<p>进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位</p>
<p>从逻辑角度来看，多线程的意义在于一个应用程序中，有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用，来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别</p>
<p>.进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间，一个进程崩溃后，在保护模式下不会对其它进程产生影响，而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量，但线程之间没有单独的地址空间，一个线程死掉就等于整个进程死掉，所以多进程的程序要比多线程的程序健壮，但在进程切换时，耗费资源较大，效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作，只能用线程，不能用进程。</p>
<p><strong>并发连接数</strong></p>
<p>什么是最大并发连接数呢？所谓最大并发连接数是服务器同一时间能处理最大会话数量</p>
<p>何为会话？我们打开一个网站就是一个客户端浏览器与服务端的一个会话。我们浏览网页是基于http协议。</p>
<p>HTTP协议如何工作？</p>
<p>HTTP支持两种建立连接的方式：非持久连接和持久连接(HTTP1.1默认的连接方式为持久连接)。</p>
<p>Web浏览器与Web服务器之间将完成下列7个步骤</p>
<p>1：建立TCP连接</p>
<p>2：Web浏览器向Web服务器发送请求命令</p>
<p>3：Web浏览器发送请求头信息</p>
<p>4：Web服务器应答</p>
<p>5：Web服务器发送应答头信息</p>
<p>6：Web服务器向浏览器发送数据</p>
<p>7：Web服务器关闭TCP连接</p>
<p>一般情况下，一旦Web服务器向浏览器发送了请求数据，它就要关闭TCP连接，但是浏览器一般其头信息加入了这行代码 Connection:keep-alive，TCP连接在发送后将仍然保持打开状态，于是，浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间，还节约了网络带宽</p>
<p>下面来看看连接数的计算</p>
<p>1、下载：用户下载服务器上的文件，则为一个连接，用户文件下载完毕后这个连接就消失了。有时候用户用迅雷的多线程方式下载的话，这一个用户开启了5个线程的话，就算是5个连接<br />
2、用户打开你的页面，就算停留在页面没有对服务器发出任何请求，那么在用户打开一面以后的15分钟内也都要算一个在线<br />
3、上面的情况用户继续打开同一个网站的其他页面，那么在线人数按照用户最后一次点击（发出请求）以后的15分钟计算，在这个15分钟内不管用户怎么点击（包括新窗口打开）都还是一人在线。<br />
4、当用户打开页面然后正常关闭浏览器，用户的在线人数也会马上清除。</p>
<p><strong>WEB服务器提供服务的方式</strong></p>
<p>WEB服务器由于要同时为多个客户提供服务，就必须使用某种方式来支持这种多任务的服务方式。一般情况下可以有以下三种方式来选择，多进程方式、多线程方式及异步方式。其中，多进程方式中服务器对一个客户要使用一个进程来提供服务，由于在操作系统中，生成一个进程需要进程内存复制等额外的开销，这样在客户较多时的性能就会降低。为了克服这种生成进程的额外开销，可以使用多线程方式或异步方式。在多线程方式中，使用进程中的多个线程提供服务，由于线程的开销较小，性能就会提高。事实上，不需要任何额外开销的方式还是异步方式，它使用非阻塞的方式与每个客户通信，服务器使用一个进程进行轮询就行了。</p>
<p>      虽然异步方式最为高效，但它也有自己的缺点。因为异步方式下，多个任务之间的调度是由服务器程序自身来完成的，而且一旦一个地方出现问题则整个服务器就会出现问题。因此，向这种服务器增加功能，一方面要遵从该服务器自身特定的任务调度方式，另一方面要确保代码中没有错误存在，这就限制了服务器的功能，使得异步方式的Web 服务器的效率最高，但功能简单。</p>
<p>由于多线程方式使用线程进行任务调度，这样服务器的开发由于遵从标准，从而变得简单并有利于多人协作。然而多个线程位于同一个进程内，可以访问同样的内存空间，因此存在线程之间的影响，并且申请的内存必须确保申请和释放。对于服务器系统来讲，由于它要数天、数月甚至数年连续不停的运转，一点点错误就会逐渐积累而最终导致影响服务器的正常运转，因此很难编写一个高稳定性的多线程服务器程序。</p>
<p>多进程方式的优势就在于稳定性，因为一个进程退出的时候，操作系统会回收其占用的资源，从而使它不会留下任何垃圾。即便程序中出现错误，由于进程是相互隔离的，那么这个错误不会积累起来，而是随着这个进程的退出而得到清除</p>
<p><strong>Apache(多进程模式prefork+多线程模式worker)</strong></p>
<p>prefork的工作原理</p>
<p>如果不用“——with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM.它所采用的预派生子进程方式也是Apache1.3中采用的模式.prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一.</p>
<p>worker的工作原理</p>
<p>相对于prefork,worker是2.0版中全新的支持多线程和多进程混合模型的MPM.由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器.但是,worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性.这种MPM的工作方式将是Apache2.0的发展趋势.</p>
<p>查看更多apache原理 请看 <a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=40003&amp;PostID=4585547">Apache服务的工作原理</a></p>
<p><strong>Apache(cgi模式与模块模式)</strong></p>
<p>php在apache中两种工作方式的区别(CGI模式、Apache 模块模式)</p>
<p>这两种工作方式的区别：</p>
<p>在CGI模式下，如果客户机请求一个php文件，Web服务器就调用php.exe去解释这个文件，然后再把解释的结果以网页的形式返回给客户机；</p>
<p>而在模块化(DLL)中，PHP是与Web服务器一起启动并运行的。</p>
<p>所以从某种角度上来说，以apache模块方式安装的 PHP4有着比CGI模式更好的安全性以及更好的执行效率和速度。</p>
<p>FastCGI运行模式分析：</p>
<p>FastCGI的工作原理是：</p>
<p>1、Web Server 启动时载入FastCGI进程管理器（IIS ISAPI或Apache Module）;</p>
<p>2、FastCGI进程管理器自身初始化，启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。</p>
<p>3、当客户端请求到达Web Server时，FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi.exe。</p>
<p>4、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时，请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器（运行在 WebServer中）的下一个连接。 在正常的CGI模式中，php-cgi.exe在此便退出了。</p>
<p>在上述情况中，你可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI，所有这些都只在进程启动时发生一次。一个额外的好处是，持续数据库连接(Persistent database connection)可以工作。</p>
<p>使用FastCGI for PHP功能，将mod_fastcgi代替原来的mod_phpsusexec，可以令您的PHP程序从原来的请求-启动-运行到请求-运行模式，从而使程序跑得更快，流畅。</p>
<p>因为mod_fastcgi是使用了持久的连接，所以能实现执行复杂的PHP脚本或通过一个连接就能访问到多个数据库。总之，它比mod_phpsusexec在相同的条件下执行的效果更佳。</p>
<p>好处：</p>
<p>PHP脚本执行的更快。因为PHP解释器将载入到内存，有点击请求时，快速被调用执行，不需再从存储中读取，如此大大提高了脚本的执行效率</p>
<p>可以减轻服务器的负荷。因为服务器不需为每个点击请求而反复装卸PHP解释器，节省了资源。例如减少了超过CPU使用限制的次数</p>
<p>不需修改已有的PHP脚本</p>
<p>但是apache对于fastcgi模式的支持非常差劲</p>
<p>关于fastcgi的更多文章见 fastcgi不完全指南<a href="http://www.phpchina.com/bbs/viewthread.php?tid=108866&amp;highlight=fastcgi%2B">http://www.phpchina.com/bbs/viewthread.php?tid=108866&amp;highlight=fastcgi%2B</a></p>
<p>以及实战fastcgi <a href="http://linux.sheup.com/linux/linux194.htm">http://linux.sheup.com/linux/linux194.htm</a></p>
<p><strong>Lighttpd</strong></p>
<p>Lighttpd是一个具有非常低的内存开销，cpu占用率低，效能好，以及丰富的模块等特点。lighttpd是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能。</p>
<p>Lighttpd使用fastcgi方式运行php,它会使用很少的PHP进程响应很大的并发量。</p>
<p>Fastcgi的优点在于：</p>
<p>从稳定性上看, fastcgi是以独立的进程池运行来cgi,单独一个进程死掉,系统可以很轻易的丢弃,然后重新分配新的进程来运行逻辑.</p>
<p>从安全性上看, fastcgi和宿主的server完全独立, fastcgi怎么down也不会把server搞垮,</p>
<p>从性能上看, fastcgi把动态逻辑的处理从server中分离出来, 大负荷的IO处理还是留给宿主server, 这样宿主server可以一心一意作IO,对于一个普通的动态网页来说, 逻辑处理可能只有一小部分, 大量的图片等静态IO处理完全不需要逻辑程序的参与(注1)</p>
<p>从扩展性上讲, fastcgi是一个中立的技术标准, 完全可以支持任何语言写的处理程序(php,java,python&#8230;)</p>
<p><strong>Nginx</strong></p>
<p>Nginx以事件驱动的方式编写，所以有非常好的性能，同时也是一个非常高效的反向代理、负载平衡。其拥有匹配 Lighttpd的性能，同时还没有Lighttpd的内存泄漏问题，而且Lighttpd的mod_proxy也有一些问题并且很久没有更新。但是Nginx并不支持cgi方式运行，原因是可以减少因此带来的一些程序上的漏洞。所以必须使用FastCGI方式来执行PHP程序。</p>
<p>nginx做为HTTP服务器，有以下几项基本特性：</p>
<p>处理静态文件，索引文件以及自动索引；打开文件描述符缓冲．</p>
<p>无缓存的反向代理加速，简单的负载均衡和容错．</p>
<p>FastCGI，简单的负载均衡和容错．</p>
<p>模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI，则这项处理可以并行运行，而不需要相互等待。</p>
<p>Nginx专为性能优化而开发，性能是其最重要的考量,实现上非常注重效率。它支持内核Poll模型，能经受高负载的考验,有报告表明能支持高达 50,000个并发连接数。</p>
<p><strong>3种WEB服务器的比较：</strong></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="27%" valign="top">server</td>
<td width="19%" valign="top">Apache</td>
<td width="24%" valign="top">Nginx     </td>
<td width="28%" valign="top">Lighttpd</td>
</tr>
<tr>
<td width="27%" valign="top">Proxy代理</td>
<td width="19%" valign="top">非常好</td>
<td width="24%" valign="top">非常好</td>
<td width="28%" valign="top">一般</td>
</tr>
<tr>
<td width="27%" valign="top">Rewriter</td>
<td width="19%" valign="top">好</td>
<td width="24%" valign="top">非常好</td>
<td width="28%" valign="top">一般</td>
</tr>
<tr>
<td width="27%" valign="top">Fcgi</td>
<td width="19%" valign="top">不好</td>
<td width="24%" valign="top">好</td>
<td width="28%" valign="top">非常好</td>
</tr>
<tr>
<td width="27%" valign="top">热部署</td>
<td width="19%" valign="top">不支持</td>
<td width="24%" valign="top">支持</td>
<td width="28%" valign="top">不支持</td>
</tr>
<tr>
<td width="27%" valign="top">系统压力比较</td>
<td width="19%" valign="top">很大</td>
<td width="24%" valign="top">很小</td>
<td width="28%" valign="top">比较小</td>
</tr>
<tr>
<td width="27%" valign="top">稳定性</td>
<td width="19%" valign="top">好</td>
<td width="24%" valign="top">非常好</td>
<td width="28%" valign="top">不好</td>
</tr>
<tr>
<td width="27%" valign="top">安全性</td>
<td width="19%" valign="top">好</td>
<td width="24%" valign="top">一般</td>
<td width="28%" valign="top">一般</td>
</tr>
<tr>
<td width="27%" valign="top">技术支持</td>
<td width="19%" valign="top">非常好</td>
<td width="24%" valign="top">很少</td>
<td width="28%" valign="top">一般</td>
</tr>
<tr>
<td width="27%" valign="top">静态文件处理</td>
<td width="19%" valign="top">一般</td>
<td width="24%" valign="top">非常好</td>
<td width="28%" valign="top">好</td>
</tr>
<tr>
<td width="27%" valign="top">Vhosts虚拟主机</td>
<td width="19%" valign="top">支持</td>
<td width="24%" valign="top">不支持</td>
<td width="28%" valign="top">支持</td>
</tr>
<tr>
<td width="27%" valign="top">反向代理</td>
<td width="19%" valign="top">一般</td>
<td width="24%" valign="top">非常好</td>
<td width="28%" valign="top">一般</td>
</tr>
<tr>
<td width="27%" valign="top">Session sticky</td>
<td width="19%" valign="top">支持</td>
<td width="24%" valign="top">不支持</td>
<td width="28%" valign="top">不支持</td>
</tr>
</tbody>
</table>
<p>相关文章<a href="http://www.blogjava.net/daniel-tu/archive/2008/12/29/248883.html">http://www.blogjava.net/daniel-tu/archive/2008/12/29/248883.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/servers/124.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>简单说说PHP优化</title>
		<link>http://www.woniu.us/php_basic/123.html</link>
		<comments>http://www.woniu.us/php_basic/123.html#comments</comments>
		<pubDate>Thu, 19 Nov 2009 00:54:58 +0000</pubDate>
		<dc:creator>蜗牛</dc:creator>
				<category><![CDATA[PHP基础知识]]></category>
		<category><![CDATA[优化]]></category>

		<guid isPermaLink="false">http://snail.comsing.com/php_basic/123.html</guid>
		<description><![CDATA[我们在编写程序时，总是想要使自己的程序占用资源最小，运行速度更快，代码量更少。往往我们在追求这些的同时却失去了很多东西。下面我想讲讲我对PHP优化的理解。优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码。]]></description>
			<content:encoded><![CDATA[<p>我们在编写程序时，总是想要使自己的程序占用资源最小，运行速度更快，代码量更少。往往我们在追求这些的同时却失去了很多东西。下面我想讲讲我对PHP优化的理解。优化的目的是花最少的代价换来最快的运行速度与最容易维护的代码。</p>
<p><strong>进行大范围的优化，而不是死啃某些程序代码</strong></p>
<p>我这里所说的优化，基本上都是从服务器，Apache,数据库这些方面来进行的优化，而并不是对你的PHP代码加以改进从而提高程序的运行速度，因为比起你将程序中的正则优化为字符串处理函数从而提升程序速度来说，在大范围内进行的优化所需要的代价要比这个小的多，而获得报酬却要丰厚的多。</p>
<p>在非代码处进行优化有以下好处</p>
<p>1：通常情况下能够大大提高效率</p>
<p>2：不会危及到代码的完整性</p>
<p>3：能够快速部署</p>
<p><strong>缓存技术</strong><strong></strong></p>
<p>下面来说说常用的缓存技术，通过这些缓存技术能够大大的提高效率</p>
<p>在说到缓存技术的时候不得不提到memcached ，memcached是高效、快速的分布式内存对象缓存系统，主要用于加速 WEB 动态应用程序。</p>
<p><strong>Memcached</strong><strong>的原理</strong></p>
<p>memcached 是以守护程序方式运行于一个或多个服务器中，等待接收客户端的连接操作，客户端可以由各种语言编写（例如PHP）。PHP 等客户端在与 memcached 服务建立连接之后，接下来的事情就是存取对象了，每个被存取的对象都有一个唯一的标识符 key，存取操作均通过这个 key 进行，保存到 memcached 中的对象实际上是放置内存中的，并不是保存在 cache 文件中的，这也是为什么 memcached 能够如此高效快速的原因</p>
<p>说完memcached，下面来说说常用的缓存方法</p>
<p>1：编译与OPCODE缓存</p>
<p>因为PHP是解释型的语言，所以每个PHP文件在运行的时候都需要编译后再执行，同一个文件，不同的用户访问，或者同一个用户不同时间访问同一个文件，每次都需要重新编译然后运行，这样就耗费了大量时间。</p>
<p>通过编译缓存每个文件在修改之后只编译一次这样就减少了文件IO操作，用户访问后机器指令直接从内存中取出并执行而不是从硬盘中读出。</p>
<p>最常见的PHP编译缓存工具有：APC，Accelerator，xcache</p>
<p>关于编译缓存的更多文章可以看这里：<a href="http://info.52z.com/html/25466.html">http://info.52z.com/html/25466.html</a></p>
<p>2：全局页面缓存&#8211; Squid Cache</p>
<p>Squid Cache（简称为Squid）是一个流行的自由软件（GNU通用公共许可证）的代理服务器和Web缓存服务器，Squid作为网页服务器的前置cache服务器通过缓存相关请求来提高Web服务器的速度</p>
<p>更多介绍请看这里：<a href="http://zh.wikipedia.org/wiki/Squid_cache">http://zh.wikipedia.org/wiki/Squid_cache</a></p>
<p>3：局部缓存之SQL缓存</p>
<p>在大多数应用程序中主要的瓶颈往往可以追溯到数据库的操作中，一般都是因为复杂的数据库查询而耗费了大量时间，而SQL缓存可以大大降低复杂查询造成的负荷。</p>
<p>SQL缓存的例子(使用了memcached扩展)</p>
<p>$key = md5(“some sort of sql query”);</p>
<p>if (!($result = memcache_get($key))) {</p>
<p>$result = $pdo-&gt;query($qry)-&gt;fetchAll();</p>
<p>// 缓存查询结果一小时</p>
<p>memcache_set($key, $result, NULL, 3600);</p>
<p>}</p>
<p>4：局部缓存之代码块缓存</p>
<p>为了优化PHP程序，有时候我们不得不优化一个个代码段来减少那么一点点的执行的时间，但是比起优化复杂的不同的PHP代码段还不如通过缓存来直接忽略这些代码段的优化，这样做的好处是</p>
<p>a：能够很快的看到效果</p>
<p>b：不会破坏以前的代码</p>
<p>c：速度要比优化代码要快得多</p>
<p>代码块缓存的列子(同样使用了memcached扩展)</p>
<p>function complex_function_abc($a, $b, $c) {</p>
<p>$key = __FUNCTION__ . serialize</p>
<p>(func_get_args());</p>
<p>if (!($result = memcache_get($key))) {</p>
<p>$result = //函数代码</p>
<p>// 储存执行结果1小时</p>
<p>memcache_set($key, $result, NULL, 3600);</p>
<p>}</p>
<p>return $result;</p>
<p>}</p>
<p>当然除了上述方法外还可以用到文件缓存（将数据库中的数据取出储存在文件中），还可以生成静态HTML文件等，但是这些方法的缓存还是将文件储存在硬盘上而不是内存中。</p>
<p><strong>输出控制</strong><strong></strong></p>
<p>除了上述缓存技术外还可以通过输出控制来让程序执行的时间更少</p>
<p>下面通过PHP与APACHE来说说输出控制</p>
<p>1：PHP输出控制</p>
<p>这里最主要用到ob_start()以及PHP中的OB系列函数，这些函数可以做什么呢？</p>
<p>第一就是静态模版技术</p>
<p>所谓静态模版技术就是通过某种方式，使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新，那么当另外的用户再次浏览此页面时，程序将不会再调用PHP以及相关的数据库，对于某些信息量比较大的网站，例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。</p>
<p>代码示例：</p>
<p>&lt;?php</p>
<p>ob_start();//打开缓冲区</p>
<p>?&gt;</p>
<p>php页面的全部输出</p>
<p>&lt;?</p>
<p>$content = ob_get_contents();//取得php页面输出的全部内容</p>
<p>$fp = fopen(&#8220;output.html&#8221;, &#8220;w&#8221;); //创建一个文件，并打开，准备写入</p>
<p>fwrite($fp, $content); //把php页面的内容全部写入output.html，然后……</p>
<p>fclose($fp);</p>
<p>?&gt;</p>
<p>当然这个ob系列函数还有其他很多用处我就不在这里一一说明了。</p>
<p>2：apache输出控制</p>
<p>将SendBufferSize设置为页面大小，这样就能将页面一次性放在发送缓冲区从而增加处理速度</p>
<p><a name="sendbuffersize"><strong>SendBufferSize </strong></a><strong>指令</strong><strong></strong></p>
<table border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td valign="top"><strong><a href="http://www.cmsjzw.com/tools/apache2_2/mod/directive-dict.html#Description">说明</a></strong></td>
<td valign="top">TCP发送缓冲区大小(字节)</td>
</tr>
<tr>
<td valign="top"><strong><a href="http://www.cmsjzw.com/tools/apache2_2/mod/directive-dict.html#Syntax">语法</a></strong></td>
<td valign="top">SendBufferSize <em>bytes</em></td>
</tr>
<tr>
<td valign="top"><strong><a href="http://www.cmsjzw.com/tools/apache2_2/mod/directive-dict.html#Default">默认值</a></strong></td>
<td valign="top">SendBufferSize 0</td>
</tr>
<tr>
<td valign="top"><strong><a href="http://www.cmsjzw.com/tools/apache2_2/mod/directive-dict.html#Context">作用域</a></strong></td>
<td valign="top">server config</td>
</tr>
<tr>
<td valign="top"><strong><a href="http://www.cmsjzw.com/tools/apache2_2/mod/directive-dict.html#Status">状态</a></strong></td>
<td valign="top">MPM</td>
</tr>
<tr>
<td valign="top"><strong><a href="http://www.cmsjzw.com/tools/apache2_2/mod/directive-dict.html#Module">模块</a></strong></td>
<td valign="top"><a href="http://www.cmsjzw.com/tools/apache2_2/mod/beos.html">beos</a>, <a href="http://www.cmsjzw.com/tools/apache2_2/mod/mpm_netware.html">mpm_netware</a>, <a href="http://www.cmsjzw.com/tools/apache2_2/mod/mpm_winnt.html">mpm_winnt</a>, <a href="http://www.cmsjzw.com/tools/apache2_2/mod/mpmt_os2.html">mpmt_os2</a>, <a href="http://www.cmsjzw.com/tools/apache2_2/mod/prefork.html">prefork</a>, <a href="http://www.cmsjzw.com/tools/apache2_2/mod/worker.html">worker</a></td>
</tr>
</tbody>
</table>
<p>这个指令设置服务器的TCP发送缓冲区的大小(字节)。提高这个值会导致两个后果：高速度和高潜伏时间(100ms左右)。如果设置为&#8221;0&#8243;，将使用操作系统默认值。</p>
<p>通过源代码方式编译你的Apache/PHP/Database 可让你的程序增加10&#8211;15%的速度</p>
<p><strong>下面再说说在代码优化的时候应该注意的</strong></p>
<p>1：短代码不等于快的代码</p>
<p>很多人在写程序时希望将代码写的越简洁越好，但是越短的代码有时候反而需要更长的执行时间，所以哪怕是用更多的代码也不使用速度慢的代码</p>
<p>2：在写程序的时候更应该注重程序的扩展性，而不是追求速度</p>
<p>3：在优化你的代码之前，先看看跟数据库有关的部分，因为大多数应用程序的瓶颈在数据库而不是代码</p>
<p>4：微优化得不偿失</p>
<p>什么叫做微优化？就像前面所说的将正则表达式部分的代码改用字符串函数代替。这样做有以下缺点</p>
<p>a：花费时间较长</p>
<p>b：不会解决你的性能问题</p>
<p>c：很有可能会破坏以前的代码从而产生未知的错误</p>
<p>d：付出大于回报</p>
<p>这里还不得不提到一个误区，有些人为了让程序更加优化，在分析业务逻辑的时候便将优化考虑在内了，从而为了得到更优的代码而改动业务逻辑。这是十分愚蠢的想法，因为程序的目的便是为了处理现实中遇到的问题，是为这些问题服务的，怎么能本末倒置呢。</p>
<p>关于mysql的优化建议可以看这里<a href="http://coolshell.cn/?p=1846">http://coolshell.cn/?p=1846</a> 这个应该算是微优化</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woniu.us/php_basic/123.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
