<?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/"
	>

<channel>
	<title>PHP中文网</title>
	<atom:link href="http://www.phpzh.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.phpzh.com</link>
	<description>PHP中文网，因为专业所以权威！</description>
	<pubDate>Sat, 20 Feb 2010 03:29:30 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ActionScript3.0是革命性的</title>
		<link>http://www.phpzh.com/archives/304</link>
		<comments>http://www.phpzh.com/archives/304#comments</comments>
		<pubDate>Sat, 20 Feb 2010 03:29:30 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[ActionScript3.0]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=304</guid>
		<description><![CDATA[一、全新的“显示对象”架构
　　FlashPlayer9中加入了一套新的AS虚拟机器（AVM2），它提供了一套新的显示API，相对于之前的版本执行和渲染效率提高了不少。在AS3以前FLASH中的可编程的显示对象只有MovieClip和TextField，架构很简洁，他们都是直接从Object类继承的。在AS2的面向对象体系引入以后，一个MC类的属性和方法加起来近百个，目的就是为了让AS对MC的控制能够“随叫随到”，但是以牺牲效率为代价的。例如我们动态复制了几个MC到特定的坐标，而没有任何交互需求，但这些新的MC实例却依然具有了很多我们并不需要的属性和方法，因此很多编程人员都会抱怨MC是一个笨重的类。
　　
　　FP9中新的显示架构彻底颠覆了“MovieClip是灵魂”的设计（AS2那套东西已不再沿用了），这个重大的更新主要体现在对显示对象的抽象更细致、清晰了。简单说来从概念上划分为了显示对象、容器对象、可交互对象，在这个基础上提供了更便捷地遍历显示列表的方法，添加、删除可视元素的方法、自动化地深度管理等。
　　
　　从功能上详细提供了15个可视对象类，这就让我们能够根据实际需要选择合适的对象来实例化，而避免无用消耗。对这些显示对象的具体特性可查阅帮助文档，这是AS3显示编程的灵魂。

　　
　　二、清晰的事件机制
　　从AS2中就引入了事件侦听模型，但由于AS1和AS2编程的随意性以及AS开发人员更多的是设计转行的，很多人还是习惯使用_mc.onRelese = function(){}，甚至是on(release){}，这些不同实现的优劣这里就不再重复讨论了，很多文档都有详细地对比说明。正是因为事件侦听模型的巨大优势，所以在AS3中有且只有只一种事件模型，它是支持了W3C DOM3事件规范的标准，对于它提供的各种广播事件也需要熟记于心。
　　在新的事件模型中，this对象能够自动找到它的原始对象实例，而不用再使用Delegate这种和怪异地方式来指定事件处理函数的上下文引用了。
　　更多细节需要参阅文档，熟悉这个新的事件模型是很有必要的，对于交互编程而言，这个是重点之一。
　　AS2是不支持事件流的，现在你不用再为此头疼了，因为支持事件流是AS3的事件机制的又一重大更新，对于事件流的捕获、目标、冒泡这三个过程你需要很清楚，每当你初始化一个交互元素时，你就需要在脑海中迅速地按顺序触发这些过程，这是交互编程的重点之二。
　　三、更为便捷的库元件绑定和文档类绑定
　　在AS2中我们如果需要重新初始化一个目标MC的实例，通常会采用duplicateMovieClip或者attachMovie来实现，但这两个实现都存在弊端和不便，局限性比较大。AS3提供了一种更便捷的方式来实例化一个目标元素的实例。在AS2的组件开发中我们通常都会使用库元件的类绑定，但在UI和程序协同、构造函数传参方面还是不太方便。而AS3中我们完全可以用AS自由控制库元素实例化到舞台上，例如：

//在库中将目标MC的导出类设置为FileUpLoad
//如果只是想显示库中元素，那么你没有必要额外建立FileUpload文件，编译器会帮你自动搞定
//在AS中实例化一个图片上传UI
var picUpload_mc = new FileUpload();
//添加到舞台上显示
stage.addChild(picUpload_mc);

　　对于库绑定的细节需要详细了解，其中还涉及到一些实际问题的实现方式，例如如何在类中访问绑定库元件中的元素等。但我个人认为利用AS3提供的这一新功能，能够更好得设计程序的架构，更符合MVC的开发原则，具体实现还需要在以后的研究中来探索，也希望和大家一起交流。
　　如果你接触过Flex开发，那么文档类的绑定就很熟悉了，这是FLASH开发环境所不提供的，但在FLASH CS3中提供了这一功能，目的还是规范开发。
　　四、丰富的功能包支持
　　就FLASH CS3开发而言，Adobe沿用了Flash之前版本的一些类库，主要都在fl.*包中，在这个基础上有更新了一些顶级包，同时又提供了一些新的包，主要都在adobe.utils中。除此以外，你还可以使用Flex作为开发平台，Flex提供了更为丰富的功能包和组件。
　　五、语法特性
　　AS3语法特性上也有一些变化变化，目前我针对下面几个做过测试：
　　1、在Number类型的基础上，新增了int和uint类型。
　　2、类型检测方面增加了is和as两个运算符，AS3提供了运行时的类型检测，在这之前只是提供编译检测。
　　3、各种数据类型的值在undefined时，现在都会给一个特定的默认值（编程中需要格外小心）。　
　　4、对于函数的执行，需要严格匹配参数个数，并提供了一种&#8230;(rest) 形式的参数来支持任意多参数的调用。
　　5、面向对象体系更细致了，增加了包的概念，增加了inernal和final的两个修饰符，对于类中public、private、proteced的访问权限也都有变化，对于重写超类的方法需要利用override关键字做申明。　　
　　六、其他特性
　　上面的五点是我目前接触到的，同时也是个人认为最重要、最有进步的变革，除此之外还有一些重要的变化特性，例如在二进制、socket通信、E4X、正则表达式、文本显示、全屏模式等方面也都有一定的改进，有待于在实际操作中来熟悉。
]]></description>
			<content:encoded><![CDATA[<p>一、全新的“显示对象”架构<br />
　　FlashPlayer9中加入了一套新的AS虚拟机器（AVM2），它提供了一套新的显示API，相对于之前的版本执行和渲染效率提高了不少。在AS3以前FLASH中的可编程的显示对象只有MovieClip和TextField，架构很简洁，他们都是直接从Object类继承的。在AS2的面向对象体系引入以后，一个MC类的属性和方法加起来近百个，目的就是为了让AS对MC的控制能够“随叫随到”，但是以牺牲效率为代价的。例如我们动态复制了几个MC到特定的坐标，而没有任何交互需求，但这些新的MC实例却依然具有了很多我们并不需要的属性和方法，因此很多编程人员都会抱怨MC是一个笨重的类。<span id="more-304"></span><br />
　　<br />
　　FP9中新的显示架构彻底颠覆了“MovieClip是灵魂”的设计（AS2那套东西已不再沿用了），这个重大的更新主要体现在对显示对象的抽象更细致、清晰了。简单说来从概念上划分为了显示对象、容器对象、可交互对象，在这个基础上提供了更便捷地遍历显示列表的方法，添加、删除可视元素的方法、自动化地深度管理等。<br />
　　<img src="http://www.phpzh.com/wp-content/uploads/2010/02/6799_stage.jpg" alt="FP9的显示层次结构" /></p>
<p>　　从功能上详细提供了15个可视对象类，这就让我们能够根据实际需要选择合适的对象来实例化，而避免无用消耗。对这些显示对象的具体特性可查阅帮助文档，这是AS3显示编程的灵魂。<br />
<img src="http://www.phpzh.com/wp-content/uploads/2010/02/8f3e_displayobject.jpg" alt="AS3中的核心可视类" width="600" /><br />
　　<br />
　　二、清晰的事件机制<br />
　　从AS2中就引入了事件侦听模型，但由于AS1和AS2编程的随意性以及AS开发人员更多的是设计转行的，很多人还是习惯使用_mc.onRelese = function(){}，甚至是on(release){}，这些不同实现的优劣这里就不再重复讨论了，很多文档都有详细地对比说明。正是因为事件侦听模型的巨大优势，所以在AS3中有且只有只一种事件模型，它是支持了W3C DOM3事件规范的标准，对于它提供的各种广播事件也需要熟记于心。<br />
　　在新的事件模型中，this对象能够自动找到它的原始对象实例，而不用再使用Delegate这种和怪异地方式来指定事件处理函数的上下文引用了。<br />
　　更多细节需要参阅文档，熟悉这个新的事件模型是很有必要的，对于交互编程而言，这个是重点之一。</p>
<p>　　AS2是不支持事件流的，现在你不用再为此头疼了，因为支持事件流是AS3的事件机制的又一重大更新，对于事件流的捕获、目标、冒泡这三个过程你需要很清楚，每当你初始化一个交互元素时，你就需要在脑海中迅速地按顺序触发这些过程，这是交互编程的重点之二。</p>
<p>　　三、更为便捷的库元件绑定和文档类绑定<br />
　　在AS2中我们如果需要重新初始化一个目标MC的实例，通常会采用duplicateMovieClip或者attachMovie来实现，但这两个实现都存在弊端和不便，局限性比较大。AS3提供了一种更便捷的方式来实例化一个目标元素的实例。在AS2的组件开发中我们通常都会使用库元件的类绑定，但在UI和程序协同、构造函数传参方面还是不太方便。而AS3中我们完全可以用AS自由控制库元素实例化到舞台上，例如：</p>
<div class="hl-surround">
<div class="hl-main">//在库中将目标MC的导出类设置为FileUpLoad<span style="color: gray;"><br />
</span>//如果只是想显示库中元素，那么你没有必要额外建立FileUpload文件，编译器会帮你自动搞定<span style="color: gray;"><br />
</span>//在AS中实例化一个图片上传UI<span style="color: gray;"><br />
</span>var picUpload_mc = new FileUpload();<br />
//添加到舞台上显示<span style="color: gray;"><br />
</span>stage.addChild(picUpload_mc);</div>
</div>
<p>　　对于库绑定的细节需要详细了解，其中还涉及到一些实际问题的实现方式，例如如何在类中访问绑定库元件中的元素等。但我个人认为利用AS3提供的这一新功能，能够更好得设计程序的架构，更符合MVC的开发原则，具体实现还需要在以后的研究中来探索，也希望和大家一起交流。</p>
<p>　　如果你接触过Flex开发，那么文档类的绑定就很熟悉了，这是FLASH开发环境所不提供的，但在FLASH CS3中提供了这一功能，目的还是规范开发。</p>
<p>　　四、丰富的功能包支持<br />
　　就FLASH CS3开发而言，Adobe沿用了Flash之前版本的一些类库，主要都在fl.*包中，在这个基础上有更新了一些顶级包，同时又提供了一些新的包，主要都在adobe.utils中。除此以外，你还可以使用Flex作为开发平台，Flex提供了更为丰富的功能包和组件。</p>
<p>　　五、语法特性<br />
　　AS3语法特性上也有一些变化变化，目前我针对下面几个做过测试：<br />
　　1、在Number类型的基础上，新增了int和uint类型。<br />
　　2、类型检测方面增加了is和as两个运算符，AS3提供了运行时的类型检测，在这之前只是提供编译检测。<br />
　　3、各种数据类型的值在undefined时，现在都会给一个特定的默认值（编程中需要格外小心）。　<br />
　　4、对于函数的执行，需要严格匹配参数个数，并提供了一种&#8230;(rest) 形式的参数来支持任意多参数的调用。<br />
　　5、面向对象体系更细致了，增加了包的概念，增加了inernal和final的两个修饰符，对于类中public、private、proteced的访问权限也都有变化，对于重写超类的方法需要利用override关键字做申明。　　</p>
<p>　　六、其他特性<br />
　　上面的五点是我目前接触到的，同时也是个人认为最重要、最有进步的变革，除此之外还有一些重要的变化特性，例如在二进制、socket通信、E4X、正则表达式、文本显示、全屏模式等方面也都有一定的改进，有待于在实际操作中来熟悉。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/304/feed</wfw:commentRss>
		</item>
		<item>
		<title>mysql having介绍</title>
		<link>http://www.phpzh.com/archives/303</link>
		<comments>http://www.phpzh.com/archives/303#comments</comments>
		<pubDate>Sat, 20 Feb 2010 01:15:06 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=303</guid>
		<description><![CDATA[介绍GROUP BY 和 HAVING 子句前，我们必需先讲讲sql语言中一种特殊的函数：聚合函数，
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。
SELECT SUM(population) FROM bbc
这里的SUM作用在所有返回记录的population字段上，结果就是该查询只返回一个结果，即所有
国家的总人口数。

通过使用GROUP BY 子句，可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。
当你指定 GROUP BY region 时， 属于同一个region（地区）的一组数据将只能返回一行值．
也就是说，表中所有除region（地区）外的字段，只能通过 SUM, COUNT等聚合函数运算后返回一个值．
HAVING子句可以让我们筛选成组后的各组数据．
WHERE子句在聚合前先筛选记录．也就是说作用在GROUP BY 子句和HAVING子句前．
而 HAVING子句在聚合后对组记录进行筛选。
让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句，还采用第三节介绍的bbc表。
SQL实例：
一、显示每个地区的总人口数和总面积．
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
先以region把返回记录分成多个组，这就是GROUP BY的字面含义。分完组后，然后用聚合函数对每组中
的不同字段（一或多条记录）作运算。
二、 显示每个地区的总人口数和总面积．仅显示那些面积超过1000000的地区。
SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)&#62;1000000
在这里，我们不能用where来筛选超过1000000的地区，因为表中不存在这样一条记录。
相反，HAVING子句可以让我们筛选成组后的各组数据
]]></description>
			<content:encoded><![CDATA[<p>介绍GROUP BY 和 HAVING 子句前，我们必需先讲讲sql语言中一种特殊的函数：聚合函数，<br />
例如SUM, COUNT, MAX, AVG等。这些函数和其它函数的根本区别就是它们一般作用在多条记录上。</p>
<p>SELECT SUM(population) FROM bbc</p>
<p>这里的SUM作用在所有返回记录的population字段上，结果就是该查询只返回一个结果，即所有<br />
国家的总人口数。<br />
<span id="more-303"></span></p>
<p>通过使用GROUP BY 子句，可以让SUM 和 COUNT 这些函数对属于一组的数据起作用。<br />
当你指定 GROUP BY region 时， 属于同一个region（地区）的一组数据将只能返回一行值．<br />
也就是说，表中所有除region（地区）外的字段，只能通过 SUM, COUNT等聚合函数运算后返回一个值．</p>
<p>HAVING子句可以让我们筛选成组后的各组数据．<br />
WHERE子句在聚合前先筛选记录．也就是说作用在GROUP BY 子句和HAVING子句前．<br />
而 HAVING子句在聚合后对组记录进行筛选。</p>
<p>让我们还是通过具体的实例来理解GROUP BY 和 HAVING 子句，还采用第三节介绍的bbc表。</p>
<p>SQL实例：</p>
<p>一、显示每个地区的总人口数和总面积．<br />
SELECT region, SUM(population), SUM(area)<br />
FROM bbc<br />
GROUP BY region</p>
<p>先以region把返回记录分成多个组，这就是GROUP BY的字面含义。分完组后，然后用聚合函数对每组中<br />
的不同字段（一或多条记录）作运算。</p>
<p>二、 显示每个地区的总人口数和总面积．仅显示那些面积超过1000000的地区。</p>
<p>SELECT region, SUM(population), SUM(area)<br />
FROM bbc<br />
GROUP BY region<br />
HAVING SUM(area)&gt;1000000</p>
<p>在这里，我们不能用where来筛选超过1000000的地区，因为表中不存在这样一条记录。<br />
相反，HAVING子句可以让我们筛选成组后的各组数据</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/303/feed</wfw:commentRss>
		</item>
		<item>
		<title>54点提高PHP编程效率 引入缓存机制提升性能</title>
		<link>http://www.phpzh.com/archives/301</link>
		<comments>http://www.phpzh.com/archives/301#comments</comments>
		<pubDate>Fri, 19 Feb 2010 14:48:10 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[PHP技巧]]></category>

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

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=300</guid>
		<description><![CDATA[1、获取当前时间
mysql&#62; select current_timestamp();
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; current_timestamp() &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; 2010-01-18 21:24:37 &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
1 row in set (0.00 sec)
mysql&#62; select current_date();
+&#8212;&#8212;&#8212;&#8212;&#8212;-+
&#124; current_date() &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;-+
&#124; 2010-01-18     &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;-+
1 row in set (0.00 sec)
mysql&#62; select current_time();
+&#8212;&#8212;&#8212;&#8212;&#8212;-+
&#124; current_time() &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;-+
&#124; 21:24:46       &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;-+
1 row in set (0.00 sec)
2、Unix时间
mysql&#62; select unix_timestamp();
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; unix_timestamp() &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124;       1263821184 &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
1 row in set (0.00 sec)
mysql&#62; select from_unixtime(1263821182);
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; from_unixtime(1263821182) &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
&#124; 2010-01-18 21:26:22       &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+
1 row in [...]]]></description>
			<content:encoded><![CDATA[<p>1、获取当前时间</p>
<p>mysql&gt; select current_timestamp();<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| current_timestamp() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2010-01-18 21:24:37 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)<span id="more-300"></span></p>
<p>mysql&gt; select current_date();<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| current_date() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 2010-01-18     |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select current_time();<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| current_time() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 21:24:46       |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>2、Unix时间</p>
<p>mysql&gt; select unix_timestamp();<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| unix_timestamp() |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
|       1263821184 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select from_unixtime(1263821182);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| from_unixtime(1263821182) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2010-01-18 21:26:22       |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p>
<p>3、时间前后</p>
<p>mysql&gt; select date_add(current_timestamp, interval 1 day);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| date_add(current_timestamp, interval 1 day) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2010-01-19 21:27:53                         |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select date_add(current_time, interval 1 day);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_add(current_time, interval 1 day) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| NULL                                   |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set, 1 warning (0.00 sec)</p>
<p>mysql&gt; select date_add(current_date, interval 1 day);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_add(current_date, interval 1 day) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 2010-01-19                             |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select date_sub(current_timestamp, interval 1 day);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| date_sub(current_timestamp, interval 1 day) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| 2010-01-17 21:28:41                         |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select date_sub(current_date, interval 1 day);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_sub(current_date, interval 1 day) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 2010-01-17                             |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select date_sub(current_time, interval 1 day);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| date_sub(current_time, interval 1 day) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| NULL                                   |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set, 1 warning (0.00 sec)<br />
4、时间间隔</p>
<p>mysql&gt; select datediff(&#8217;2010-01-18&#8242;,&#8217;2010-01-17&#8242;);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| datediff(&#8217;2010-01-18&#8242;,&#8217;2010-01-17&#8242;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
|                                   1 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select timediff(&#8217;2010-01-18 12:00&#8242;,&#8217;2010-01-17 11:00&#8242;);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| timediff(&#8217;2010-01-18 12:00&#8242;,&#8217;2010-01-17 11:00&#8242;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| 25:00:00                                        |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)<br />
5、时间转换</p>
<p>mysql&gt; select time_to_sec(&#8217;25:00:00&#8242;);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
| time_to_sec(&#8217;25:00:00&#8242;) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
|                   90000 |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; select sec_to_time(90000);<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| sec_to_time(90000) |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| 25:00:00           |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
1 row in set (0.00 sec)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/300/feed</wfw:commentRss>
		</item>
		<item>
		<title>MySQL的optimize的效果太震惊了</title>
		<link>http://www.phpzh.com/archives/299</link>
		<comments>http://www.phpzh.com/archives/299#comments</comments>
		<pubDate>Thu, 14 Jan 2010 03:51:21 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=299</guid>
		<description><![CDATA[今天写的一个页面，用的AJAX，但是总是感觉很慢，查看了一下消耗的时间，600ms左右，太长了，有明显的延迟感。不能这样发布啊，太慢了，于是找哪块消耗的时间最长，发现后台的一条的SQL语句很慢，大概500多ms，但是看上去那条SQL语句不会消耗太多的时间，于是想着想优化表结构，设置索引，正在想要不要做额外的索引的时候，突然想到尝试一下optimize试试看。结果用来之后，时间只有40多ms了，一下子就没有那种延迟感了，效果很明显。
回来后在网上查了一下，有段对optimize的描述：
OPTIMIZE [LOCAL &#124; NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
如果您已经删除了表的一大部分，或者如果您已经对含有可变长度行的表（含有VARCHAR, BLOB或TEXT列的表）进行了很多更改，
则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中，后续的INSERT操作会重新使用旧的记录位置。
您可以使用OPTIMIZE TABLE来重新
利用未使用的空间，并整理数据文件的碎片。
在多数的设置中，您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新，您也不需要经常运行，每周一次或每月一次
即可，只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
注意，在OPTIMIZE TABLE运行过程中，MySQL会锁定表。
因为我那个表，里面有VARCHAR字段，而且，那个表是分了三步生成的，后期有大量的update操作，所以optimize后效果很明显。
]]></description>
			<content:encoded><![CDATA[<p>今天写的一个页面，用的AJAX，但是总是感觉很慢，查看了一下消耗的时间，600ms左右，太长了，有明显的延迟感。不能这样发布啊，太慢了，于是找哪块消耗的时间最长，发现后台的一条的SQL语句很慢，大概500多ms，但是看上去那条SQL语句不会消耗太多的时间，于是想着想优化表结构，设置索引，正在想要不要做额外的索引的时候，突然想到尝试一下optimize试试看。结果用来之后，时间只有40多ms了，一下子就没有那种延迟感了，效果很明显。<span id="more-299"></span></p>
<p>回来后在网上查了一下，有段对optimize的描述：</p>
<pre>OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...</pre>
<p>如果您已经删除了表的一大部分，或者如果您已经对含有可变长度行的表（含有VARCHAR, BLOB或TEXT列的表）进行了很多更改，</p>
<p>则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中，后续的INSERT操作会重新使用旧的记录位置。</p>
<p>您可以使用OPTIMIZE TABLE来重新<br />
利用未使用的空间，并整理数据文件的碎片。</p>
<p>在多数的设置中，您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新，您也不需要经常运行，每周一次或每月一次<br />
即可，只对特定的表运行。</p>
<p>OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。</p>
<p>注意，在OPTIMIZE TABLE运行过程中，MySQL会锁定表。</p>
<p>因为我那个表，里面有VARCHAR字段，而且，那个表是分了三步生成的，后期有大量的update操作，<span style="background-color: #ffffff;">所以optimize后效果很明显。</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/299/feed</wfw:commentRss>
		</item>
		<item>
		<title>mysql中OPTIMIZE TABLE的作用</title>
		<link>http://www.phpzh.com/archives/297</link>
		<comments>http://www.phpzh.com/archives/297#comments</comments>
		<pubDate>Thu, 14 Jan 2010 03:48:48 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=297</guid>
		<description><![CDATA[1、先来看看多次删除插入操作后的表索引情况
mysql&#62; SHOW INDEX FROM `tbl_name`;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
&#124; Table &#124; Non_unique &#124; Key_name &#124; Seq_in_index &#124; Column_name &#124; Collation &#124; Cardinality &#124; Sub_part &#124; Packed &#124; Null &#124; Index_type &#124; Comment &#124;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
&#124; tbl_name &#124; 0 &#124; PRIMARY &#124; 1 &#124; StepID &#124; A &#124; 1 &#124; NULL &#124; NULL &#124; &#124; BTREE &#124; &#124;
&#124; tbl_name &#124; 1 &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>1、先来看看多次删除插入操作后的表索引情况</p>
<pre>mysql&gt; SHOW INDEX FROM `tbl_name`;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tbl_name | 0 | PRIMARY | 1 | StepID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | FlowID | 1 | FlowID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerCount | 1 | WagerCount | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 1 | StepType | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 1 | 255 | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 2 | StepType | A | 1 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 1 | 255 | NULL | | BTREE | |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
11 rows in set (0.01 sec)<span id="more-297"></span></pre>
<p>2、优化表</p>
<pre>mysql&gt; optimize table tbl_name;
+---------------+----------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------------+----------+----------+----------+
| test.tbl_name | optimize | status | OK |
+---------------+----------+----------+----------+
1 row in set (40.60 sec)</pre>
<p>3、再来看看优化后的效果</p>
<pre>mysql&gt; SHOW INDEX FROM `tbl_name`;
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| tbl_name | 0 | PRIMARY | 1 | StepID | A | 172462 | NULL | NULL | | BTREE | |
| tbl_name | 1 | FlowID | 1 | FlowID | A | 86231 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerCount | 1 | WagerCount | A | 4311 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_3 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 1 | StepType | A | 9 | NULL | NULL | | BTREE | |
| tbl_name | 1 | StepType_2 | 2 | ParamResult | A | 86231 | 255 | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 1 | WagerID | A | 86231 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 2 | StepType | A | 172462 | NULL | NULL | | BTREE | |
| tbl_name | 1 | WagerID_2 | 3 | ParamResult | A | 172462 | 255 | NULL | | BTREE | |
+----------+------------+------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+</pre>
<p>最后，来看看手册中关于 OPTIMIZE 的描述：</p>
<pre>OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...

如果您已经删除了表的一大部分，或者如果您已经对含有可变长度行的表（含有VARCHAR, BLOB或TEXT列的表）进行了很多更改，则应使用
OPTIMIZE TABLE。被删除的记录被保持在链接清单中，后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新
利用未使用的空间，并整理数据文件的碎片。

在多数的设置中，您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新，您也不需要经常运行，每周一次或每月一次
即可，只对特定的表运行。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

注意，在OPTIMIZE TABLE运行过程中，MySQL会锁定表。</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/297/feed</wfw:commentRss>
		</item>
		<item>
		<title>从MySQL表中随机读取数据</title>
		<link>http://www.phpzh.com/archives/295</link>
		<comments>http://www.phpzh.com/archives/295#comments</comments>
		<pubDate>Wed, 13 Jan 2010 13:41:33 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=295</guid>
		<description><![CDATA[如果用PHP的实现随机,但取出多条好像要进行两次以上查询.
翻了手册,找到了下面这个语句,可以完成任务了
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
rand在手册里是这么说的:
RAND()
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定，它被用作种子值。
mysql&#62; select RAND();
        -&#62; 0.5925
mysql&#62; select RAND(20);
        -&#62; 0.1811
mysql&#62; select RAND(20);
        -&#62; 0.1811
mysql&#62; select RAND();
        -&#62; 0.2079
mysql&#62; select RAND();
        -&#62; 0.7888
你不能在一个ORDER BY子句用RAND()值使用列，因为ORDER BY将重复计算列多次。然而在MySQL3.23中，你可以做： SELECT * FROM table_name ORDER BY RAND()，这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c&#60;d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。
但我试了一下,8千条记录的表,执行一次需要0.08 sec,.慢了些
后来请教了google,得到如下代码
SELECT *
FROM table_name AS r1 [...]]]></description>
			<content:encoded><![CDATA[<p>如果用PHP的实现随机,但取出多条好像要进行两次以上查询.</p>
<p>翻了手册,找到了下面这个语句,可以完成任务了</p>
<p>SELECT * FROM table_name ORDER BY rand() LIMIT 5;<span id="more-295"></span></p>
<p>rand在手册里是这么说的:<br />
RAND()<br />
RAND(N)<br />
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定，它被用作种子值。<br />
mysql&gt; select RAND();<br />
        -&gt; 0.5925<br />
mysql&gt; select RAND(20);<br />
        -&gt; 0.1811<br />
mysql&gt; select RAND(20);<br />
        -&gt; 0.1811<br />
mysql&gt; select RAND();<br />
        -&gt; 0.2079<br />
mysql&gt; select RAND();<br />
        -&gt; 0.7888<br />
你不能在一个ORDER BY子句用RAND()值使用列，因为ORDER BY将重复计算列多次。然而在MySQL3.23中，你可以做： SELECT * FROM table_name ORDER BY RAND()，这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c&lt;d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。</p>
<p>但我试了一下,8千条记录的表,执行一次需要0.08 sec,.慢了些</p>
<p>后来请教了google,得到如下代码</p>
<p>SELECT *<br />
FROM table_name AS r1 JOIN<br />
       (SELECT ROUND(RAND() *<br />
                     (SELECT MAX(id)<br />
                        FROM table_name)) AS id)<br />
        AS r2<br />
WHERE r1.id &gt;= r2.id<br />
ORDER BY r1.id ASC<br />
LIMIT 5;</p>
<p>执行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持这样的子查询.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/295/feed</wfw:commentRss>
		</item>
		<item>
		<title>PHP的RSS生成类</title>
		<link>http://www.phpzh.com/archives/294</link>
		<comments>http://www.phpzh.com/archives/294#comments</comments>
		<pubDate>Mon, 11 Jan 2010 01:02:25 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[PHP]]></category>

		<category><![CDATA[PHP应用]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=294</guid>
		<description><![CDATA[&#60;?php
/**
 * rss操作类
 */
define(&#8221;TIME_ZONE&#8221;,&#8221;");
define(&#8221;FEEDCREATOR_VERSION&#8221;, &#8220;www.phpzh.com&#8221;);
class FeedItem extends HtmlDescribable {
    var $title, $description, $link;
    var $author, $authorEmail, $image, $category, $comments, $guid, $source, $creator;
    var $date;
    var $additionalElements = Array();
}
class FeedImage extends HtmlDescribable {
    var $title, $url, $link;
    var $width, $height, $description;
}
class HtmlDescribable {
    var $descriptionHtmlSyndicated;
    var $descriptionTruncSize;
    function getDescription() {
        $descriptionField = new FeedHtmlField($this-&#62;description);
        $descriptionField-&#62;syndicateHtml = $this-&#62;descriptionHtmlSyndicated;
        $descriptionField-&#62;truncSize [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;?php<br />
/**<br />
 * rss操作类<br />
 */<br />
define(&#8221;TIME_ZONE&#8221;,&#8221;");<br />
define(&#8221;FEEDCREATOR_VERSION&#8221;, &#8220;www.phpzh.com&#8221;);<br />
class FeedItem extends HtmlDescribable {<br />
    var $title, $description, $link;<br />
    var $author, $authorEmail, $image, $category, $comments, $guid, $source, $creator;<br />
    var $date;<br />
    var $additionalElements = Array();<br />
}<span id="more-294"></span></p>
<p>class FeedImage extends HtmlDescribable {<br />
    var $title, $url, $link;<br />
    var $width, $height, $description;<br />
}</p>
<p>class HtmlDescribable {<br />
    var $descriptionHtmlSyndicated;<br />
    var $descriptionTruncSize;<br />
    function getDescription() {<br />
        $descriptionField = new FeedHtmlField($this-&gt;description);<br />
        $descriptionField-&gt;syndicateHtml = $this-&gt;descriptionHtmlSyndicated;<br />
        $descriptionField-&gt;truncSize = $this-&gt;descriptionTruncSize;<br />
        return $descriptionField-&gt;output();<br />
    }<br />
}</p>
<p>class FeedHtmlField {<br />
    var $rawFieldContent;<br />
    var $truncSize, $syndicateHtml;<br />
    function FeedHtmlField($parFieldContent) {<br />
        if ($parFieldContent) {<br />
            $this-&gt;rawFieldContent = $parFieldContent;<br />
        }<br />
    }<br />
    function output() {<br />
        if (!$this-&gt;rawFieldContent) {<br />
            $result = &#8220;&#8221;;<br />
        } elseif ($this-&gt;syndicateHtml) {<br />
            $result = &#8220;&lt;![CDATA[".$this-&gt;rawFieldContent."]]&gt;&#8221;;<br />
        } else {<br />
            if ($this-&gt;truncSize and is_int($this-&gt;truncSize)) {<br />
                $result = FeedCreator::iTrunc(htmlspecialchars($this-&gt;rawFieldContent),$this-&gt;truncSize);<br />
            } else {<br />
                $result = htmlspecialchars($this-&gt;rawFieldContent);<br />
            }<br />
        }<br />
        return $result;<br />
    }<br />
}</p>
<p>class UniversalFeedCreator extends FeedCreator {<br />
    var $_feed;</p>
<p>    function _setFormat($format) {<br />
        switch (strtoupper($format)) {</p>
<p>            case &#8220;2.0&#8243;:<br />
            case &#8220;RSS2.0&#8243;:<br />
                $this-&gt;_feed = new RSSCreator20();<br />
                break;</p>
<p>            case &#8220;0.91&#8243;:<br />
            case &#8220;RSS0.91&#8243;:<br />
                $this-&gt;_feed = new RSSCreator091();<br />
                break;</p>
<p>            default:<br />
                $this-&gt;_feed = new RSSCreator091();<br />
                break;<br />
        }</p>
<p>        $vars = get_object_vars($this);<br />
        foreach ($vars as $key =&gt; $value) {<br />
            if (!in_array($key, array(&#8221;_feed&#8221;, &#8220;contentType&#8221;, &#8220;encoding&#8221;))) {<br />
                $this-&gt;_feed-&gt;{$key} = $this-&gt;{$key};<br />
            }<br />
        }<br />
    }<br />
    function createFeed($format = &#8220;RSS0.91&#8243;) {<br />
        $this-&gt;_setFormat($format);<br />
        return $this-&gt;_feed-&gt;createFeed();<br />
    }<br />
    function saveFeed($format=&#8221;RSS0.91&#8243;, $filename=&#8221;", $displayContents=true) {<br />
        $this-&gt;_setFormat($format);<br />
        $this-&gt;_feed-&gt;saveFeed($filename, $displayContents);<br />
    }<br />
    function useCached($format=&#8221;RSS0.91&#8243;, $filename=&#8221;", $timeout=3600) {<br />
        $this-&gt;_setFormat($format);<br />
        $this-&gt;_feed-&gt;useCached($filename, $timeout);<br />
    }<br />
}</p>
<p>class FeedCreator extends HtmlDescribable {<br />
    var $title, $description, $link;<br />
    var $syndicationURL, $image, $language, $copyright, $pubDate, $lastBuildDate, $editor, $editorEmail, $webmaster, $category, $docs, $ttl, $rating, $skipHours, $skipDays;<br />
    var $xslStyleSheet = &#8220;&#8221;;<br />
    var $items = Array();<br />
    var $contentType = &#8220;application/xml&#8221;;<br />
    var $encoding = &#8220;utf-8&#8243;;<br />
    var $additionalElements = Array();<br />
    function addItem($item) {<br />
        $this-&gt;items[] = $item;<br />
    }</p>
<p>    function clearItem2Null() {<br />
        $this-&gt;items = array();<br />
    }</p>
<p>    function iTrunc($string, $length) {<br />
        if (strlen($string)&lt;=$length) {<br />
            return $string;<br />
        }</p>
<p>        $pos = strrpos($string,&#8221;.&#8221;);<br />
        if ($pos&gt;=$length-4) {<br />
            $string = substr($string,0,$length-4);<br />
            $pos = strrpos($string,&#8221;.&#8221;);<br />
        }<br />
        if ($pos&gt;=$length*0.4) {<br />
            return substr($string,0,$pos+1).&#8221; &#8230;&#8221;;<br />
        }</p>
<p>        $pos = strrpos($string,&#8221; &#8220;);<br />
        if ($pos&gt;=$length-4) {<br />
            $string = substr($string,0,$length-4);<br />
            $pos = strrpos($string,&#8221; &#8220;);<br />
        }<br />
        if ($pos&gt;=$length*0.4) {<br />
            return substr($string,0,$pos).&#8221; &#8230;&#8221;;<br />
        }</p>
<p>        return substr($string,0,$length-4).&#8221; &#8230;&#8221;;</p>
<p>    }</p>
<p>    function _createGeneratorComment() {<br />
        return &#8220;&lt;!&#8211; generator=\&#8221;".FEEDCREATOR_VERSION.&#8221;\&#8221; &#8211;&gt;\n&#8221;;<br />
    }</p>
<p>    function _createAdditionalElements($elements, $indentString=&#8221;") {<br />
        $ae = &#8220;&#8221;;<br />
        if (is_array($elements)) {<br />
            foreach($elements AS $key =&gt; $value) {<br />
                $ae.= $indentString.&#8221;&lt;$key&gt;$value&lt;/$key&gt;\n&#8221;;<br />
            }<br />
        }<br />
        return $ae;<br />
    }</p>
<p>    function _createStylesheetReferences() {<br />
        $xml = &#8220;&#8221;;<br />
        if ($this-&gt;cssStyleSheet) $xml .= &#8220;&lt;?xml-stylesheet href=\&#8221;".$this-&gt;cssStyleSheet.&#8221;\&#8221; _fcksavedurl=\&#8221;".$this-&gt;cssStyleSheet.&#8221;\&#8221; type=\&#8221;text/css\&#8221;?&gt;\n&#8221;;<br />
        if ($this-&gt;xslStyleSheet) $xml .= &#8220;&lt;?xml-stylesheet href=\&#8221;".$this-&gt;xslStyleSheet.&#8221;\&#8221; type=\&#8221;text/xsl\&#8221;?&gt;\n&#8221;;<br />
        return $xml;<br />
    }</p>
<p>    function createFeed() {<br />
    }</p>
<p>    function _generateFilename() {<br />
        $fileInfo = pathinfo($_SERVER["PHP_SELF"]);<br />
        return substr($fileInfo["basename"],0,-(strlen($fileInfo["extension"])+1)).&#8221;.xml&#8221;;<br />
    }</p>
<p>    function _redirect($filename) {<br />
        Header(&#8221;Content-Type: &#8220;.$this-&gt;contentType.&#8221;; charset=&#8221;.$this-&gt;encoding.&#8221;; filename=&#8221;.basename($filename));<br />
        Header(&#8221;Content-Disposition: inline; filename=&#8221;.basename($filename));<br />
        readfile($filename, &#8220;r&#8221;);<br />
        die();<br />
    }</p>
<p>    function useCached($filename=&#8221;", $timeout=3600) {<br />
        $this-&gt;_timeout = $timeout;<br />
        if ($filename==&#8221;") {<br />
            $filename = $this-&gt;_generateFilename();<br />
        }<br />
        if (file_exists($filename) AND (time()-filemtime($filename) &lt; $timeout)) {<br />
            $this-&gt;_redirect($filename);<br />
        }<br />
    }<br />
    function saveFeed($filename=&#8221;", $displayContents=true) {<br />
        if ($filename==&#8221;") {<br />
            $filename = $this-&gt;_generateFilename();<br />
        }<br />
        $feedFile = fopen($filename, &#8220;w+&#8221;);<br />
        if ($feedFile) {<br />
            fputs($feedFile,$this-&gt;createFeed());<br />
            fclose($feedFile);<br />
//            if ($displayContents) {<br />
//                $this-&gt;_redirect($filename);<br />
//            }<br />
        } else {<br />
            echo &#8220;&lt;br /&gt;&lt;b&gt;Error creating feed file, please check write permissions.&lt;/b&gt;&lt;br /&gt;&#8221;;<br />
        }<br />
    }</p>
<p>}</p>
<p>class FeedDate {<br />
    var $unix;<br />
    function FeedDate($dateString=&#8221;") {<br />
        if ($dateString==&#8221;") $dateString = date(&#8221;r&#8221;);</p>
<p>        if (is_integer($dateString)) {<br />
            $this-&gt;unix = $dateString;<br />
            return;<br />
        }<br />
        if (preg_match(&#8221;~(?:(?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),\\s+)?(\\d{1,2})\\s+([a-zA-Z]{3})\\s+(\\d{4})\\s+(\\d{2}):(\\d{2}):(\\d{2})\\s+(.*)~&#8221;,$dateString,$matches)) {<br />
            $months = Array(&#8221;Jan&#8221;=&gt;1,&#8221;Feb&#8221;=&gt;2,&#8221;Mar&#8221;=&gt;3,&#8221;Apr&#8221;=&gt;4,&#8221;May&#8221;=&gt;5,&#8221;Jun&#8221;=&gt;6,&#8221;Jul&#8221;=&gt;7,&#8221;Aug&#8221;=&gt;8,&#8221;Sep&#8221;=&gt;9,&#8221;Oct&#8221;=&gt;10,&#8221;Nov&#8221;=&gt;11,&#8221;Dec&#8221;=&gt;12);<br />
            $this-&gt;unix = mktime($matches[4],$matches[5],$matches[6],$months[$matches[2]],$matches[1],$matches[3]);<br />
            if (substr($matches[7],0,1)==&#8217;+&#8217; or substr($matches[7],0,1)==&#8217;-') {<br />
                $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;<br />
            } else {<br />
                if (strlen($matches[7])==1) {<br />
                    $oneHour = 3600;<br />
                    $ord = ord($matches[7]);<br />
                    if ($ord &lt; ord(&#8221;M&#8221;)) {<br />
                        $tzOffset = (ord(&#8221;A&#8221;) - $ord - 1) * $oneHour;<br />
                    } elseif ($ord &gt;= ord(&#8221;M&#8221;) AND $matches[7]!=&#8221;Z&#8221;) {<br />
                        $tzOffset = ($ord - ord(&#8221;M&#8221;)) * $oneHour;<br />
                    } elseif ($matches[7]==&#8221;Z&#8221;) {<br />
                        $tzOffset = 0;<br />
                    }<br />
                }<br />
                switch ($matches[7]) {<br />
                    case &#8220;UT&#8221;:<br />
                    case &#8220;GMT&#8221;: $tzOffset = 0;<br />
                }<br />
            }<br />
            $this-&gt;unix += $tzOffset;<br />
            return;<br />
        }<br />
        if (preg_match(&#8221;~(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})(.*)~&#8221;,$dateString,$matches)) {<br />
            $this-&gt;unix = mktime($matches[4],$matches[5],$matches[6],$matches[2],$matches[3],$matches[1]);<br />
            if (substr($matches[7],0,1)==&#8217;+&#8217; or substr($matches[7],0,1)==&#8217;-') {<br />
                $tzOffset = (substr($matches[7],0,3) * 60 + substr($matches[7],-2)) * 60;<br />
            } else {<br />
                if ($matches[7]==&#8221;Z&#8221;) {<br />
                    $tzOffset = 0;<br />
                }<br />
            }<br />
            $this-&gt;unix += $tzOffset;<br />
            return;<br />
        }<br />
        $this-&gt;unix = 0;<br />
    }</p>
<p>    function rfc822() {<br />
        //return gmdate(&#8221;r&#8221;,$this-&gt;unix);<br />
        $date = gmdate(&#8221;Y-m-d H:i:s&#8221;, $this-&gt;unix);<br />
        if (TIME_ZONE!=&#8221;") $date .= &#8221; &#8220;.str_replace(&#8221;:&#8221;,&#8221;",TIME_ZONE);<br />
        return $date;<br />
    }</p>
<p>    function iso8601() {<br />
        $date = gmdate(&#8221;Y-m-d H:i:s&#8221;,$this-&gt;unix);<br />
        $date = substr($date,0,22) . &#8216;:&#8217; . substr($date,-2);<br />
        if (TIME_ZONE!=&#8221;") $date = str_replace(&#8221;+00:00&#8243;,TIME_ZONE,$date);<br />
        return $date;<br />
    }</p>
<p>    function unix() {<br />
        return $this-&gt;unix;<br />
    }<br />
}</p>
<p>class RSSCreator10 extends FeedCreator {<br />
    function createFeed() {<br />
        $feed = &#8220;&lt;?xml version=\&#8221;1.0\&#8221; encoding=\&#8221;".$this-&gt;encoding.&#8221;\&#8221;?&gt;\n&#8221;;<br />
        $feed.= $this-&gt;_createGeneratorComment();<br />
        if ($this-&gt;cssStyleSheet==&#8221;") {<br />
            $cssStyleSheet = &#8220;http://www.w3.org/2000/08/w3c-synd/style.css&#8221;;<br />
        }<br />
        $feed.= $this-&gt;_createStylesheetReferences();<br />
        $feed.= &#8220;&lt;rdf:RDF\n&#8221;;<br />
        $feed.= &#8220;    xmlns=\&#8221;http://purl.org/rss/1.0/\&#8221;\n&#8221;;<br />
        $feed.= &#8220;    xmlns:rdf=\&#8221;http://www.w3.org/1999/02/22-rdf-syntax-ns#\&#8221;\n&#8221;;<br />
        $feed.= &#8220;    xmlns:slash=\&#8221;http://purl.org/rss/1.0/modules/slash/\&#8221;\n&#8221;;<br />
        $feed.= &#8220;    xmlns:dc=\&#8221;http://purl.org/dc/elements/1.1/\&#8221;&gt;\n&#8221;;<br />
        $feed.= &#8220;    &lt;channel rdf:about=\&#8221;".$this-&gt;syndicationURL.&#8221;\&#8221;&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;title&gt;&#8221;.htmlspecialchars($this-&gt;title).&#8221;&lt;/title&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;description&gt;&#8221;.htmlspecialchars($this-&gt;description).&#8221;&lt;/description&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;link&gt;&#8221;.$this-&gt;link.&#8221;&lt;/link&gt;\n&#8221;;<br />
        if ($this-&gt;image!=null) {<br />
            $feed.= &#8220;        &lt;image rdf:resource=\&#8221;".$this-&gt;image-&gt;url.&#8221;\&#8221; /&gt;\n&#8221;;<br />
        }<br />
        $now = new FeedDate();<br />
        $feed.= &#8220;       &lt;dc:date&gt;&#8221;.htmlspecialchars($now-&gt;iso8601()).&#8221;&lt;/dc:date&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;items&gt;\n&#8221;;<br />
        $feed.= &#8220;            &lt;rdf:Seq&gt;\n&#8221;;<br />
        for ($i=0;$i&lt;count($this-&gt;items);$i++) {<br />
            $feed.= &#8220;                &lt;rdf:li rdf:resource=\&#8221;".htmlspecialchars($this-&gt;items[$i]-&gt;link).&#8221;\&#8221;/&gt;\n&#8221;;<br />
        }<br />
        $feed.= &#8220;            &lt;/rdf:Seq&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;/items&gt;\n&#8221;;<br />
        $feed.= &#8220;    &lt;/channel&gt;\n&#8221;;<br />
        if ($this-&gt;image!=null) {<br />
            $feed.= &#8220;    &lt;image rdf:about=\&#8221;".$this-&gt;image-&gt;url.&#8221;\&#8221;&gt;\n&#8221;;<br />
            $feed.= &#8220;        &lt;title&gt;&#8221;.$this-&gt;image-&gt;title.&#8221;&lt;/title&gt;\n&#8221;;<br />
            $feed.= &#8220;        &lt;link&gt;&#8221;.$this-&gt;image-&gt;link.&#8221;&lt;/link&gt;\n&#8221;;<br />
            $feed.= &#8220;        &lt;url&gt;&#8221;.$this-&gt;image-&gt;url.&#8221;&lt;/url&gt;\n&#8221;;<br />
            $feed.= &#8220;    &lt;/image&gt;\n&#8221;;<br />
        }<br />
        $feed.= $this-&gt;_createAdditionalElements($this-&gt;additionalElements, &#8220;    &#8220;);</p>
<p>        for ($i=0;$i&lt;count($this-&gt;items);$i++) {<br />
            $feed.= &#8220;    &lt;item rdf:about=\&#8221;".htmlspecialchars($this-&gt;items[$i]-&gt;link).&#8221;\&#8221;&gt;\n&#8221;;<br />
            //$feed.= &#8220;        &lt;dc:type&gt;Posting&lt;/dc:type&gt;\n&#8221;;<br />
            $feed.= &#8220;        &lt;dc:format&gt;text/html&lt;/dc:format&gt;\n&#8221;;<br />
            if ($this-&gt;items[$i]-&gt;date!=null) {<br />
                $itemDate = new FeedDate($this-&gt;items[$i]-&gt;date);<br />
                $feed.= &#8220;        &lt;dc:date&gt;&#8221;.htmlspecialchars($itemDate-&gt;iso8601()).&#8221;&lt;/dc:date&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;items[$i]-&gt;source!=&#8221;") {<br />
                $feed.= &#8220;        &lt;dc:source&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;source).&#8221;&lt;/dc:source&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;items[$i]-&gt;author!=&#8221;") {<br />
                $feed.= &#8220;        &lt;dc:creator&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;author).&#8221;&lt;/dc:creator&gt;\n&#8221;;<br />
            }<br />
            $feed.= &#8220;        &lt;title&gt;&#8221;.htmlspecialchars(strip_tags(strtr($this-&gt;items[$i]-&gt;title,&#8221;\n\r&#8221;,&#8221;  &#8220;))).&#8221;&lt;/title&gt;\n&#8221;;<br />
            $feed.= &#8220;        &lt;link&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;link).&#8221;&lt;/link&gt;\n&#8221;;<br />
            $feed.= &#8220;        &lt;description&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;description).&#8221;&lt;/description&gt;\n&#8221;;<br />
            $feed.= $this-&gt;_createAdditionalElements($this-&gt;items[$i]-&gt;additionalElements, &#8220;        &#8220;);<br />
            $feed.= &#8220;    &lt;/item&gt;\n&#8221;;<br />
        }<br />
        $feed.= &#8220;&lt;/rdf:RDF&gt;\n&#8221;;<br />
        return $feed;<br />
    }<br />
}<br />
class RSSCreator091 extends FeedCreator {<br />
    var $RSSVersion;<br />
    function RSSCreator091() {<br />
        $this-&gt;_setRSSVersion(&#8221;0.91&#8243;);<br />
        $this-&gt;contentType = &#8220;application/rss+xml&#8221;;<br />
    }</p>
<p>    function _setRSSVersion($version) {<br />
        $this-&gt;RSSVersion = $version;<br />
    }<br />
    function createFeed() {<br />
        $feed = &#8220;&lt;?xml version=\&#8221;1.0\&#8221; encoding=\&#8221;".$this-&gt;encoding.&#8221;\&#8221;?&gt;\n&#8221;;<br />
        $feed.= $this-&gt;_createGeneratorComment();<br />
        $feed.= $this-&gt;_createStylesheetReferences();<br />
        $feed.= &#8220;&lt;rss version=\&#8221;".$this-&gt;RSSVersion.&#8221;\&#8221;&gt;\n&#8221;;<br />
        $feed.= &#8220;    &lt;channel&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;title&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;title),100).&#8221;&lt;/title&gt;\n&#8221;;<br />
        $this-&gt;descriptionTruncSize = 500;<br />
        $feed.= &#8220;        &lt;description&gt;&#8221;.$this-&gt;getDescription().&#8221;&lt;/description&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;link&gt;&#8221;.$this-&gt;link.&#8221;&lt;/link&gt;\n&#8221;;<br />
        $now = new FeedDate();<br />
        $feed.= &#8220;        &lt;lastBuildDate&gt;&#8221;.htmlspecialchars($now-&gt;rfc822()).&#8221;&lt;/lastBuildDate&gt;\n&#8221;;<br />
        $feed.= &#8220;        &lt;generator&gt;&#8221;.FEEDCREATOR_VERSION.&#8221;&lt;/generator&gt;\n&#8221;;<br />
        if ($this-&gt;image!=null) {<br />
            $feed.= &#8220;        &lt;image&gt;\n&#8221;;<br />
            $feed.= &#8220;            &lt;url&gt;&#8221;.$this-&gt;image-&gt;url.&#8221;&lt;/url&gt;\n&#8221;;<br />
            $feed.= &#8220;            &lt;title&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;image-&gt;title),100).&#8221;&lt;/title&gt;\n&#8221;;<br />
            $feed.= &#8220;            &lt;link&gt;&#8221;.$this-&gt;image-&gt;link.&#8221;&lt;/link&gt;\n&#8221;;<br />
            if ($this-&gt;image-&gt;width!=&#8221;") {<br />
                $feed.= &#8220;            &lt;width&gt;&#8221;.$this-&gt;image-&gt;width.&#8221;&lt;/width&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;image-&gt;height!=&#8221;") {<br />
                $feed.= &#8220;            &lt;height&gt;&#8221;.$this-&gt;image-&gt;height.&#8221;&lt;/height&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;image-&gt;description!=&#8221;") {<br />
                $feed.= &#8220;            &lt;description&gt;&#8221;.$this-&gt;image-&gt;getDescription().&#8221;&lt;/description&gt;\n&#8221;;<br />
            }<br />
            $feed.= &#8220;        &lt;/image&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;language!=&#8221;") {<br />
            $feed.= &#8220;        &lt;language&gt;&#8221;.$this-&gt;language.&#8221;&lt;/language&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;copyright!=&#8221;") {<br />
            $feed.= &#8220;        &lt;copyright&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;copyright),100).&#8221;&lt;/copyright&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;editor!=&#8221;") {<br />
            $feed.= &#8220;        &lt;managingEditor&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;editor),100).&#8221;&lt;/managingEditor&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;webmaster!=&#8221;") {<br />
            $feed.= &#8220;        &lt;webMaster&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;webmaster),100).&#8221;&lt;/webMaster&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;pubDate!=&#8221;") {<br />
            $pubDate = new FeedDate($this-&gt;pubDate);<br />
            $feed.= &#8220;        &lt;pubDate&gt;&#8221;.htmlspecialchars($pubDate-&gt;rfc822()).&#8221;&lt;/pubDate&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;category!=&#8221;") {<br />
            $feed.= &#8220;        &lt;category&gt;&#8221;.htmlspecialchars($this-&gt;category).&#8221;&lt;/category&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;docs!=&#8221;") {<br />
            $feed.= &#8220;        &lt;docs&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;docs),500).&#8221;&lt;/docs&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;ttl!=&#8221;") {<br />
            $feed.= &#8220;        &lt;ttl&gt;&#8221;.htmlspecialchars($this-&gt;ttl).&#8221;&lt;/ttl&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;rating!=&#8221;") {<br />
            $feed.= &#8220;        &lt;rating&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars($this-&gt;rating),500).&#8221;&lt;/rating&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;skipHours!=&#8221;") {<br />
            $feed.= &#8220;        &lt;skipHours&gt;&#8221;.htmlspecialchars($this-&gt;skipHours).&#8221;&lt;/skipHours&gt;\n&#8221;;<br />
        }<br />
        if ($this-&gt;skipDays!=&#8221;") {<br />
            $feed.= &#8220;        &lt;skipDays&gt;&#8221;.htmlspecialchars($this-&gt;skipDays).&#8221;&lt;/skipDays&gt;\n&#8221;;<br />
        }<br />
        $feed.= $this-&gt;_createAdditionalElements($this-&gt;additionalElements, &#8220;    &#8220;);<br />
        for ($i=0;$i&lt;count($this-&gt;items);$i++) {<br />
            $feed.= &#8220;        &lt;item&gt;\n&#8221;;<br />
            $feed.= &#8220;            &lt;title&gt;&#8221;.FeedCreator::iTrunc(htmlspecialchars(strip_tags($this-&gt;items[$i]-&gt;title)),100).&#8221;&lt;/title&gt;\n&#8221;;<br />
            $feed.= &#8220;            &lt;link&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;link).&#8221;&lt;/link&gt;\n&#8221;;<br />
            $feed.= &#8220;            &lt;description&gt;&#8221;.$this-&gt;items[$i]-&gt;getDescription().&#8221;&lt;/description&gt;\n&#8221;;</p>
<p>            if ($this-&gt;items[$i]-&gt;author!=&#8221;") {<br />
                $feed.= &#8220;            &lt;author&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;author).&#8221;&lt;/author&gt;\n&#8221;;<br />
            }<br />
            /*<br />
            // on hold<br />
            if ($this-&gt;items[$i]-&gt;source!=&#8221;") {<br />
            $feed.= &#8220;            &lt;source&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;source).&#8221;&lt;/source&gt;\n&#8221;;<br />
            }<br />
            */<br />
            if ($this-&gt;items[$i]-&gt;category!=&#8221;") {<br />
                $feed.= &#8220;            &lt;category&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;category).&#8221;&lt;/category&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;items[$i]-&gt;comments!=&#8221;") {<br />
                $feed.= &#8220;            &lt;comments&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;comments).&#8221;&lt;/comments&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;items[$i]-&gt;date!=&#8221;") {<br />
                $itemDate = new FeedDate($this-&gt;items[$i]-&gt;date);<br />
                $feed.= &#8220;            &lt;pubDate&gt;&#8221;.htmlspecialchars($itemDate-&gt;rfc822()).&#8221;&lt;/pubDate&gt;\n&#8221;;<br />
            }<br />
            if ($this-&gt;items[$i]-&gt;guid!=&#8221;") {<br />
                $feed.= &#8220;            &lt;guid&gt;&#8221;.htmlspecialchars($this-&gt;items[$i]-&gt;guid).&#8221;&lt;/guid&gt;\n&#8221;;<br />
            }<br />
            $feed.= $this-&gt;_createAdditionalElements($this-&gt;items[$i]-&gt;additionalElements, &#8220;        &#8220;);<br />
            $feed.= &#8220;        &lt;/item&gt;\n&#8221;;<br />
        }<br />
        $feed.= &#8220;    &lt;/channel&gt;\n&#8221;;<br />
        $feed.= &#8220;&lt;/rss&gt;\n&#8221;;<br />
        return $feed;<br />
    }<br />
}</p>
<p>class RSSCreator20 extends RSSCreator091 {<br />
    function RSSCreator20() {<br />
        parent::_setRSSVersion(&#8221;2.0&#8243;);<br />
    }</p>
<p>}<br />
?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/294/feed</wfw:commentRss>
		</item>
		<item>
		<title>使用MySQL触发器自动更新memcache</title>
		<link>http://www.phpzh.com/archives/293</link>
		<comments>http://www.phpzh.com/archives/293#comments</comments>
		<pubDate>Tue, 05 Jan 2010 02:03:06 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[数据库]]></category>

		<category><![CDATA[memcache]]></category>

		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=293</guid>
		<description><![CDATA[mysql 5.1支持触发器以及自定义函数接口(UDF)的特性，如果配合libmemcache以及Memcached Functions for MySQL，就能够实现memcache的自动更新。简单记录一下安装测试步骤。

安装步骤
安装memcached,这个步骤很简单，随处可见
安装mysql server 5.1RC，安装办法也很大众，不废话了
编译libmemcached，解压后安装即可./configure; make; make install
编译Memcached Functions for MySQL，在http://download.tangent.org/找一个最新的版本下载就是，./configure &#8211;with-mysql=/usr/local/mysql/bin/mysql_config &#8211;libdir=/usr/local/mysql/lib/mysql/
make
make install
接下来有两个办法让Memcached Functions for MySQL在mysql中生效 
在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql，这会把memcache function作为UDF加入mysql
运行memcached_functions_mysql源码目录下的utils/install.pl，这是一个perl脚本，作用同上一条
测试memcache function
以下测试脚本摘自memcached_functions_mysql的源码目录，有兴趣可以试试
 
PLAIN TEXTCODE: drop table if exists urls;
create table urls (
id int(3) not null,
url varchar(64) not null default &#8221;,
primary key (id)
);
 
select memc_servers_set(&#8217;localhost:11211&#8242;);
select memc_set(&#8217;urls:sequence&#8217;, 0);
 
DELIMITER &#124;
 
DROP TRIGGER IF EXISTS url_mem_insert;
CREATE TRIGGER url_mem_insert
BEFORE INSERT ON urls
FOR EACH [...]]]></description>
			<content:encoded><![CDATA[<p>mysql 5.1支持触发器以及自定义函数接口(UDF)的特性，如果配合libmemcache以及Memcached Functions for MySQL，就能够实现memcache的自动更新。简单记录一下安装测试步骤。</p>
<p><span id="more-293"></span></p>
<p style="text-indent: 2em;"><strong>安装步骤</strong></p>
<p style="text-indent: 2em;">安装memcached,这个步骤很简单，随处可见</p>
<p style="text-indent: 2em;">安装mysql server 5.1RC，安装办法也很大众，不废话了</p>
<p style="text-indent: 2em;">编译libmemcached，解压后安装即可./configure; make; make install</p>
<p style="text-indent: 2em;">编译Memcached Functions for MySQL，在http://download.tangent.org/找一个最新的版本下载就是，./configure &#8211;with-mysql=/usr/local/mysql/bin/mysql_config &#8211;libdir=/usr/local/mysql/lib/mysql/</p>
<p style="text-indent: 2em;">make</p>
<p style="text-indent: 2em;">make install</p>
<p style="text-indent: 2em;"><strong>接下来有两个办法让Memcached Functions for MySQL在mysql中生效 </strong></p>
<p style="text-indent: 2em;">在mysql的shell中执行memcached_functions_mysql源码目录下的sql/install_functions.sql，这会把memcache function作为UDF加入mysql</p>
<p style="text-indent: 2em;">运行memcached_functions_mysql源码目录下的utils/install.pl，这是一个perl脚本，作用同上一条</p>
<p style="text-indent: 2em;">测试memcache function</p>
<p style="text-indent: 2em;"><strong>以下测试脚本摘自memcached_functions_mysql的源码目录，有兴趣可以试试</strong></p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">PLAIN TEXTCODE: drop table if exists urls;</p>
<p style="text-indent: 2em;">create table urls (</p>
<p style="text-indent: 2em;">id int(3) not null,</p>
<p style="text-indent: 2em;">url varchar(64) not null default &#8221;,</p>
<p style="text-indent: 2em;">primary key (id)</p>
<p style="text-indent: 2em;">);</p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">select memc_servers_set(&#8217;localhost:11211&#8242;);</p>
<p style="text-indent: 2em;">select memc_set(&#8217;urls:sequence&#8217;, 0);</p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">DELIMITER |</p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">DROP TRIGGER IF EXISTS url_mem_insert;</p>
<p style="text-indent: 2em;">CREATE TRIGGER url_mem_insert</p>
<p style="text-indent: 2em;">BEFORE INSERT ON urls</p>
<p style="text-indent: 2em;">FOR EACH ROW BEGIN</p>
<p style="text-indent: 2em;">SET NEW.id= memc_increment(&#8217;urls:sequence&#8217;);</p>
<p style="text-indent: 2em;">SET @mm= memc_set(concat(&#8217;urls:&#8217;,NEW.id), NEW.url);</p>
<p style="text-indent: 2em;">END |</p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">DELIMITER ;</p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">insert into urls (url) values (&#8217;http://google.com&#8217;);</p>
<p style="text-indent: 2em;">insert into urls (url) values (&#8217;http://www.ooso.net/index.php&#8217;);</p>
<p style="text-indent: 2em;">insert into urls (url) values (&#8217;http://www.ooso.net/&#8217;);</p>
<p style="text-indent: 2em;">insert into urls (url) values (&#8217;http://slashdot.org&#8217;);</p>
<p style="text-indent: 2em;">insert into urls (url) values (&#8217;http://mysql.com&#8217;);</p>
<p style="text-indent: 2em;">select * from urls;</p>
<p style="text-indent: 2em;"> </p>
<p style="text-indent: 2em;">select memc_get(&#8217;urls:1&#8242;);</p>
<p style="text-indent: 2em;">select memc_get(&#8217;urls:2&#8242;);</p>
<p style="text-indent: 2em;">select memc_get(&#8217;urls:3&#8242;);</p>
<p style="text-indent: 2em;">select memc_get(&#8217;urls:4&#8242;);</p>
<p style="text-indent: 2em;">select memc_get(&#8217;urls:5&#8242;);</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/293/feed</wfw:commentRss>
		</item>
		<item>
		<title>雪域镇月亮花点的坐标</title>
		<link>http://www.phpzh.com/archives/292</link>
		<comments>http://www.phpzh.com/archives/292#comments</comments>
		<pubDate>Sat, 26 Dec 2009 07:24:31 +0000</pubDate>
		<dc:creator>guolb</dc:creator>
		
		<category><![CDATA[其它]]></category>

		<category><![CDATA[网络游戏[星尘传说]]]></category>

		<guid isPermaLink="false">http://www.phpzh.com/?p=292</guid>
		<description><![CDATA[雪域镇月亮花点的坐标
319.209  294.257  288.295  308.337  225.268 
308.337  212.230  200.258  205.293  154.306 
348.330  375.259  361.237  405.219  398.185
]]></description>
			<content:encoded><![CDATA[<p>雪域镇月亮花点的坐标</p>
<p>319.209  294.257  288.295  308.337  225.268 </p>
<p>308.337  212.230  200.258  205.293  154.306 </p>
<p>348.330  375.259  361.237  405.219  398.185</p>
]]></content:encoded>
			<wfw:commentRss>http://www.phpzh.com/archives/292/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
