<?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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/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>开源软件的盈利模式</title>
		<link>http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.html</link>
		<comments>http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.html#comments</comments>
		<pubDate>Wed, 29 Jun 2011 05:48:56 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[邪人邪语]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[server]]></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=572</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.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 产品就同时推出面向个人和企业的两种版本，即开源版本和专业版本，分别采用不同的授权方式。开源版本完全免费以便更好的推广，而从专业版的许可销售和支持服务获得收入。再如 Redhat 自 Redhat Linux 9.0 后将原桌面操作系统转为 Fedora 项目，借 Fedora Core Linux 在开源社区的声望而促进 Redhat Enterprise Linux AS/ES/WS 服务器产品线的销售。 盈利模式之二：技术服务型 在这种模式中，开放源代码软件采用了一种全新的市场定位，并非面向产品，而是针对技术服务。JBoss就是这种模式的典型代表。JBoss 应用服务器完全免费，而通过提供技术文档、培训、二次开发支持等技术服务而获得收入。 盈利模式之三：应用服务托管（ASP） 这种模式适用于基于开源软件的应用服务供应商（ASP）。 例如，PHP Live！ 就是一种构架于 PHP、MySQL 之上的开源软件，它可为企业用户提供实时交谈服务。目前已经有数十家公开提供 PHP Live！ 托管服务的应用服务提供商。 盈利模式之四：软、硬件一体化 这种模式是针对硬件制造商的。随着竞争的普及，市场压力迫使硬件公司开发并维护软件，但是软件本身却并不是利润中心，因而采用开源软件。 这种模式为大型公司广泛采纳，比如 IBM HP 等服务器供应商巨头，通过捆绑免费的 Linux 操作系统销售硬件服务器。SUN 公司近期将其 Solaris 操作系统开放源码，以确保服务器硬件的销售收入，也是这种模式的体现。 盈利模式之五：附属品 在这种模式中，出售开放源代码的附加产品。比如在低端市场，出售杯子和T恤衫等；在高端市场上，出售专业编辑出版的文档和书籍。O&#8217;Reilly集团是销售开源软件附加产品公司的典型案例，他出版了很多优秀的开放源代码软件的参考资料。O&#8217;Reilly实际上雇用和支持了一些著名的开放源代码黑客（例如Larry Wall和Brain Behlendorf），并以此提高它在市场上的声望。 盈利模式之六：品牌战略、服务致上 在这种模式中，开源公司通过开源软件先天的传播优势，以极低的成本建立和传播品牌。并通过向用户提供产品相关的服务来获得回报。 康比尔公司的 Compiere ERP &#38; [...]]]></description>
			<content:encoded><![CDATA[<div><strong><span style="color: #0000ff;">盈利模式之一：多种产品线</span></strong></div>
<div>在这种模式中，利用开源软件为直接产生收入的专有软件来创造或维持一种市场地位。例如，开放源代码的客户端软件带动了服务器软件的销售，或者借用开源版本带动商业许可版本的产品销售。这种模式应用的比较普遍。如 MySQL 产品就同时推出面向个人和企业的两种版本，即开源版本和专业版本，分别采用不同的授权方式。开源版本完全免费以便更好的推广，而从专业版的许可销售和支持服务获得收入。再如 Redhat 自 Redhat Linux 9.0 后将原桌面操作系统转为 Fedora 项目，借 Fedora Core Linux 在开源社区的声望而促进 Redhat Enterprise Linux AS/ES/WS 服务器产品线的销售。</div>
<div><span style="color: #0000ff;"><strong>盈利模式之二：技术服务型</strong></span></div>
<div>在这种模式中，开放源代码软件采用了一种全新的市场定位，并非面向产品，而是针对技术服务。JBoss就是这种模式的典型代表。JBoss 应用服务器完全免费，而通过提供技术文档、培训、二次开发支持等技术服务而获得收入。</div>
<div><strong><span style="color: #0000ff;">盈利模式之三：应用服务托管（<a href="http://www.5bay.cn/tag/asp" class="st_tag internal_tag" rel="tag" title="标签 ASP 下的日志">ASP</a>）</span></strong></div>
<div>这种模式适用于基于开源软件的应用服务供应商（ASP）。</div>
<div>例如，<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> Live！ 就是一种构架于 <a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a>、MySQL 之上的开源软件，它可为企业用户提供实时交谈服务。目前已经有数十家公开提供 <a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> Live！ 托管服务的应用服务提供商。</div>
<div><span style="color: #0000ff;"><strong>盈利模式之四：软、硬件一体化</strong></span></div>
<div>这种模式是针对硬件制造商的。随着竞争的普及，市场压力迫使硬件公司开发并维护软件，但是软件本身却并不是利润中心，因而采用开源软件。 这种模式为大型公司广泛采纳，比如 IBM HP 等服务器供应商巨头，通过捆绑免费的 Linux 操作系统销售硬件服务器。SUN 公司近期将其 Solaris 操作系统开放源码，以确保服务器硬件的销售收入，也是这种模式的体现。</div>
<div><strong><span style="color: #0000ff;">盈利模式之五：附属品</span></strong></div>
<div>在这种模式中，出售开放源代码的附加产品。比如在低端市场，出售杯子和T恤衫等；在高端市场上，出售专业编辑出版的文档和书籍。O&#8217;Reilly集团是销售开源软件附加产品公司的典型案例，他出版了很多优秀的开放源代码软件的参考资料。O&#8217;Reilly实际上雇用和支持了一些著名的开放源代码黑客（例如Larry Wall和Brain Behlendorf），并以此提高它在市场上的声望。</div>
<div><strong><span style="color: #0000ff;">盈利模式之六：品牌战略、服务致上</span></strong></div>
<div>在这种模式中，开源公司通过开源软件先天的传播优势，以极低的成本建立和传播品牌。并通过向用户提供产品相关的服务来获得回报。 康比尔公司的 Compiere ERP &amp; CRM 软件是这种模式的典型案例。康比尔公司开发了开源的 ERP &amp; CRM <a href="http://www.5bay.cn/tag/%E8%BD%AF%E4%BB%B6" class="st_tag internal_tag" rel="tag" title="标签 软件 下的日志">软件</a>，由于其产品优秀，很快便获得了北美、欧洲和亚洲中小企业用户的认可，Compiere 品牌也因此迅速地传播到了世界各地，在企业管理软件市场已经成为全球知名品牌。</div>
<div><strong><span style="color: #0000ff;">盈利模式之七：市场策略</span></strong></div>
<div>这种模式，是一种快速抢占市场的营销策略，主要是为以后增强版产品的销售打下基础。 这种情形的案例有很多。比如，微软宣称部分的公开 Office 的源代码，就是执行这种策略。另一个案例则是CRM 领域的新星 SugarCRM，这款由速加科技开发的开源版本从2004年上半年公开下载后广为传播，为在9月推出的盒装专业版套件做好口碑上的准备。</div>
<div>开源软件的经营模式多种多样，随着开源软件的发展，会有更多的盈利模式应运而生。事实上，一家公司可能混合采用其中的几种盈利模式，比如康比尔公司不仅采用了第六种品牌策略，同时也采用了第二种提供技术服务的方式。 在开源软件大潮的冲击之下，包括微软在内的商业软件公司，也开始认可开源软件”软件成为服务”的本质。微软支持的金牌合作伙伴已经提供包括 Exchange Server 2003、SharePoint Server 2003 等在内的托管服务，如 ASP-One.com 每月每用户起价1美元的 SharePoint Server 2003 租赁服务和全包价9.95美元每月的Exchange Server 2003 租赁服务。 在欧洲和亚太地区各国政府的压力下，微软被迫开放Windows 和Office 的部分源代码，以改善政府的信任度，赢得庞大的政府采购订单。 开源软件的商业运动正方兴未艾。这是否会对传统的商业模式构成致命一击？开源软件在走向成熟的过程中，企业用户和政府用户由怀疑上升到愿意尝试，并最终形成了信任。开源软件已经成为软件业未来发展的重要趋势。正如 Navica 公司 CEO 本纳德·高登所说，”短短两三年间，任何人在选择任何企业软件之时，都开始考虑一个问题：是否有开源软件可作替代？”</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/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/peeeeee.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/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/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年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/android%e7%ac%94%e8%ae%b0/zaiandroidzhongchuangjianqidongjiemian.html" title="在Android中创建启动界面">在Android中创建启动界面</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年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/eeprn-asp-jpg.html" title="如何删除删不掉的”PRN.asp:.jpg”">如何删除删不掉的”PRN.asp:.jpg”</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/ep.html" title="让IIS只监听指定IP">让IIS只监听指定IP</a> (0)</li><li>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/eeeeeeee.html" title="最令PHP初学者头痛的十四个问题">最令PHP初学者头痛的十四个问题</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/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/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/server" title="server" rel="tag">server</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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" 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/%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%BD%AF%E4%BB%B6" title="软件" rel="tag">软件</a>, <a href="http://www.5bay.cn/category/me" title="邪人邪语" rel="tag">邪人邪语</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/me/kaiyuanruanjiandeyinglimoshi.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何删除删不掉的”PRN.asp:.jpg”</title>
		<link>http://www.5bay.cn/server-building/eeprn-asp-jpg.html</link>
		<comments>http://www.5bay.cn/server-building/eeprn-asp-jpg.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 01:59:36 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[ASP]]></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=525</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/eeprn-asp-jpg.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>一个用户的网站被挂马 很多以prn.开头的文件&#8230;这个文件其实是windows禁止建立的..但是可以在dos建立 所以在dos下用更改属性 结果不让改 然后想恢复权限 不让恢复 ，网站的跟目录被加了几个文件，怎么删也删不掉， prn.gupiao.asp prn.liuhe.asp com1.shouji.asp 或是COM2，COM8等文件主，   第一步：打开工具&#62;文件夹选项&#62;查看&#62;有一项为”隐藏受保护的操作系统文件(推荐)”,去掉其前边的钩,选中”显示所有文件和文件夹” 第二步：建立一个del.bat的文件 把以下代码黏贴进去&#8230; DEL /F /A /Q \\?\%1 RD /S /Q \\?\%1 然后要删那个文件就把那个文件拖进去即可&#8230;. 但是又遇到问题了&#8230;有一个顽固的&#8230;PRN.asp;.jpg 拖进去也删不掉&#8230;. 不过没问题 这个也可以删&#8230;先把这个文件的文件夹里的其他的文件备份&#8230; 然后把文件夹拖过去&#8230;^_^ 删了吧&#8230; 然后把备份的文件 拷回去 ok了 相关博文2010年05月23日 -- Rsync详解 (0)2010年07月28日 -- ASP防注入新方式，希望对大家是有用的 (0)2010年05月23日 -- mysql优化及全文搜索 (0)2011年06月29日 -- Android在线开发工具 App Inventor (0)2011年06月29日 -- 开源软件的盈利模式 (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年07月26日 [...]]]></description>
			<content:encoded><![CDATA[<p>一个用户的网站被挂马 很多以prn.开头的文件&#8230;这个文件其实是windows禁止建立的..但是可以在dos建立</p>
<p>所以在dos下用更改属性 结果不让改</p>
<p>然后想恢复权限 不让恢复 ，网站的跟目录被加了几个文件，怎么删也删不掉，</p>
<p>prn.gupiao.<a href="http://www.5bay.cn/tag/asp" class="st_tag internal_tag" rel="tag" title="标签 ASP 下的日志">asp</a></p>
<p>prn.liuhe.asp</p>
<p>com1.shouji.asp</p>
<p>或是COM2，COM8等文件主，  </p>
<p>第一步：打开工具&gt;文件夹选项&gt;查看&gt;有一项为”隐藏受保护的操作系统文件(推荐)”,去掉其前边的钩,选中”显示所有文件和文件夹”</p>
<p>第二步：建立一个del.bat的文件 把以下代码黏贴进去&#8230;</p>
<p>DEL /F /A /Q \\?\%1</p>
<p>RD /S /Q \\?\%1<br />
然后要删那个文件就把那个文件拖进去即可&#8230;.</p>
<p>但是又遇到问题了&#8230;有一个顽固的&#8230;PRN.asp;.jpg 拖进去也删不掉&#8230;.</p>
<p>不过没问题 这个也可以删&#8230;先把这个文件的文件夹里的其他的文件备份&#8230;</p>
<p>然后把文件夹拖过去&#8230;^_^ 删了吧&#8230;</p>
<p>然后把备份的文件 拷回去 ok了</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月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/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/androidzaixiankaifagongjuappinventor.html" title="Android在线开发工具 App Inventor">Android在线开发工具 App Inventor</a> (0)</li><li>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/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</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/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/eesoneeajaxeehuai.html" title="基于JSON的高级AJAX开发技术">基于JSON的高级AJAX开发技术</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E6%95%B0%E5%80%BC%E5%85%AC%E5%BC%8F%E7%9A%84%E8%A1%A8%E8%B1%A1%E4%B8%8E%E6%9C%AC%E8%B4%A8.html" title="游戏数值公式的表象与本质">游戏数值公式的表象与本质</a> (0)</li><li>2010年07月28日 -- <a href="http://www.5bay.cn/server-building/eeeeee389.html" title="无需输入密码登陆3389">无需输入密码登陆3389</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/asp" title="ASP" rel="tag">ASP</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%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%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" title="操作系统" rel="tag">操作系统</a>, <a href="http://www.5bay.cn/category/server-building" title="服务器构建&amp;安全" rel="tag">服务器构建&amp;安全</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E7%BD%91%E7%AB%99" 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/eeprn-asp-jpg.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>　　在几乎所有的平台上，内存管理都是通过一种请求和释放模式实现的。首先，一个应用程序请求它下面的层(通常指”<a href="http://www.5bay.cn/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" class="st_tag internal_tag" rel="tag" title="标签 操作系统 下的日志">操作系统</a>”)：”我想使用一些内存空间”。如果存在可用的空间，操作系统就会把它提供给该程序并且打上一个标记以便不会再把这部分内存分配给其它程序。</p>
<p>　　当应用程序使用完这部分内存，它应该被返回到OS;这样以来，它就能够被继续分配给其它程序。如果该程序不返回这部分内存，那么OS无法知道是否这块内存不再使用并进而再分配给另一个进程。如果一个内存块没有释放，并且所有者应用程序丢失了它，那么，我们就说此应用程序”存在漏洞”，因为这部分内存无法再为其它程序可用。</p>
<p>　　在一个典型的客户端应用程序中，较小的不太经常的内存泄漏有时能够为OS所”容忍”，因为在这个进程稍后结束时该泄漏内存会被隐式返回到OS。这并没有什么，因为OS知道它把该内存分配给了哪个程序，并且它能够确信当该程序终止时不再需要该内存。</p>
<p>　　而对于长时间运行的服务器守护程序，包括象Apache这样的web服务器和扩展php模块来说，进程往往被设计为相当长时间一直运行。因为OS不能清理内存使用，所以，任何程序的泄漏-无论是多么小-都将导致重复操作并最终耗尽所有的系统资源。</p>
<p>　　现在，我们不妨考虑用户空间内的stristr()<a href="http://www.5bay.cn/tag/%E5%87%BD%E6%95%B0" class="st_tag internal_tag" rel="tag" title="标签 函数 下的日志">函数</a>;为了使用大小写不敏感的搜索来查找一个字符串，它实际上创建了两个串的各自的一个小型副本，然后执行一个更传统型的大小写敏感的搜索来查找相对的偏移量。然而，在定位该字符串的偏移量之后，它不再使用这些小写版本的字符串。如果它不释放这些副本，那么，每一个使用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>　　php_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>mysql优化及全文搜索</title>
		<link>http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html</link>
		<comments>http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:29:20 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[mod]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[path]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[兼容]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[含义]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[属性]]></category>
		<category><![CDATA[引入]]></category>
		<category><![CDATA[成功]]></category>
		<category><![CDATA[搜索]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[数据库]]></category>
		<category><![CDATA[最快]]></category>
		<category><![CDATA[版本]]></category>
		<category><![CDATA[程序]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[表]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[连接]]></category>
		<category><![CDATA[错误]]></category>
		<category><![CDATA[镜像]]></category>
		<category><![CDATA[页面]]></category>

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

		<guid isPermaLink="false">?p=292</guid>
		<description><![CDATA[<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"><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>游戏服务器在设计时，会有许多组播的需求。比如一个 NPC 需要向周围的观察者播出它的状态信息。无出不在的各种聊天频道中需要向频道中的参于者广播聊天消息等。通常，我们会为每个组播的请求维护一张列表，然后再把需要的信息包发送给指定列表上的多个连接。这个过程在很多地方都会遇到，一个设计的不太好的引擎，再这里有可能滋生诸多 bug 。尤其在多服务器的设计时尤其如此。这两天，我试图寻找一种简洁统一的解决方案。前几天的一篇 blog 讨论了一组服务器设置多个外部接入点的设计。就着这个思路我们可以引申一下。当每台连接服务器设置一个不大的上限，比如最多同时处理 8192 个外部连接，那么管理分组倒不会带来太大的负担。我们只需要在逻辑服务器与连接服务器间定义四条协议。把一个连接加入指定分组。让一个连接退出指定分组。向一个分组广播消息。删除一个分组。这里，后两条协议是冗余的。对于第三条协议，如果表示连接号的容量足够大，我们完全可以留一部分号码用于组播。这在 IP 协议中定义 IP 地址的构成时就是用的类似方案。不过我们的设计为了节省带宽，全部用的 2 字节做内部连接号，资源比较紧张，所以就单独设计一条协议了。对于第四条协议，当最后一个连接退出时，分组就自然取消了。增加一个专门的删除协议，纯粹是使用上的方便。在连接服务器上维护一个分组，仅仅需要一个 1K 的数组（8192 bits）。而有组播需求时，只用遍历这个数组。在 32 位系统下，只是一个 256 次的循环而已。因为大部分分组的成员都不会太多。数组中充斥着大量的 0 。扫描一下就非常的快了。连接服务器用一个简单的 freelist + hash 表的技术，就可以高效且动态的管理不限量的分组，无论从 CPU 还是内存的负载来看，都是可以接受的。我们额外需要做的只是一个分组编号分配管理器。为每个进程分配唯一独立的分组号就够了。在我们现在的设计中，为了尽量避免交互通讯。分配新组号采用不需要反馈的形式。每个需要申请组号的进程，都有独立的组号 id 空间。由分组管理器对若干独立的分组号做一次统一映射。换句话说，每个服务器进程都可以直接从 0 号分组用起，然后直接用 1 号，2 号，3 号 …… 类似操作系统管理物理内存一样。独立进程拥有的只是虚拟分组号，由管理器映射到全局唯一分组号上。这样就完美的解决了不同服务器进程间的分组编号冲突问题。 相关博文2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年05月23日 -- mysql优化及全文搜索 (0)2008年10月17日 -- 游戏中的货币 (0)2010年07月26日 -- PHP和Socket简介 (0)2008年10月17日 -- [...]]]></description>
			<content:encoded><![CDATA[<p>游戏服务器在设计时，会有许多组播的需求。比如一个 NPC 需要向周围的观察者播出它的状态信息。无出不在的各种聊天频道中需要向频道中的参于者广播聊天消息等。<br/><br/>通常，我们会为每个组播的请求维护一张列表，然后再把需要的信息包发送给指定列表上的多个连接。这个过程在很多地方都会遇到，一个设计的不太好的引擎，再这里有可能滋生诸多 bug 。尤其在多服务器的设计时尤其如此。<br/><br/>这两天，我试图寻找一种简洁统一的解决方案。<br/><br/>前几天的一篇 blog 讨论了一组服务器设置多个外部接入点的设计。就着这个思路我们可以引申一下。<br/><br/>当每台连接服务器设置一个不大的上限，比如最多同时处理 8192 个外部连接，那么管理分组倒不会带来太大的负担。<br/><br/>我们只需要在逻辑服务器与连接服务器间定义四条协议。<br/><br/>把一个连接加入指定分组。<br/>让一个连接退出指定分组。<br/>向一个分组广播消息。<br/>删除一个分组。<br/>这里，后两条协议是冗余的。<br/><br/>对于第三条协议，如果表示连接号的容量足够大，我们完全可以留一部分号码用于组播。这在 IP 协议中定义 IP 地址的构成时就是用的类似方案。不过我们的设计为了节省带宽，全部用的 2 字节做内部连接号，资源比较紧张，所以就单独设计一条协议了。<br/><br/>对于第四条协议，当最后一个连接退出时，分组就自然取消了。增加一个专门的删除协议，纯粹是使用上的方便。<br/><br/>在连接服务器上维护一个分组，仅仅需要一个 1K 的数组（8192 bits）。而有组播需求时，只用遍历这个数组。在 32 位系统下，只是一个 256 次的循环而已。因为大部分分组的成员都不会太多。数组中充斥着大量的 0 。扫描一下就非常的快了。<br/><br/>连接服务器用一个简单的 freelist + hash 表的技术，就可以高效且动态的管理不限量的分组，无论从 CPU 还是内存的负载来看，都是可以接受的。<br/><br/>我们额外需要做的只是一个分组编号分配管理器。为每个进程分配唯一独立的分组号就够了。在我们现在的设计中，为了尽量避免交互通讯。分配新组号采用不需要反馈的形式。每个需要申请组号的进程，都有独立的组号 id 空间。由分组管理器对若干独立的分组号做一次统一映射。<br/><br/>换句话说，每个服务器进程都可以直接从 0 号分组用起，然后直接用 1 号，2 号，3 号 …… 类似操作系统管理物理内存一样。独立进程拥有的只是虚拟分组号，由管理器映射到全局唯一分组号上。这样就完美的解决了不同服务器进程间的分组编号冲突问题。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</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>2010年07月26日 -- <a href="http://www.5bay.cn/network-programming/phpeecketee.html" title="PHP和Socket简介">PHP和Socket简介</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html" title="数据服务器的设计">数据服务器的设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%B8%B8%E6%88%8F%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%AE%BE%E8%AE%A1.html" title="多进程的游戏服务器设计">多进程的游戏服务器设计</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%BD%91%E7%BB%9C%E6%B8%B8%E6%88%8F%E7%9A%84%E5%AF%B9%E6%97%B6%E4%BB%A5%E5%8F%8A%E5%90%8C%E6%AD%A5%E9%97%AE%E9%A2%98.html" title="网络游戏的对时以及同步问题">网络游戏的对时以及同步问题</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%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/mmo%E7%9A%84%E6%8E%92%E9%98%9F%E7%B3%BB%E7%BB%9F.html" title="MMO 的排队系统">MMO 的排队系统</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/peeeeee.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/phpzhongdememcachehanshukumemcachefunctions.html" title="PHP中的Memcache函数库（Memcache Functions）">PHP中的Memcache函数库（Memcache Functions）</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E7%94%A8%E5%9B%9B%E5%8F%89%E6%A0%91%E7%AE%A1%E7%90%86%E6%95%A3%E5%B8%83%E5%9C%A8%E5%B9%B3%E9%9D%A2%E4%B8%8A%E7%9A%84%E5%AF%B9%E8%B1%A1.html" title="用四叉树管理散布在平面上的对象">用四叉树管理散布在平面上的对象</a> (0)</li></ul>
	标签Tags：<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%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%B1%BB" title="类" rel="tag">类</a>, <a href="http://www.5bay.cn/tag/%E7%B3%BB%E7%BB%9F" title="系统" rel="tag">系统</a>, <a href="http://www.5bay.cn/tag/%E8%A1%A8" title="表" rel="tag">表</a>, <a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%86%B3" title="解决" rel="tag">解决</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/%E8%BF%9E%E6%8E%A5" title="连接" rel="tag">连接</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E6%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/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>游戏的帧率控制</title>
		<link>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</link>
		<comments>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#comments</comments>
		<pubDate>Fri, 17 Oct 2008 16:53:37 +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>
		<category><![CDATA[软件]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">?p=287</guid>
		<description><![CDATA[<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"><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>我曾在不同场合，多次向人表达我对游戏程序设计的一个重要观点：时间控制，对于游戏程序设计至关重要。这是因为，大多数电子游戏，都是一个实时人机互动系统。在非人机互动的软件中，软件及硬件一起是一个封闭系统，时间参数对这个系统是否正确工作是无意义的量。这样的系统，我们尽量应该设计成自动化工作模式，只要有正确的输入，得到正确的输出即可。通常，这样的系统的开发，还应该有自动化测试的流程去驱动它。但实时人机互动软件则不一样，我们得把人看成系统的一部分。人和机器的交互是通过人眼、人耳、键盘、鼠标等完成信息交换的。如果把人脑看成一个线程、计算机看成另一个线程，我们几乎没有能力实现一个资源锁，利用锁的方式保证系统工作永远正常。人脑在全速运转时，适时得不到正确的信息输入，整个系统就可认为出现了故障。可见，在这样的系统中，时间控制显得多么的重要。当我们提到游戏的帧速率，我想把逻辑帧率与渲染帧率分开来处理。在这个问题上，或许许多游戏引擎的开发者并不赞同我的做法。但是，这毕竟是一个可以简化问题复杂度的方法，个人以为值得推广。所谓逻辑帧率，就是游戏引擎每秒处理逻辑事件的频率。在我参与的游戏项目里，通常，我们都将逻辑帧率固定在一个固定值。为了方便直觉的构想，多数情况下，我倾向于方便十进制计算的数值。比如 100 fps 、50 fps 、25 fps 、20 fps 等等。限定了逻辑帧率后，我们可以把人机交互系统中的机器剥离出来，成为一个独立系统，这样在测试和设计时，时间的要素被弱化了。游戏逻辑可以被严格限定在第整数个帧内发生。通常，视频游戏软件的大量时间都消耗在渲染图象中。而逻辑处理在今天的计算机上，可以更容易的保持在一个高帧率，以提高拟真度。注意，这里所谓的逻辑处理，还包括了虚拟世界中的物理状态的模拟，对于简单的游戏，可能仅仅是对象的坐标；复杂的 3d 游戏或许就包括了物理引擎的运算。对于渲染的问题。个人认为人脑处理信息允许在很短时间的内出现一点偏差，系统会自我纠正。那么只要计算机输出的信息的时刻不要差的太远即可。视觉，虽然作为最大信息量的通道，需要保持较高的通讯频率，但我们并不需要无限的高。渲染帧率高于逻辑帧率一般是没有什么意义的。当很多人埋头一味的追求高的渲染帧率时，我们是不是应该停下来仔细想想，怎样可以用最节省的方式让大脑适应你的游戏画面。最终是你的大脑在判断画面是否流畅，而不是渲染帧率那个数值的高低。相信大家都看过很多欺骗眼睛的图片，网络上已经有很多了。许多静止的图片会让人感觉在动。一些运动的图片，实际的动作跟像素级别上的变动不太一样。简单说来，人脑接受和处理图象的速度有限。大脑在处理此刻视网膜上的图象的同时，还会对未来这些图象的变化有一个预期。当图象的运动满足这个预期时，我们会感觉很流畅很舒适；当和预期不符时，或者让我们头晕眼花，或者让我们产生错觉。（btw, 我忘记曾经在哪看过一副瀑布的 gif 动画，这组动画经过特别处理。当瀑布静止时，我们的眼睛会产生水向上倒流的感觉。）所以，无论是 3d 游戏还是 2d 游戏。快速的移动镜头都是不提倡的。不光是游戏，电影中，我们也极少看见导演快速的移动镜头，大多数场景都是固定镜头拍摄的。如果你非要移动镜头（比如让镜头跟随主人公），那么也尽量让移动速度表现的足够匀速。因为我们能达到的帧速率有限，快速移动镜头很难做到线性（无论是 2d 还是 3d 游戏都很难做到），大多数情况下，我们会在设计上放慢镜头的移动。最后，谈一下镜头移动和渲染帧率的控制问题。既然人脑总希望画面符合预期，我们在引擎呈现的时候，最关键的就是在最准确的时刻渲染出准确的一帧。如果我们一味的在系统空闲的时候渲染，往往会出现在很短时间段内，时快时慢，虽然快慢相差不多（可能只有 0.01 秒的差别），但也会影响到人脑的感觉。一个简单的办法就是，把渲染帧率也锁死。比如锁定为和逻辑帧率相同，或为逻辑帧率的一半，1/3 等。在多任务操作系统环境中，这样可以让你的游戏跟别的应用程序良好的协同工作。当游戏尽量的把空闲时刻让出时，它也更容易的在准确的时刻渲染时期待的画面出来。btw, 我们目前的引擎使用了一个简单的渲染帧率控制函数。侦测最近几秒的渲染情况，一旦发现过忙，则主动下调渲染帧率，让渲染可以均匀的进行；当系统比较空闲时，再上调渲染帧速率。实际运用下来，效果不错。 相关博文2008年10月17日 -- 随机数有多随机？ (0)2008年10月17日 -- 游戏数值公式的表象与本质 (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年07月26日 -- 深入探讨PHP中的内存管理问题 (0)2008年10月17日 -- 角色动作控制接口的设计 (0)2010年07月26日 -- Ajax的工作原理 (1)2010年07月26日 -- PHP安全之数据过滤 (0)2010年05月23日 -- mysql优化及全文搜索 (0)2008年10月17日 -- 服务器消息的广播 [...]]]></description>
			<content:encoded><![CDATA[<p>我曾在不同场合，多次向人表达我对游戏程序设计的一个重要观点：时间控制，对于游戏程序设计至关重要。<br/><br/>这是因为，大多数电子游戏，都是一个实时人机互动系统。在非人机互动的软件中，软件及硬件一起是一个封闭系统，时间参数对这个系统是否正确工作是无意义的量。这样的系统，我们尽量应该设计成自动化工作模式，只要有正确的输入，得到正确的输出即可。通常，这样的系统的开发，还应该有自动化测试的流程去驱动它。<br/><br/>但实时人机互动软件则不一样，我们得把人看成系统的一部分。人和机器的交互是通过人眼、人耳、键盘、鼠标等完成信息交换的。如果把人脑看成一个线程、计算机看成另一个线程，我们几乎没有能力实现一个资源锁，利用锁的方式保证系统工作永远正常。人脑在全速运转时，适时得不到正确的信息输入，整个系统就可认为出现了故障。<br/><br/>可见，在这样的系统中，时间控制显得多么的重要。<span id="more-287"></span><br/><br/>当我们提到游戏的帧速率，我想把逻辑帧率与渲染帧率分开来处理。在这个问题上，或许许多游戏引擎的开发者并不赞同我的做法。但是，这毕竟是一个可以简化问题复杂度的方法，个人以为值得推广。<br/><br/>所谓逻辑帧率，就是游戏引擎每秒处理逻辑事件的频率。在我参与的游戏项目里，通常，我们都将逻辑帧率固定在一个固定值。为了方便直觉的构想，多数情况下，我倾向于方便十进制计算的数值。比如 100 fps 、50 fps 、25 fps 、20 fps 等等。<br/><br/>限定了逻辑帧率后，我们可以把人机交互系统中的机器剥离出来，成为一个独立系统，这样在测试和设计时，时间的要素被弱化了。游戏逻辑可以被严格限定在第整数个帧内发生。<br/><br/>通常，视频游戏软件的大量时间都消耗在渲染图象中。而逻辑处理在今天的计算机上，可以更容易的保持在一个高帧率，以提高拟真度。注意，这里所谓的逻辑处理，还包括了虚拟世界中的物理状态的模拟，对于简单的游戏，可能仅仅是对象的坐标；复杂的 3d 游戏或许就包括了物理引擎的运算。<br/><br/>对于渲染的问题。个人认为人脑处理信息允许在很短时间的内出现一点偏差，系统会自我纠正。那么只要计算机输出的信息的时刻不要差的太远即可。视觉，虽然作为最大信息量的通道，需要保持较高的通讯频率，但我们并不需要无限的高。渲染帧率高于逻辑帧率一般是没有什么意义的。<br/><br/>当很多人埋头一味的追求高的渲染帧率时，我们是不是应该停下来仔细想想，怎样可以用最节省的方式让大脑适应你的游戏画面。最终是你的大脑在判断画面是否流畅，而不是渲染帧率那个数值的高低。<br/><br/>相信大家都看过很多欺骗眼睛的图片，网络上已经有很多了。许多静止的图片会让人感觉在动。一些运动的图片，实际的动作跟像素级别上的变动不太一样。<br/><br/>简单说来，人脑接受和处理图象的速度有限。大脑在处理此刻视网膜上的图象的同时，还会对未来这些图象的变化有一个预期。当图象的运动满足这个预期时，我们会感觉很流畅很舒适；当和预期不符时，或者让我们头晕眼花，或者让我们产生错觉。（btw, 我忘记曾经在哪看过一副瀑布的 gif 动画，这组动画经过特别处理。当瀑布静止时，我们的眼睛会产生水向上倒流的感觉。）<br/><br/>所以，无论是 3d 游戏还是 2d <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" class="st_tag internal_tag" rel="tag" title="标签 游戏 下的日志">游戏</a>。快速的移动镜头都是不提倡的。不光是游戏，电影中，我们也极少看见导演快速的移动镜头，大多数场景都是固定镜头拍摄的。<br/><br/>如果你非要移动镜头（比如让镜头跟随主人公），那么也尽量让移动速度表现的足够匀速。因为我们能达到的帧速率有限，快速移动镜头很难做到线性（无论是 2d 还是 3d 游戏都很难做到），大多数情况下，我们会在设计上放慢镜头的移动。<br/><br/>最后，谈一下镜头移动和渲染帧率的控制问题。<br/><br/>既然人脑总希望画面符合预期，我们在引擎呈现的时候，最关键的就是在最准确的时刻渲染出准确的一帧。如果我们一味的在系统空闲的时候渲染，往往会出现在很短时间段内，时快时慢，虽然快慢相差不多（可能只有 0.01 秒的差别），但也会影响到人脑的感觉。<br/><br/>一个简单的办法就是，把渲染帧率也锁死。比如锁定为和逻辑帧率相同，或为逻辑帧率的一半，1/3 等。在多任务操作系统环境中，这样可以让你的游戏跟别的应用程序良好的协同工作。当游戏尽量的把空闲时刻让出时，它也更容易的在准确的时刻渲染时期待的画面出来。<br/><br/>btw, 我们目前的引擎使用了一个简单的渲染帧率控制函数。侦测最近几秒的渲染情况，一旦发现过忙，则主动下调渲染帧率，让渲染可以均匀的进行；当系统比较空闲时，再上调渲染帧速率。实际运用下来，效果不错。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><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%E6%95%B0%E5%80%BC%E5%85%AC%E5%BC%8F%E7%9A%84%E8%A1%A8%E8%B1%A1%E4%B8%8E%E6%9C%AC%E8%B4%A8.html" title="游戏数值公式的表象与本质">游戏数值公式的表象与本质</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/game-development/zishenshejishitonyventricejiexishoujiyouxikaifadesigecengci.html" title="资深设计师Tony Ventrice解析手机游戏开发的四个层次">资深设计师Tony Ventrice解析手机游戏开发的四个层次</a> (0)</li><li>2010年07月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/%E8%A7%92%E8%89%B2%E5%8A%A8%E4%BD%9C%E6%8E%A7%E5%88%B6%E6%8E%A5%E5%8F%A3%E7%9A%84%E8%AE%BE%E8%AE%A1.html" title="角色动作控制接口的设计">角色动作控制接口的设计</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年05月23日 -- <a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%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/%E6%B8%B8%E6%88%8F%EF%BC%8C%E4%B8%80%E7%A7%8D%E5%A5%87%E6%80%AA%E7%9A%84%E8%BD%AF%E4%BB%B6.html" title="游戏，一种奇怪的软件">游戏，一种奇怪的软件</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E4%B8%8D%E9%82%A3%E4%B9%88%E9%9A%8F%E6%9C%BA%E7%9A%84%E9%9A%8F%E6%9C%BA%E6%95%B0%E5%88%97.html" title="不那么随机的随机数列">不那么随机的随机数列</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E6%95%B0%E5%80%BC%E8%B0%83%E6%95%B4%7E.html" title="游戏数值调整~">游戏数值调整~</a> (0)</li><li>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/%E4%BA%BA" 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%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/%E5%AF%B9%E8%B1%A1" 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%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" title="操作系统" rel="tag">操作系统</a>, <a href="http://www.5bay.cn/tag/%E6%95%85%E9%9A%9C" title="故障" rel="tag">故障</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E6%B8%B8%E6%88%8F" title="游戏" rel="tag">游戏</a>, <a href="http://www.5bay.cn/category/game-development" title="游戏开发" rel="tag">游戏开发</a>, <a href="http://www.5bay.cn/tag/%E7%94%B5%E5%BD%B1" 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/tag/%E8%A1%A8" title="表" rel="tag">表</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a>, <a href="http://www.5bay.cn/tag/%E8%BD%AF%E4%BB%B6" 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/%E6%B8%B8%E6%88%8F%E7%9A%84%E5%B8%A7%E7%8E%87%E6%8E%A7%E5%88%B6.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用户IP、浏览器、操作系统</title>
		<link>http://www.5bay.cn/network-programming/php/%E7%94%A8%E6%88%B7ip%E3%80%81%E6%B5%8F%E8%A7%88%E5%99%A8%E3%80%81%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html</link>
		<comments>http://www.5bay.cn/network-programming/php/%E7%94%A8%E6%88%B7ip%E3%80%81%E6%B5%8F%E8%A7%88%E5%99%A8%E3%80%81%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html#comments</comments>
		<pubDate>Wed, 27 Dec 2006 22:38:26 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[操作系统]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[用户ip]]></category>
		<category><![CDATA[获取]]></category>

		<guid isPermaLink="false">?p=166</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/php/%E7%94%A8%E6%88%B7ip%E3%80%81%E6%B5%8F%E8%A7%88%E5%99%A8%E3%80%81%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>&#60;?php$os=$_SERVER[&#34;HTTP_USER_AGENT&#34;]; // 浏览者操作系统及浏览器//分析浏览器if(strpos($os,&#34;NetCaptor&#34;)) $explorer=&#34;NetCaptor&#34;;elseif(strpos($os,&#34;Opera&#34;)) $explorer=&#34;Opera&#34;;elseif(strpos($os,&#34;Firefox&#34;)) $explorer=&#34;Firefox&#34;;elseif(strpos($os,&#34;MSIE 6&#34;)) $explorer=&#34;MSIE 6.x&#34;;elseif(strpos($os,&#34;MSIE 5&#34;)) $explorer=&#34;MSIE 5.x&#34;;elseif(strpos($os,&#34;MSIE 4&#34;)) $explorer=&#34;MSIE 4.x&#34;;elseif(strpos($os,&#34;Netscape&#34;)) $explorer=&#34;Netscape&#34;;else $explorer=&#34;Other&#34;;// 分析操作系统if(strpos($os,&#34;Windows NT 5.0&#34;)) $os=&#34;Windows 2000&#34;;elseif(strpos($os,&#34;Windows NT 5.1&#34;)) $os=&#34;Windows XP&#34;;elseif(strpos($os,&#34;Windows NT 5.2&#34;)) $os=&#34;Windows 2003&#34;;elseif(strpos($os,&#34;Windows NT&#34;)) $os=&#34;Windows NT&#34;;elseif(strpos($os,&#34;Windows 9&#34;)) $os=&#34;Windows 98&#34;;elseif(strpos($os,&#34;unix&#34;)) $os=&#34;Unix&#34;;elseif(strpos($os,&#34;linux&#34;)) $os=&#34;Linux&#34;;elseif(strpos($os,&#34;SunOS&#34;)) $os=&#34;SunOS&#34;;elseif(strpos($os,&#34;BSD&#34;)) $os=&#34;FreeBSD&#34;;elseif(strpos($os,&#34;Mac&#34;)) $os=&#34;Mac&#34;;else $os=&#34;Other&#34;;//ipunset($ip);if($_SERVER[&#039;HTTP_CLIENT_IP&#039;]){$ip=$_SERVER[&#039;HTTP_CLIENT_IP&#039;];} else if($_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;]){$ip=$_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;];} else{$ip=$_SERVER[&#039;REMOTE_ADDR&#039;];}//显示浏览者信息echo &#34;IP地址：&#34;.$ip.&#34;&#60;br&#62;&#34;;echo &#34;操作系统：&#34;.$os.&#34;&#60;br&#62;&#34;;echo &#34;浏览器：&#34;.$explorer.&#34;&#60;br&#62;&#34;;?&#62; 相关博文2010年07月26日 -- PHP和Socket简介 (0)2011年06月29日 -- 开源软件的盈利模式 (0)2010年07月26日 [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;?<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a><br/>$os=$_<a href="http://www.5bay.cn/tag/server" class="st_tag internal_tag" rel="tag" title="标签 server 下的日志">SERVER</a>[&quot;HTTP_USER_AGENT&quot;]; // 浏览者操作系统及浏览器<br/><br/>//分析浏览器<br/>if(strpos($os,&quot;NetCaptor&quot;)) $explorer=&quot;NetCaptor&quot;;<br/>elseif(strpos($os,&quot;Opera&quot;)) $explorer=&quot;Opera&quot;;<br/>elseif(strpos($os,&quot;Firefox&quot;)) $explorer=&quot;Firefox&quot;;<br/>elseif(strpos($os,&quot;MSIE 6&quot;)) $explorer=&quot;MSIE 6.x&quot;;<br/>elseif(strpos($os,&quot;MSIE 5&quot;)) $explorer=&quot;MSIE 5.x&quot;;<br/>elseif(strpos($os,&quot;MSIE 4&quot;)) $explorer=&quot;MSIE 4.x&quot;;<br/>elseif(strpos($os,&quot;Netscape&quot;)) $explorer=&quot;Netscape&quot;;<br/>else $explorer=&quot;Other&quot;;<br/><br/><br/>// 分析操作系统<br/>if(strpos($os,&quot;Windows NT 5.0&quot;)) $os=&quot;Windows 2000&quot;;<br/>elseif(strpos($os,&quot;Windows NT 5.1&quot;)) $os=&quot;Windows XP&quot;;<br/>elseif(strpos($os,&quot;Windows NT 5.2&quot;)) $os=&quot;Windows 2003&quot;;<br/>elseif(strpos($os,&quot;Windows NT&quot;)) $os=&quot;Windows NT&quot;;<br/>elseif(strpos($os,&quot;Windows 9&quot;)) $os=&quot;Windows 98&quot;;<br/>elseif(strpos($os,&quot;unix&quot;)) $os=&quot;Unix&quot;;<br/>elseif(strpos($os,&quot;linux&quot;)) $os=&quot;Linux&quot;;<br/>elseif(strpos($os,&quot;SunOS&quot;)) $os=&quot;SunOS&quot;;<br/>elseif(strpos($os,&quot;BSD&quot;)) $os=&quot;FreeBSD&quot;;<br/>elseif(strpos($os,&quot;Mac&quot;)) $os=&quot;Mac&quot;;<br/>else $os=&quot;Other&quot;;<br/><br/>//ip<br/>unset($ip);<br/>if($_SERVER[&#039;HTTP_CLIENT_IP&#039;]){<br/>$ip=$_SERVER[&#039;HTTP_CLIENT_IP&#039;];<br/>} else if($_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;]){<br/>$ip=$_SERVER[&#039;HTTP_X_FORWARDED_FOR&#039;];<br/>} else{<br/>$ip=$_SERVER[&#039;REMOTE_ADDR&#039;];<br/>}<br/><br/>//显示浏览者信息<br/>echo &quot;IP地址：&quot;.$ip.&quot;&lt;br&gt;&quot;;<br/>echo &quot;<a href="http://www.5bay.cn/tag/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" class="st_tag internal_tag" rel="tag" title="标签 操作系统 下的日志">操作系统</a>：&quot;.$os.&quot;&lt;br&gt;&quot;;<br/>echo &quot;<a href="http://www.5bay.cn/tag/%E6%B5%8F%E8%A7%88%E5%99%A8" class="st_tag internal_tag" rel="tag" title="标签 浏览器 下的日志">浏览器</a>：&quot;.$explorer.&quot;&lt;br&gt;&quot;;<br/>?&gt;</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>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/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/phpeeeeeeeehuai.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/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年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>2006年12月27日 -- <a href="http://www.5bay.cn/network-programming/php/php%E8%8E%B7%E5%8F%96%E6%9F%90%E4%B8%AA%E7%9B%AE%E5%BD%95%E5%A4%A7%E5%B0%8F.html" title="php获取某个目录大小">php获取某个目录大小</a> (0)</li><li>2006年10月27日 -- <a href="http://www.5bay.cn/network-programming/php/%E7%94%A8php%E6%8E%A7%E5%88%B6%E6%82%A8%E7%9A%84%E6%B5%8F%E8%A7%88%E5%99%A8cache.html" title="用PHP控制您的浏览器cache">用PHP控制您的浏览器cache</a> (0)</li><li>2011年06月29日 -- <a href="http://www.5bay.cn/android%e7%ac%94%e8%ae%b0/androidzaixiankaifagongjuappinventor.html" title="Android在线开发工具 App Inventor">Android在线开发工具 App Inventor</a> (0)</li><li>2010年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/eeprn-asp-jpg.html" title="如何删除删不掉的”PRN.asp:.jpg”">如何删除删不掉的”PRN.asp:.jpg”</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/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/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F" 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%94%A8%E6%88%B7ip" title="用户ip" rel="tag">用户ip</a>, <a href="http://www.5bay.cn/tag/%E8%8E%B7%E5%8F%96" title="获取" rel="tag">获取</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/php/%E7%94%A8%E6%88%B7ip%E3%80%81%E6%B5%8F%E8%A7%88%E5%99%A8%E3%80%81%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

