<?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>我读吧</title>
	<atom:link href="http://www.woduba.com/?feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://www.woduba.com</link>
	<description>可爱熊个人博客</description>
	<lastBuildDate>Wed, 08 Sep 2010 07:28:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>LOCK TABLES和UNLOCK TABLES语法</title>
		<link>http://www.woduba.com/?p=586</link>
		<comments>http://www.woduba.com/?p=586#comments</comments>
		<pubDate>Wed, 08 Sep 2010 07:28:16 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[LOCK TABLES]]></category>
		<category><![CDATA[UNLOCK TABLES]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=586</guid>
		<description><![CDATA[LOCK TABLES     tbl_name [AS alias] {READ [LOCAL] &#124; [LOW_PRIORITY] WRITE}     [, tbl_name [AS alias] {READ [LOCAL] &#124; [LOW_PRIORITY] WRITE}] ... UNLOCK TABLES LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定，则造成堵塞，直到可以获取所有锁定为止。UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时，或当与服务器的连接被关闭时，所有由当前线程锁定的表被隐含地解锁。 表锁定只用于防止其它客户端进行不正当地读取和写入。保持锁定（即使是读取锁定）的客户端可以进行表层级的操作，比如DROP TABLE。 注意，下面是对事务表使用LOCK TABLES的说明： ·         在尝试锁定表之前，LOCK TABLES不是事务安全型的，会隐含地提交所有活性事务。同时，开始一项事务（例如，使用START TRANSACTION），会隐含地执行UNLOCK TABLES。 ·         对事务表（如InnoDB）使用LOCK TABLES的正确方法是，设置AUTOCOMMIT=0并且不能调用UNLOCK TABLES，直到您明确地提交事务为止。当您调用LOCK TABLES时，InnoDB会内部地取其自己的表锁定，MySQL取其自己的表锁定。InnoDB在下一个提交时释放其表锁定，但是，对于MySQL，要释放表锁定，您必须调用UNLOCK TABLES。您不应该让AUTOCOMMIT=1，因为那样的话，InnoDB会在调用LOCK TABLES之后立刻释放表锁定，并且很容易形成死锁定。注意，如果AUTOCOMMIT=1，我们根本不能获取InnoDB表锁定，这样就可以帮助旧的应用软件避免不必要的死锁定。 ·         ROLLBACK不会释放MySQL的非事务表锁定。 要使用LOCK TABLES，您必须拥有相关表的LOCK TABLES权限和SELECT权限。 使用LOCK TABLES的主要原因是仿效事务，或在更新表时加快速度。这将在后面进行更详细的解释。 如果一个线程获得对一个表地READ锁定，该线程（和所有其它线程）只能从该表中读取。如果一个线程获得对一个表的WRITE锁定，只有保持锁定的线程可以对表进行写入。其它的线程被阻止，直到锁定被释放时为止。 READ LOCAL和READ之间的区别是，READ LOCAL允许在锁定被保持时，执行非冲突性INSERT语句（同时插入）。但是，如果您正打算在MySQL外面操作数据库文件，同时您保持锁定，则不能使用READ LOCAL。对于InnoDB表，READ LOCAL与READ相同。 当您使用LOCK [...]]]></description>
			<content:encoded><![CDATA[<pre>LOCK TABLES</pre>
<pre>    <em>tbl_name</em> [AS <em>alias</em>] {READ [LOCAL] | [LOW_PRIORITY] WRITE}</pre>
<pre>    [, <em>tbl_name</em> [AS <em>alias</em>] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...</pre>
<pre>UNLOCK TABLES</pre>
<p>LOCK TABLES可以锁定用于当前线程的表。如果表被其它线程锁定，则造成堵塞，直到可以获取所有锁定为止。UNLOCK TABLES可以释放被当前线程保持的任何锁定。当线程发布另一个LOCK TABLES时，或当与服务器的连接被关闭时，所有由当前线程锁定的表被隐含地解锁。</p>
<p>表锁定只用于防止其它客户端进行不正当地读取和写入。保持锁定（即使是读取锁定）的客户端可以进行表层级的操作，比如DROP TABLE。</p>
<p>注意，下面是对事务表使用LOCK TABLES的说明：</p>
<p>·         在尝试锁定表之前，LOCK TABLES不是事务安全型的，会隐含地提交所有活性事务。同时，开始一项事务（例如，使用START TRANSACTION），会隐含地执行UNLOCK TABLES。<span id="more-586"></span></p>
<p>·         对事务表（如InnoDB）使用LOCK TABLES的正确方法是，设置AUTOCOMMIT=0并且不能调用UNLOCK TABLES，直到您明确地提交事务为止。当您调用LOCK TABLES时，InnoDB会内部地取其自己的表锁定，MySQL取其自己的表锁定。InnoDB在下一个提交时释放其表锁定，但是，对于MySQL，要释放表锁定，您必须调用UNLOCK TABLES。您不应该让AUTOCOMMIT=1，因为那样的话，InnoDB会在调用LOCK TABLES之后立刻释放表锁定，并且很容易形成死锁定。注意，如果AUTOCOMMIT=1，我们根本不能获取InnoDB表锁定，这样就可以帮助旧的应用软件避免不必要的死锁定。</p>
<p>·         ROLLBACK不会释放MySQL的非事务表锁定。</p>
<p>要使用LOCK TABLES，您必须拥有相关表的LOCK TABLES权限和SELECT权限。</p>
<p>使用LOCK TABLES的主要原因是仿效事务，或在更新表时加快速度。这将在后面进行更详细的解释。</p>
<p>如果一个线程获得对一个表地READ锁定，该线程（和所有其它线程）只能从该表中读取。如果一个线程获得对一个表的WRITE锁定，只有保持锁定的线程可以对表进行写入。其它的线程被阻止，直到锁定被释放时为止。</p>
<p>READ LOCAL和READ之间的区别是，READ LOCAL允许在锁定被保持时，执行非冲突性INSERT语句（同时插入）。但是，如果您正打算在MySQL外面操作数据库文件，同时您保持锁定，则不能使用READ LOCAL。对于InnoDB表，READ LOCAL与READ相同。</p>
<p>当您使用LOCK TABLES时，您必须锁定您打算在查询中使用的所有的表。虽然使用LOCK TABLES语句获得的锁定仍然有效，但是您不能访问没有被此语句锁定的任何的表。同时，您不能在一次查询中多次使用一个已锁定的表——使用别名代替，在此情况下，您必须分别获得对每个别名的锁定。</p>
<pre>mysql&gt; <strong>LOCK TABLE t WRITE, t AS t1 WRITE;</strong></pre>
<pre>mysql&gt; <strong>INSERT INTO t SELECT * FROM t;</strong></pre>
<pre>ERROR 1100: Table 't' was not locked with LOCK TABLES</pre>
<pre>mysql&gt; <strong>INSERT INTO t SELECT * FROM t AS t1;</strong></pre>
<p>如果您的查询使用一个别名引用一个表，那么您必须使用同样的别名锁定该表。如果没有指定别名，则不会锁定该表。</p>
<pre>mysql&gt; <strong>LOCK TABLE t READ;</strong></pre>
<pre>mysql&gt; <strong>SELECT * FROM t AS myalias;</strong></pre>
<pre>ERROR 1100: Table 'myalias' was not locked with LOCK TABLES</pre>
<p>相反的，如果您使用一个别名锁定一个表，您必须使用该别名在您的查询中引用该表。</p>
<pre>mysql&gt; <strong>LOCK TABLE t AS myalias READ;</strong></pre>
<pre>mysql&gt; <strong>SELECT * FROM t;</strong></pre>
<pre>ERROR 1100: Table 't' was not locked with LOCK TABLES</pre>
<pre>mysql&gt; <strong>SELECT * FROM t AS myalias;</strong></pre>
<p>WRITE锁定通常比READ锁定拥有更高的优先权，以确保更新被尽快地处理。这意味着，如果一个线程获得了一个READ锁定，则另一个线程会申请一个WRITE锁定，后续的READ锁定申请会等待，直到WRITE线程获得锁定并释放锁定。您可以使用LOW_PRIORITY WRITE锁定来允许其它线程在该线程正在等待WRITE锁定时获得READ锁定。只有当您确定最终将有一个时机，此时没有线程拥有READ锁定时，您才应该使用LOW_PRIORITY WRITE锁定。</p>
<p>LOCK TABLES按照如下方式执行：</p>
<p>1.    按照内部定义的顺序，对所有要被锁定的表进行分类。从用户的角度，此顺序是未经定义的。</p>
<p>2.    如果使用一个读取和一个写入锁定对一个表进行锁定，则把写入锁定放在读取锁定之前。</p>
<p>3.    一次锁定一个表，直到线程得到所有锁定为止。</p>
<p>该规则确保表锁定不会出现死锁定。但是，对于该规则，您需要注意其它的事情：</p>
<p>如果您正在对一个表使用一个LOW_PRIORITY WRITE锁定，这只意味着，MySQL等待特定的锁定，直到没有申请READ锁定的线程时为止。当线程已经获得WRITE锁定，并正在等待得到锁定表清单中的用于下一个表的锁定时，所有其它线程会等待WRITE锁定被释放。如果这成为对于应用程序的严重的问题，则您应该考虑把部分表转化为事务安全型表。</p>
<p>您可以安全地使用KILL来结束一个正在等待表锁定的线程。</p>
<p>注意，您不能使用INSERT DELAYED锁定任何您正在使用的表，因为，在这种情况下，INSERT由另一个线程执行。</p>
<p>通常，您不需要锁定表，因为所有的单个UPDATE语句都是原子性的；没有其它的线程可以干扰任何其它当前正在执行的SQL语句。但是，在几种情况下，锁定表会有好处：</p>
<p>·         如果您正在对一组MyISAM表运行许多操作，锁定您正在使用的表，可以快很多。锁定MyISAM表可以加快插入、更新或删除的速度。不利方面是，没有线程可以更新一个用READ锁定的表（包括保持锁定的表），也没有线程可以访问用WRITE锁定的表（除了保持锁定的表以外）。</p>
<p>有些MyISAM操作在LOCK TABLES之下更快的原因是，MySQL不会清空用于已锁定表的关键缓存，直到UNLOCK TABLE被调用为止。通常，关键缓存在每个SQL语句之后被清空。</p>
<p>·         如果您正在使用MySQL中的一个不支持事务的存储引擎，则如果您想要确定在SELECT和UPDATE之间没有其它线程，您必须使用LOCK TABLES。本处所示的例子要求LOCK TABLES，以便安全地执行：</p>
<pre>·                mysql&gt; <strong>LOCK TABLES trans READ, customer WRITE;</strong></pre>
<pre>·                mysql&gt; <strong>SELECT SUM(value) FROM trans WHERE customer_id=<em>some_id</em>;</strong></pre>
<pre>·                mysql&gt; <strong>UPDATE customer</strong></pre>
<pre>·                    -&gt;     <strong>SET total_value=<em>sum_from_previous_statement</em></strong></pre>
<pre>·                    -&gt;     <strong>WHERE customer_id=<em>some_id</em>;</strong></pre>
<pre>·                mysql&gt; <strong>UNLOCK TABLES;</strong></pre>
<p>如果没有LOCK TABLES，有可能另一个线程会在执行SELECT和UPDATE语句之间在trans表中插入一个新行。</p>
<p>通过使用相对更新（UPDATE customer SET <em>value</em>=<em>value</em>+<em>new_value</em>）或LAST_INSERT_ID()函数，您可以在许多情况下避免使用LOCK TABLES。</p>
<p>通过使用用户层级的顾问式锁定函数GET_LOCK()和RELEASE_LOCK()，您也可以在有些情况下避免锁定表。这些锁定被保存在服务器中的一个混编表中，使用pthread_mutex_lock() 和pthread_mutex_unlock()，以加快速度。</p>
<p>您可以使用FLUSH TABLES WITH READ LOCK语句锁定位于所有带有读取锁定的数据库中的所有表。如果您有一个可以及时拍摄快照的文件系统，比如Veritas，这是获得备份的一个非常方便的方式。</p>
<p>注释：如果您对一个已锁定的表使用ALTER TABLE，该表可能会解锁。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=586</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php函数mb_convert_encoding()使用详解</title>
		<link>http://www.woduba.com/?p=578</link>
		<comments>http://www.woduba.com/?p=578#comments</comments>
		<pubDate>Wed, 01 Sep 2010 08:43:51 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[mb_convert_encoding()]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=578</guid>
		<description><![CDATA[今天碰到一个问题，使用二进制从.dat文件中读取出来的中文数据，在utf-8页面中使用的时候，出现乱码。试了很多方法都不成功，最后找到一种方法解决了问题，使用mb_convert_encoding()函数将字符串的编码转换后再输出。 mb_convert_encoding()  转换内容编码，可解决输出编码乱码问题。 做一个GBK To UTF-8 Php代码 &#60;?php header(&#8220;content-Type: text/html; charset=Utf-8&#8243;); echo mb_convert_encoding(&#8220;妳係我的友仔&#8221;, &#8221;UTF-8&#8243;, &#8221;GBK&#8221;); ?&#62; 再来个GB2312 To Big5 &#60;?php header(&#8220;content-Type: text/html; charset=big5&#8243;); echo mb_convert_encoding(&#8220;你是我的朋友&#8221;, &#8221;big5&#8243;, &#8221;GB2312&#8243;); ?&#62;]]></description>
			<content:encoded><![CDATA[<div>
<div>今天碰到一个问题，使用二进制从.dat文件中读取出来的中文数据，在utf-8页面中使用的时候，出现乱码。试了很多方法都不成功，最后找到一种方法解决了问题，使用mb_convert_encoding()函数将字符串的编码转换后再输出。</div>
<div>mb_convert_encoding()  转换内容编码，可解决输出编码乱码问题。</div>
<div>做一个GBK To UTF-8</div>
<div>Php代码</div>
</div>
<ol>
<li>&lt;?php</li>
<li>header(&#8220;content-Type: text/html; charset=Utf-8&#8243;);</li>
<li>echo mb_convert_encoding(&#8220;妳係我的友仔&#8221;, &#8221;UTF-8&#8243;, &#8221;GBK&#8221;);</li>
<li>?&gt;</li>
</ol>
<p>再来个GB2312 To Big5</p>
<ol>
<li>&lt;?php</li>
<li>header(&#8220;content-Type: text/html; charset=big5&#8243;);</li>
<li>echo mb_convert_encoding(&#8220;你是我的朋友&#8221;, &#8221;big5&#8243;, &#8221;GB2312&#8243;);</li>
<li>?&gt;</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=578</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP读取纯真IP数据库的函数</title>
		<link>http://www.woduba.com/?p=575</link>
		<comments>http://www.woduba.com/?p=575#comments</comments>
		<pubDate>Wed, 01 Sep 2010 07:55:37 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[ip库]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=575</guid>
		<description><![CDATA[以前是使用文本记录ip及里面的各个省市信息，但是更新IP内容很慢，还要自己手动修改，添加比较麻烦，今天看了下以前DZ版本的ip地址查询功能，看到他们使用的是纯真IP库。纯真IP库更新很快，里面的内容很全，所以记录下来以方便使用！ &#60;?php//=================================== // // 功能：IP地址获取真实地址函数 // 参数：$ip &#8211; IP地址 // 作者：[Discuz!] (C) ***** Inc. // //=================================== // // 调用举例（速度很快） // //========================echo convertip(&#8217;219.238.235.10&#8242;); //输出: 北京市 电信通echo convertip(&#8217;23.56.82.12&#8242;); //输出：IANAecho convertip(&#8217;250.69.52.0&#8242;); //输出：IANA保留地址echo convertip(&#8217;238.69.52.0&#8242;); //输出：IANA保留地址 用于多点传送echo convertip(&#8217;192.168.0.1&#8242;); //输出：局域网 对方和您在同一内部网echo convertip(&#8217;255.255.255.255&#8242;); //输出：纯真网络 2006年11月20日IP数据 $ip=&#8217;210.32.0.0&#8242;; echo convertip($ip); #Notice: Undefined variable: ip1num in E:\phpLearn\IPcount\index.php on line 81 #Notice: Undefined variable: ip2num in [...]]]></description>
			<content:encoded><![CDATA[<p>以前是使用文本记录ip及里面的各个省市信息，但是更新IP内容很慢，还要自己手动修改，添加比较麻烦，今天看了下以前DZ版本的ip地址查询功能，看到他们使用的是纯真IP库。纯真IP库更新很快，里面的内容很全，所以记录下来以方便使用！</p>
<p>&lt;?php//===================================<br />
//<br />
// 功能：IP地址获取真实地址函数<br />
// 参数：$ip &#8211; IP地址<br />
// 作者：[Discuz!] (C) ***** Inc.<br />
//<br />
//===================================<br />
//<br />
// 调用举例（速度很快）<br />
//<br />
//========================echo convertip(&#8217;219.238.235.10&#8242;);<br />
//输出: 北京市 电信通echo convertip(&#8217;23.56.82.12&#8242;);<br />
//输出：IANAecho convertip(&#8217;250.69.52.0&#8242;);<br />
//输出：IANA保留地址echo convertip(&#8217;238.69.52.0&#8242;);<br />
//输出：IANA保留地址 用于多点传送echo convertip(&#8217;192.168.0.1&#8242;);<br />
//输出：局域网 对方和您在同一内部网echo convertip(&#8217;255.255.255.255&#8242;);<br />
//输出：纯真网络 2006年11月20日IP数据<br />
$ip=&#8217;210.32.0.0&#8242;;<br />
echo convertip($ip);<br />
#Notice: Undefined variable: ip1num in E:\phpLearn\IPcount\index.php on line 81<br />
#Notice: Undefined variable: ip2num in E:\phpLearn\IPcount\index.php on line 81<br />
#Notice: Undefined variable: ipAddr2 in E:\phpLearn\IPcount\index.php on line 150<br />
#Notice: Undefined variable: ipAddr1 in E:\phpLearn\IPcount\index.php on line 152<br />
#福建省福州市 铁通</p>
<p><span id="more-575"></span><br />
function convertip($ip) {<br />
//IP数据文件路径<br />
$dat_path = &#8216;QQWry.Dat&#8217;;    //检查IP地址<br />
if(!preg_match(&#8220;/^\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}$/&#8221;, $ip)){<br />
return &#8216;IP 地址错误！&#8217;;<br />
}<br />
//打开IP数据文件<br />
if(!$fd = @fopen($dat_path, &#8216;rb&#8217;)){<br />
return &#8216;IP数据文件无法读取，请确保是正确的纯真IP库！&#8217;;<br />
}    //分解IP进行运算，得出整形数<br />
$ip = explode(&#8216;.&#8217;, $ip);<br />
$ipNum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];    //获取IP数据索引开始和结束位置<br />
$DataBegin = fread($fd, 4);<br />
$DataEnd = fread($fd, 4);<br />
$ipbegin = implode(&#8221;, unpack(&#8216;L&#8217;, $DataBegin)); //unpack() 函数从二进制字符串对数据进行解包。unpack(format,data) L &#8211; unsigned long (always 32 bit, machine byte order)<br />
#$ipbegin 值如：5386001<br />
if($ipbegin &lt; 0) $ipbegin += pow(2, 32);<br />
$ipend = implode(&#8221;, unpack(&#8216;L&#8217;, $DataEnd));<br />
if($ipend &lt; 0) $ipend += pow(2, 32);<br />
$ipAllNum = ($ipend &#8211; $ipbegin) / 7 + 1;</p>
<p>$BeginNum = 0;<br />
$EndNum = $ipAllNum;    //使用二分查找法从索引记录中搜索匹配的IP记录<br />
$ip1num=&#8221;; $ip2num=&#8221;;   $ipAddr1=&#8221;;    $ipAddr2=&#8221;;<br />
while($ip1num&gt;$ipNum || $ip2num&lt;$ipNum) {<br />
$Middle= intval(($EndNum + $BeginNum) / 2);        //偏移指针到索引位置读取4个字节<br />
fseek($fd, $ipbegin + 7 * $Middle);<br />
$ipData1 = fread($fd, 4);<br />
if(strlen($ipData1) &lt; 4) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
//提取出来的数据转换成长整形，如果数据是负数则加上2的32次幂<br />
$ip1num = implode(&#8221;, unpack(&#8216;L&#8217;, $ipData1));<br />
if($ip1num &lt; 0) $ip1num += pow(2, 32);</p>
<p>//提取的长整型数大于我们IP地址则修改结束位置进行下一次循环<br />
if($ip1num &gt; $ipNum) {<br />
$EndNum = $Middle;<br />
continue;<br />
}</p>
<p>//取完上一个索引后取下一个索引<br />
$DataSeek = fread($fd, 3);<br />
if(strlen($DataSeek) &lt; 3) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
$DataSeek = implode(&#8221;, unpack(&#8216;L&#8217;, $DataSeek.chr(0)));<br />
fseek($fd, $DataSeek);<br />
$ipData2 = fread($fd, 4);<br />
if(strlen($ipData2) &lt; 4) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
$ip2num = implode(&#8221;, unpack(&#8216;L&#8217;, $ipData2));<br />
if($ip2num &lt; 0) $ip2num += pow(2, 32);        //没找到提示未知<br />
if($ip2num &lt; $ipNum) {<br />
if($Middle == $BeginNum) {<br />
fclose($fd);<br />
return &#8216;Unknown&#8217;;<br />
}<br />
$BeginNum = $Middle;<br />
}<br />
}    //下面的代码读晕了，没读明白，有兴趣的慢慢读<br />
$ipFlag = fread($fd, 1);<br />
if($ipFlag == chr(1)) {<br />
$ipSeek = fread($fd, 3);<br />
if(strlen($ipSeek) &lt; 3) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
$ipSeek = implode(&#8221;, unpack(&#8216;L&#8217;, $ipSeek.chr(0)));<br />
fseek($fd, $ipSeek);<br />
$ipFlag = fread($fd, 1);<br />
}    if($ipFlag == chr(2)) {<br />
$AddrSeek = fread($fd, 3);<br />
if(strlen($AddrSeek) &lt; 3) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
$ipFlag = fread($fd, 1);<br />
if($ipFlag == chr(2)) {<br />
$AddrSeek2 = fread($fd, 3);<br />
if(strlen($AddrSeek2) &lt; 3) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
$AddrSeek2 = implode(&#8221;, unpack(&#8216;L&#8217;, $AddrSeek2.chr(0)));<br />
fseek($fd, $AddrSeek2);<br />
} else {<br />
fseek($fd, -1, SEEK_CUR);<br />
}        while(($char = fread($fd, 1)) != chr(0))<br />
$ipAddr2 .= $char;        $AddrSeek = implode(&#8221;, unpack(&#8216;L&#8217;, $AddrSeek.chr(0)));<br />
fseek($fd, $AddrSeek);        while(($char = fread($fd, 1)) != chr(0))<br />
$ipAddr1 .= $char;<br />
} else {<br />
fseek($fd, -1, SEEK_CUR);<br />
while(($char = fread($fd, 1)) != chr(0))<br />
$ipAddr1 .= $char;        $ipFlag = fread($fd, 1);<br />
if($ipFlag == chr(2)) {<br />
$AddrSeek2 = fread($fd, 3);<br />
if(strlen($AddrSeek2) &lt; 3) {<br />
fclose($fd);<br />
return &#8216;System Error&#8217;;<br />
}<br />
$AddrSeek2 = implode(&#8221;, unpack(&#8216;L&#8217;, $AddrSeek2.chr(0)));<br />
fseek($fd, $AddrSeek2);<br />
} else {<br />
fseek($fd, -1, SEEK_CUR);<br />
}<br />
while(($char = fread($fd, 1)) != chr(0)){<br />
$ipAddr2 .= $char;<br />
}<br />
}<br />
fclose($fd);    //最后做相应的替换操作后返回结果<br />
if(preg_match(&#8216;/http/i&#8217;, $ipAddr2)) {<br />
$ipAddr2 = &#8221;;<br />
}<br />
$ipaddr = &#8220;$ipAddr1 $ipAddr2&#8243;;<br />
$ipaddr = preg_replace(&#8216;/CZ88.Net/is&#8217;, &#8221;, $ipaddr);<br />
$ipaddr = preg_replace(&#8216;/^s*/is&#8217;, &#8221;, $ipaddr);<br />
$ipaddr = preg_replace(&#8216;/s*$/is&#8217;, &#8221;, $ipaddr);<br />
if(preg_match(&#8216;/http/i&#8217;, $ipaddr) || $ipaddr == &#8221;) {<br />
$ipaddr = &#8216;Unknown&#8217;;<br />
}    return $ipaddr;<br />
}<br />
?&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=575</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>apache伪静态实例</title>
		<link>http://www.woduba.com/?p=573</link>
		<comments>http://www.woduba.com/?p=573#comments</comments>
		<pubDate>Tue, 31 Aug 2010 08:55:39 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[伪静态]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=573</guid>
		<description><![CDATA[想把 www.***.com/abc/def.php?uuu 伪静态为 www.***.com/abc/uuu .htaccess里应该怎么写？ RewriteEngine On RewriteBase /abc RewriteRule ^(.*)$ def.php?$1 [L,QSA] 或者 RewriteRule ^abc/(.*)$ def.php?$1 [L,QSA]]]></description>
			<content:encoded><![CDATA[<p>想把<br />
www.***.com/abc/def.php?uuu<br />
伪静态为<br />
www.***.com/abc/uuu</p>
<p>.htaccess里应该怎么写？</p>
<p>RewriteEngine On<br />
RewriteBase /abc<br />
RewriteRule ^(.*)$ def.php?$1 [L,QSA]</p>
<p>或者</p>
<p>RewriteRule ^abc/(.*)$ def.php?$1 [L,QSA]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=573</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php生成随机密码的几种方法</title>
		<link>http://www.woduba.com/?p=570</link>
		<comments>http://www.woduba.com/?p=570#comments</comments>
		<pubDate>Wed, 25 Aug 2010 09:21:39 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[随机密码]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=570</guid>
		<description><![CDATA[使用PHP开发应用程序，尤其是网站程序，常常需要生成随机密码，如用户注册生成随机密码，用户重置密码也需要生成一个随机的密码。随机密码也就是一串固定长度的字符串，这里我收集整理了几种生成随机字符串的方法，以供大家参考。 方法一： 1、在 33 – 126 中生成一个随机整数，如 35， 2、将 35 转换成对应的ASCII码字符，如 35 对应 # 3、重复以上 1、2 步骤 n 次，连接成 n 位的密码 该算法主要用到了两个函数，mt_rand ( int $min , int $max )函数用于生成随机整数，其中 $min – $max 为 ASCII 码的范围，这里取 33 -126 ，可以根据需要调整范围，如ASCII码表中 97 – 122 位对应 a – z 的英文字母，具体可参考 ASCII码表； chr ( int $ascii )函数用于将对应整数 $ascii 转换成对应的字符。 function [...]]]></description>
			<content:encoded><![CDATA[<p>使用<strong>PHP</strong>开发应用程序，尤其是网站程序，常常需要<strong>生成随机密码</strong>，如用户注册生成随机密码，用户重置密码也需要生成一个随机的密码。随机密码也就是一串固定长度的字符串，这里我收集整理了几种生成随机字符串的方法，以供大家参考。</p>
<p><strong>方法一</strong>：</p>
<p>1、在 33 – 126 中生成一个随机整数，如 35，</p>
<p>2、将 35 转换成对应的ASCII码字符，如 35 对应 #</p>
<p>3、重复以上 1、2 步骤 n 次，连接成 n 位的密码</p>
<p>该算法主要用到了两个函数，<a href="http://www.w3school.com.cn/php/func_math_mt_rand.asp" target="_blank">mt_rand ( int $min , int $max )</a>函数用于生成随机整数，其中 $min – $max 为 ASCII 码的范围，这里取 33 -126 ，可以根据需要调整范围，如ASCII码表中 97 – 122 位对应 a – z 的英文字母，具体可参考 <a href="http://www.asciitable.com/" target="_blank">ASCII码表</a>； <a href="http://www.w3school.com.cn/php/func_string_chr.asp" target="_blank">chr ( int $ascii )</a>函数用于将对应整数 $ascii 转换成对应的字符。<span id="more-570"></span></p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function create_password($pw_length = <img src='http://www.woduba.com/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /><br />
{<br />
    $randpwd = &#8221;;<br />
    for ($i = 0; $i &lt; $pw_length; $i++)<br />
    {<br />
        $randpwd .= chr(mt_rand(33, 126));<br />
    }<br />
    return $randpwd;<br />
}</p>
<p>// 调用该函数，传递长度参数$pw_length = 6<br />
echo create_password(6);</td>
</tr>
</tbody>
</table>
<p><strong>方法二</strong>：</p>
<p>1、预置一个的字符串 $chars ，包括 a – z，A – Z，0 – 9，以及一些特殊字符</p>
<p>2、在 $chars 字符串中随机取一个字符</p>
<p>3、重复第二步 n 次，可得长度为 n 的密码</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function generate_password( $length = 8 ) {<br />
    // 密码字符集，可任意添加你需要的字符<br />
    $chars = <a href="mailto:'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%">&#8216;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%</a>^&amp;*()-_ []{}&lt;&gt;~`+=,.;:/?|&#8217;;</p>
<p>    $password = &#8221;;<br />
    for ( $i = 0; $i &lt; $length; $i++ )<br />
    {<br />
        // 这里提供两种字符获取方式<br />
        // 第一种是使用 substr 截取$chars中的任意一位字符；<br />
        // 第二种是取字符数组 $chars 的任意元素<br />
        // $password .= substr($chars, mt_rand(0, strlen($chars) &#8211; 1), 1);<br />
        $password .= $chars[ mt_rand(0, strlen($chars) - 1) ];<br />
    }</p>
<p>    return $password;<br />
}</td>
</tr>
</tbody>
</table>
<p> </p>
<p><strong>方法三</strong>：</p>
<p>1、预置一个的字符数组 $chars ，包括 a – z，A – Z，0 – 9，以及一些特殊字符</p>
<p>2、通过<a href="http://www.w3school.com.cn/php/func_array_rand.asp" target="_blank">array_rand()</a>从数组 $chars 中随机选出 $length 个元素</p>
<p>3、根据已获取的键名数组 $keys，从数组 $chars 取出字符拼接字符串。该方法的缺点是相同的字符不会重复取。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">function make_password( $length = 8 )<br />
{<br />
    // 密码字符集，可任意添加你需要的字符<br />
    $chars = array(&#8216;a&#8217;, &#8216;b&#8217;, &#8216;c&#8217;, &#8216;d&#8217;, &#8216;e&#8217;, &#8216;f&#8217;, &#8216;g&#8217;, &#8216;h&#8217;,<br />
    &#8216;i&#8217;, &#8216;j&#8217;, &#8216;k&#8217;, &#8216;l&#8217;,'m&#8217;, &#8216;n&#8217;, &#8216;o&#8217;, &#8216;p&#8217;, &#8216;q&#8217;, &#8216;r&#8217;, &#8216;s&#8217;,<br />
    &#8216;t&#8217;, &#8216;u&#8217;, &#8216;v&#8217;, &#8216;w&#8217;, &#8216;x&#8217;, &#8216;y&#8217;,'z&#8217;, &#8216;A&#8217;, &#8216;B&#8217;, &#8216;C&#8217;, &#8216;D&#8217;,<br />
    &#8216;E&#8217;, &#8216;F&#8217;, &#8216;G&#8217;, &#8216;H&#8217;, &#8216;I&#8217;, &#8216;J&#8217;, &#8216;K&#8217;, &#8216;L&#8217;,'M&#8217;, &#8216;N&#8217;, &#8216;O&#8217;,<br />
    &#8216;P&#8217;, &#8216;Q&#8217;, &#8216;R&#8217;, &#8216;S&#8217;, &#8216;T&#8217;, &#8216;U&#8217;, &#8216;V&#8217;, &#8216;W&#8217;, &#8216;X&#8217;, &#8216;Y&#8217;,'Z&#8217;,<br />
    &#8217;0&#8242;, &#8217;1&#8242;, &#8217;2&#8242;, &#8217;3&#8242;, &#8217;4&#8242;, &#8217;5&#8242;, &#8217;6&#8242;, &#8217;7&#8242;, &#8217;8&#8242;, &#8217;9&#8242;, &#8216;!&#8217;,<br />
    <a href="mailto:'@','#'">&#8216;@&#8217;,'#&#8217;</a>, &#8216;$&#8217;, &#8216;%&#8217;, &#8216;^&#8217;, &#8216;&amp;&#8217;, &#8216;*&#8217;, &#8216;(&#8216;, &#8216;)&#8217;, &#8216;-&#8217;, &#8216;_&#8217;,<br />
    &#8216;[', ']&#8216;, &#8216;{&#8216;, &#8216;}&#8217;, &#8216;&lt;&#8217;, &#8216;&gt;&#8217;, &#8216;~&#8217;, &#8216;`&#8217;, &#8216;+&#8217;, &#8216;=&#8217;, &#8216;,&#8217;,<br />
    &#8216;.&#8217;, &#8216;;&#8217;, &#8216;:&#8217;, &#8216;/&#8217;, &#8216;?&#8217;, &#8216;|&#8217;);</p>
<p>    // 在 $chars 中随机取 $length 个数组元素键名<br />
    $keys = ($chars, $length);</p>
<p>    $password = &#8221;;<br />
    for($i = 0; $i &lt; $length; $i++)<br />
    {<br />
        // 将 $length 个数组元素连接成字符串<br />
        $password .= $chars[$keys[$i]];<br />
    }</p>
<p>    return $password;<br />
}</td>
</tr>
</tbody>
</table>
<p><strong>时间效率对比</strong></p>
<p>我们使用以下PHP代码，计算上面的 3 个随机密码生成函数生成 6 位密码的运行时间，进而对他们的时间效率进行一个简单的对比。</p>
<table border="0" cellspacing="0" cellpadding="6" width="95%" align="center">
<tbody>
<tr>
<td bgcolor="#ddedfb">&lt;?php<br />
function getmicrotime()<br />
{<br />
    list($usec, $sec) = explode(&#8221; &#8220;,microtime());<br />
    return ((float)$usec + (float)$sec);<br />
}<br />
 <br />
// 记录开始时间<br />
$time_start = getmicrotime();<br />
   <br />
// 这里放要执行的PHP代码，如:<br />
// echo create_password(6);<br />
 <br />
// 记录结束时间<br />
$time_end = getmicrotime();<br />
$time = $time_end &#8211; $time_start;</p>
<p> // 输出运行总时间<br />
echo &#8220;执行时间 $time seconds&#8221;;<br />
?&gt;</td>
</tr>
</tbody>
</table>
<p><strong>最终得出的结果是</strong>：</p>
<p>方法一：9.8943710327148E-5 秒</p>
<p>方法二：9.6797943115234E-5 秒</p>
<p>方法三：0.00017499923706055 秒</p>
<p>可以看出方法一和方法二的执行时间都差不多，而方法三的运行时间稍微长了点。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=570</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP 循环</title>
		<link>http://www.woduba.com/?p=567</link>
		<comments>http://www.woduba.com/?p=567#comments</comments>
		<pubDate>Sat, 21 Aug 2010 03:23:49 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[循环]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=567</guid>
		<description><![CDATA[循环 在您编写代码时，您经常需要让相同的代码块运行很多次。您可以在代码中使用循环语句来完成这个任务。 在 PHP 中，我们可以使用下列循环语句： while 只要指定的条件成立，则循环执行代码块 do&#8230;while 首先执行一次代码块，然后在指定的条件成立时重复这个循环 for 循环执行代码块指定的次数 foreach 根据数组中每个元素来循环代码块 while 语句 只要指定的条件成立，while 语句将重复执行代码块。 语法 while (condition) code to be executed; 例子 下面的例子示范了一个循环，只要变量 i 小于或等于 5，代码就会一直循环执行下去。循环每循环一次，变量就会递增 1： &#60;html&#62; &#60;body&#62; &#60;?php $i=1; while($i&#60;=5) { echo "The number is " . $i . "&#60;br /&#62;"; $i++; } ?&#62; &#60;/body&#62; &#60;/html&#62; do&#8230;while 语句 do&#8230;while 语句会至少执行一次代码 [...]]]></description>
			<content:encoded><![CDATA[<div>
<h2>循环</h2>
<p>在您编写代码时，您经常需要让相同的代码块运行很多次。您可以在代码中使用循环语句来完成这个任务。</p>
<p>在 PHP 中，我们可以使用下列循环语句：</p>
<dl>
<dt>while </dt>
<dd>只要指定的条件成立，则循环执行代码块 </dd>
<dt>do&#8230;while </dt>
<dd>首先执行一次代码块，然后在指定的条件成立时重复这个循环 </dd>
<dt>for </dt>
<dd>循环执行代码块指定的次数 </dd>
<dt>foreach </dt>
<dd>根据数组中每个元素来循环代码块 </dd>
<dd><span id="more-567"></span></dd>
</dl>
</div>
<div>
<h2>while 语句</h2>
<p><em>只要指定的条件成立</em>，while 语句将重复执行代码块。</p>
<h3>语法</h3>
<pre>while (condition)
code to be executed;</pre>
<h3>例子</h3>
<p>下面的例子示范了一个循环，只要变量 i 小于或等于 5，代码就会一直循环执行下去。循环每循环一次，变量就会递增 1：</p>
<pre>&lt;html&gt;
&lt;body&gt;

&lt;?php
$i=1;
while($i&lt;=5)
  {
  echo "The number is " . $i . "&lt;br /&gt;";
  $i++;
  }
?&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<div>
<h2>do&#8230;while 语句</h2>
<p>do&#8230;while 语句会<em>至少执行一次代码</em> &#8211; 然后，<em>只要条件成立</em>，就会重复进行循环。</p>
<h3>语法</h3>
<pre>do
{
code to be executed;
}
while (condition);</pre>
<h3>例子</h3>
<p>下面的例子将对 i 的值进行一次累加，然后，只要 i 小于 5 的条件成立，就会继续累加下去：</p>
<pre>&lt;html&gt;
&lt;body&gt;

&lt;?php
$i=0;
do
  {
  $i++;
  echo "The number is " . $i . "&lt;br /&gt;";
  }
while ($i&lt;5);
?&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<div>
<h2>for 语句</h2>
<p>如果您已经确定了代码块的重复执行次数，则可以使用 for 语句。</p>
<h3>语法</h3>
<pre>for (initialization; condition; increment)
{
  code to be executed;
}</pre>
<p>注释：for 语句有三个参数。第一个参数初始化变量，第二个参数保存条件，第三个参数包含执行循环所需的增量。如果 initialization 或 increment 参数中包括了多个变量，需要用逗号进行分隔。而条件必须计算为 true 或者 false。</p>
<h3>例子</h3>
<p>下面的例子会把文本 &#8220;Hello World!&#8221; 显示 5 次：</p>
<pre>&lt;html&gt;
&lt;body&gt;

&lt;?php
for ($i=1; $i&lt;=5; $i++)
{
  echo "Hello World!&lt;br /&gt;";
}
?&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
<div>
<h2>foreach 语句</h2>
<p>foreach 语句用于循环遍历数组。</p>
<p>每进行一次循环，当前数组元素的值就会被赋值给 value 变量（数组指针会逐一地移动） &#8211; 以此类推。</p>
<h3>语法</h3>
<pre>foreach (array as value)
{
    code to be executed;
}</pre>
<h3>例子</h3>
<p>下面的例子示范了一个循环，这个循环可以输出给定数组的值：</p>
<pre>&lt;html&gt;
&lt;body&gt;

&lt;?php
$arr=array("one", "two", "three");

foreach ($arr as $value)
{
  echo "Value: " . $value . "&lt;br /&gt;";
}
?&gt;

&lt;/body&gt;
&lt;/html&gt;</pre>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=567</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MySQL四舍五入的实现</title>
		<link>http://www.woduba.com/?p=564</link>
		<comments>http://www.woduba.com/?p=564#comments</comments>
		<pubDate>Fri, 20 Aug 2010 07:12:13 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=564</guid>
		<description><![CDATA[文章主要描述的是MySQL四舍五入的实际应用，以及在其实际操作中的值得我们大家注意的事项与其实际应用代码的描述，以下就是文章的主要内容的详细描述，望大家在浏览之后会对其有更深的了解。 FLOOR(X)   返回不大于X的最大整数值。 MySQL&#62; select FLOOR(1.23);   -&#62; 1   MySQL&#62; select FLOOR(-1.23);   -&#62; -2  注意返回值被变换为一个BIGINT！ CEILING(X)   返回不小于X的最小整数值。 MySQL&#62; select CEILING(1.23);   -&#62; 2   MySQL&#62; select CEILING(-1.23);   -&#62; -1  注意返回值被变换为一个BIGINT！ ROUND(X)   返回参数X的MySQL四舍五入的一个整数。 MySQL&#62; select ROUND(-1.23);   -&#62; -1   MySQL&#62; select ROUND(-1.58);   -&#62; -2   MySQL&#62; select ROUND(1.58);   -&#62; 2  注意返回值被变换为一个BIGINT! ROUND(X,D)   返回参数X的四舍五入的有D为小数的一个数字。如果D为0，结果将没有小数点或小数部分。 MySQL&#62; select ROUND(1.298, 1);   -&#62; 1.3   MySQL&#62; select ROUND(1.298, 0);   -&#62; 1  注意返回值被变换为一个BIGINT!]]></description>
			<content:encoded><![CDATA[<p>文章主要描述的是MySQL四舍五入的实际应用，以及在其实际操作中的值得我们大家注意的事项与其实际应用代码的描述，以下就是文章的主要内容的详细描述，望大家在浏览之后会对其有更深的了解。</p>
<pre>
<li>FLOOR(X)  </li>
</pre>
<p>返回不大于X的最大整数值。</p>
<pre>
<li>MySQL&gt; select FLOOR(1.23);  </li>
<li>-&gt; 1  </li>
<li>MySQL&gt; select FLOOR(-1.23);  </li>
<li>-&gt; -2 </li>
</pre>
<p>注意返回值被变换为一个BIGINT！</p>
<pre>
<li>CEILING(X)  </li>
</pre>
<p>返回不小于X的最小整数值。</p>
<pre>
<li>MySQL&gt; select CEILING(1.23);  </li>
<li>-&gt; 2  </li>
<li>MySQL&gt; select CEILING(-1.23);  </li>
<li>-&gt; -1 </li>
</pre>
<p>注意返回值被变换为一个BIGINT！</p>
<pre>
<li>ROUND(X)  </li>
</pre>
<p>返回参数X的MySQL四舍五入的一个整数。</p>
<pre>
<li>MySQL&gt; select ROUND(-1.23);  </li>
<li>-&gt; -1  </li>
<li>MySQL&gt; select ROUND(-1.58);  </li>
<li>-&gt; -2  </li>
<li>MySQL&gt; select ROUND(1.58);  </li>
<li>-&gt; 2 </li>
</pre>
<p>注意返回值被变换为一个BIGINT!</p>
<pre>
<li>ROUND(X,D)  </li>
</pre>
<p>返回参数X的四舍五入的有D为小数的一个数字。如果D为0，结果将没有小数点或小数部分。</p>
<pre>
<li>MySQL&gt; select ROUND(1.298, 1);  </li>
<li>-&gt; 1.3  </li>
<li>MySQL&gt; select ROUND(1.298, 0);  </li>
<li>-&gt; 1 </li>
</pre>
<p>注意返回值被变换为一个BIGINT!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=564</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP图片类  可显示多种图形报表</title>
		<link>http://www.woduba.com/?p=562</link>
		<comments>http://www.woduba.com/?p=562#comments</comments>
		<pubDate>Thu, 19 Aug 2010 07:23:50 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[图形报表]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=562</guid>
		<description><![CDATA[&#60;?php //图类 class ImageReport{ var $X;//图片大小X轴 var $Y;//图片大小Y轴 var $R;//背影色R值 var $G;//&#8230;G. var $B;//&#8230;B. var $TRANSPARENT;//是否透明1或0 var $IMAGE;//图片对像 //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- var $ARRAYSPLIT;//指定用于分隔数值的符号 var $ITEMARRAY;//数值 var $REPORTTYPE;//图表类型,1为竖柱形2为横柱形3为折线形 var $BORDER;//距离 //&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- var $FONTSIZE;//字体大小 var $FONTCOLOR;//字体颜色 var $numX = 1;//X轴起始刻度值 var $stepX = 1;//X轴每一个刻度间隔值 //&#8212;&#8212;&#8211;参数设置函数 function setImage($SizeX,$SizeY,$R,$G,$B,$Transparent){    $this-&#62;X=$SizeX;      $this-&#62;Y=$SizeY;      $this-&#62;R=$R;      $this-&#62;G=$G;      $this-&#62;B=$B;      $this-&#62;TRANSPARENT=$Transparent;   [...]]]></description>
			<content:encoded><![CDATA[<div id="app-share-content">&lt;?php //图类<br />
class ImageReport{<br />
var $X;//图片大小X轴<br />
var $Y;//图片大小Y轴<br />
var $R;//背影色R值<br />
var $G;//&#8230;G.<br />
var $B;//&#8230;B.<br />
var $TRANSPARENT;//是否透明1或0<br />
var $IMAGE;//图片对像<br />
//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
var $ARRAYSPLIT;//指定用于分隔数值的符号<br />
var $ITEMARRAY;//数值<br />
var $REPORTTYPE;//图表类型,1为竖柱形2为横柱形3为折线形<br />
var $BORDER;//距离<br />
//&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
var $FONTSIZE;//字体大小<br />
var $FONTCOLOR;//字体颜色</p>
<p>var $numX = 1;//X轴起始刻度值<br />
var $stepX = 1;//X轴每一个刻度间隔值</p>
<p>//&#8212;&#8212;&#8211;参数设置函数<br />
function setImage($SizeX,$SizeY,$R,$G,$B,$Transparent){<br />
   $this-&gt;X=$SizeX;  <br />
   $this-&gt;Y=$SizeY;  <br />
   $this-&gt;R=$R;  <span id="more-562"></span><br />
   $this-&gt;G=$G;  <br />
   $this-&gt;B=$B;  <br />
   $this-&gt;TRANSPARENT=$Transparent;  <br />
}  <br />
function setItem($ArraySplit,$ItemArray,$ReportType,$Border){  <br />
   $this-&gt;ARRAYSPLIT=$ArraySplit;  <br />
   $this-&gt;ITEMARRAY=$ItemArray;  <br />
   $this-&gt;REPORTTYPE=$ReportType;  <br />
   $this-&gt;BORDER=$Border;  <br />
}  <br />
function setFont($FontSize){  <br />
   $this-&gt;FONTSIZE=$FontSize;  <br />
}  <br />
//X轴刻度值设置<br />
function setX($numX = 1, $stepX = 1){<br />
   $this-&gt;numX = $numX;<br />
   $this-&gt;stepX = $stepX;<br />
}<br />
//&#8212;&#8212;&#8212;&#8212;&#8212;-主体  <br />
function PrintReport(){<br />
    //建立画布大小  <br />
    $this-&gt;IMAGE=ImageCreate($this-&gt;X,$this-&gt;Y);  <br />
    //设定画布背景色  <br />
    $background=ImageColorAllocate($this-&gt;IMAGE,$this-&gt;R,$this-&gt;G,$this-&gt;B);  <br />
    if($this-&gt;TRANSPARENT==&#8221;1&#8243;){  <br />
     //背影透明  <br />
     Imagecolortransparent($this-&gt;IMAGE,$background);  <br />
    }else{  <br />
     //如不要透明时可填充背景色  <br />
     ImageFilledRectangle($this-&gt;IMAGE,0,0,$this-&gt;X,$this-&gt;Y,$background);  <br />
    }  <br />
    //参数字体文小及颜色  <br />
    $this-&gt;FONTCOLOR=ImageColorAllocate($this-&gt;IMAGE,255-$this-&gt;R,255-$this-&gt;G,255-$this-&gt;B);  <br />
    Switch ($this-&gt;REPORTTYPE){  <br />
     case &#8220;0&#8243;:  <br />
      break;  <br />
     case &#8220;1&#8243;:  <br />
      $this-&gt;imageColumnS();  <br />
      break;<br />
     case &#8220;2&#8243;:<br />
      $this-&gt;imageColumnH();  <br />
      break;  <br />
     case &#8220;3&#8243;:  <br />
      $this-&gt;imageLine();  <br />
      break;<br />
     case &#8220;4&#8243;:  <br />
      $this-&gt;imageCircle();  <br />
      break;    <br />
    }  <br />
    $this-&gt;printXY();  <br />
    $this-&gt;printAll();  <br />
}  <br />
//&#8212;&#8212;&#8212;&#8211;打印XY坐标轴  <br />
function printXY(){  <br />
    $rulerY = $rulerX = &#8220;&#8221;;<br />
    //画XY坐标轴*/  <br />
    $color=ImageColorAllocate($this-&gt;IMAGE,255-$this-&gt;R,255-$this-&gt;G,255-$this-&gt;B);  <br />
    $xx=$this-&gt;X/10;  <br />
    $yy=$this-&gt;Y-$this-&gt;Y/10;<br />
    ImageLine($this-&gt;IMAGE,$this-&gt;BORDER,$this-&gt;BORDER,$this-&gt;BORDER,$this-&gt;Y-$this-&gt;BORDER,$color);//X轴  <br />
    ImageLine($this-&gt;IMAGE,$this-&gt;BORDER,$this-&gt;Y-$this-&gt;BORDER,$this-&gt;X-$this-&gt;BORDER,$this-&gt;Y-$this-&gt;BORDER,$color);//y轴  <br />
    imagestring($this-&gt;IMAGE, $this-&gt;FONTSIZE, $this-&gt;BORDER-2, $this-&gt;Y-$this-&gt;BORDER+5, &#8220;0&#8243;, $color);<br />
    //Y轴上刻度  <br />
    $rulerY=$this-&gt;Y-$this-&gt;BORDER;  <br />
    $i = 0;<br />
    while($rulerY&gt;$this-&gt;BORDER*2){  <br />
     $rulerY=$rulerY-$this-&gt;BORDER;  <br />
     ImageLine($this-&gt;IMAGE,$this-&gt;BORDER,$rulerY,$this-&gt;BORDER-2,$rulerY,$color);  <br />
    <br />
     if($this-&gt;REPORTTYPE == 2){//横柱图<br />
      imagestring($this-&gt;IMAGE, $this-&gt;FONTSIZE, $this-&gt;BORDER-10, $rulerY-2-$this-&gt;BORDER*($i+.5), $this-&gt;numX, $color);<br />
      $this-&gt;numX += $this-&gt;stepX;<br />
     }<br />
     $i++;<br />
    }  <br />
    //X轴上刻度  <br />
    $rulerX=$rulerX+$this-&gt;BORDER;  <br />
    $i = 0;<br />
    while($rulerX&lt;($this-&gt;X-$this-&gt;BORDER*2)){  <br />
     $rulerX=$rulerX+$this-&gt;BORDER;  <br />
     //ImageLine($this-&gt;IMAGE,$this-&gt;BORDER,10,$this-&gt;BORDER+10,10,$color);  <br />
     ImageLine($this-&gt;IMAGE,$rulerX,$this-&gt;Y-$this-&gt;BORDER,$rulerX,$this-&gt;Y-$this-&gt;BORDER+2,$color);  <br />
    <br />
     //刻度值<br />
     if($this-&gt;REPORTTYPE == 1){//竖柱图<br />
      imagestring($this-&gt;IMAGE, $this-&gt;FONTSIZE, $rulerX-2+$this-&gt;BORDER*($i+.5), $this-&gt;Y-$this-&gt;BORDER+5, $this-&gt;numX, $color);<br />
      $this-&gt;numX += $this-&gt;stepX;<br />
     }else if($this-&gt;REPORTTYPE == 3){//折线图<br />
      imagestring($this-&gt;IMAGE, $this-&gt;FONTSIZE, $rulerX-2, $this-&gt;Y-$this-&gt;BORDER+5, $this-&gt;numX, $color);<br />
      $this-&gt;numX += $this-&gt;stepX;<br />
     }<br />
     $i++;<br />
    }  <br />
}  </p>
<p>//&#8212;&#8212;&#8212;&#8212;&#8211;竖柱形图  <br />
function imageColumnS(){  <br />
    $item_array=Split($this-&gt;ARRAYSPLIT,$this-&gt;ITEMARRAY);  <br />
    $num=Count($item_array);  <br />
    $item_max=0;  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     $item_max=Max($item_max,$item_array[$i]);<br />
    }<br />
    $xx=$this-&gt;BORDER*2;  <br />
    //画柱形图  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     srand((double)microtime()*1000000);<br />
     if($this-&gt;R!=255 &amp;&amp; $this-&gt;G!=255 &amp;&amp; $this-&gt;B!=255){  <br />
      $R=Rand($this-&gt;R,200);  <br />
      $G=Rand($this-&gt;G,200);  <br />
      $B=Rand($this-&gt;B,200);  <br />
     }else{  <br />
      $R=Rand(50,200);  <br />
      $G=Rand(50,200);  <br />
      $B=Rand(50,200);  <br />
     }<br />
     $color=ImageColorAllocate($this-&gt;IMAGE,$R,$G,$B);  <br />
     //柱形高度  <br />
     $height=($this-&gt;Y-$this-&gt;BORDER)-($this-&gt;Y-$this-&gt;BORDER*2)*($item_array[$i]/$item_max);  <br />
     ImageFilledRectangle($this-&gt;IMAGE,$xx,$height,$xx+$this-&gt;BORDER,$this-&gt;Y-$this-&gt;BORDER,$color);  <br />
     ImageString($this-&gt;IMAGE,$this-&gt;FONTSIZE,$xx,$height-$this-&gt;BORDER,$item_array[$i],$this-&gt;FONTCOLOR);  <br />
     //用于间隔  <br />
     $xx=$xx+$this-&gt;BORDER*2;  <br />
    }  <br />
}  <br />
//&#8212;&#8212;&#8212;&#8211;横柱形图  <br />
function imageColumnH(){  <br />
    $item_array=Split($this-&gt;ARRAYSPLIT,$this-&gt;ITEMARRAY);  <br />
    $num=Count($item_array);  <br />
    $item_max=0;  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     $item_max=Max($item_max,$item_array[$i]);<br />
    }<br />
    $yy=$this-&gt;Y-$this-&gt;BORDER*2;  <br />
    //画柱形图  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     srand((double)microtime()*1000000);<br />
     if($this-&gt;R!=255 &amp;&amp; $this-&gt;G!=255 &amp;&amp; $this-&gt;B!=255){  <br />
      $R=Rand($this-&gt;R,200);  <br />
      $G=Rand($this-&gt;G,200);  <br />
      $B=Rand($this-&gt;B,200);  <br />
     }else{  <br />
      $R=Rand(50,200);  <br />
      $G=Rand(50,200);  <br />
      $B=Rand(50,200);  <br />
     }  <br />
     $color=ImageColorAllocate($this-&gt;IMAGE,$R,$G,$B);  <br />
     //柱形长度  <br />
     $leight=($this-&gt;X-$this-&gt;BORDER*2)*($item_array[$i]/$item_max);  <br />
     $leight = $leight &lt; $this-&gt;BORDER ? $this-&gt;BORDER : $leight;<br />
     ImageFilledRectangle($this-&gt;IMAGE,$this-&gt;BORDER,$yy-$this-&gt;BORDER,$leight,$yy,$color);  <br />
     ImageString($this-&gt;IMAGE,$this-&gt;FONTSIZE,$leight+2,$yy-$this-&gt;BORDER,$item_array[$i],$this-&gt;FONTCOLOR);  <br />
     //用于间隔  <br />
     $yy=$yy-$this-&gt;BORDER*2;  <br />
    }  <br />
}<br />
//&#8212;&#8212;&#8212;&#8212;&#8211;折线图  <br />
function imageLine(){  <br />
    $item_array=Split($this-&gt;ARRAYSPLIT,$this-&gt;ITEMARRAY);  <br />
    $num=Count($item_array);  <br />
    $item_max=0;  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     $item_max=Max($item_max,$item_array[$i]);<br />
    }<br />
    $xx=$this-&gt;BORDER;  <br />
    //画柱形图  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     srand((double)microtime()*1000000);<br />
     if($this-&gt;R!=255 &amp;&amp; $this-&gt;G!=255 &amp;&amp; $this-&gt;B!=255){  <br />
      $R=Rand($this-&gt;R,200);  <br />
      $G=Rand($this-&gt;G,200);  <br />
      $B=Rand($this-&gt;B,200);  <br />
     }else{  <br />
      $R=Rand(50,200);  <br />
      $G=Rand(50,200);  <br />
      $B=Rand(50,200);  <br />
     }  <br />
     $color=ImageColorAllocate($this-&gt;IMAGE,$R,$G,$B);  <br />
     //柱形高度  <br />
     $height_now=($this-&gt;Y-$this-&gt;BORDER)-($this-&gt;Y-$this-&gt;BORDER*2)*($item_array[$i]/$item_max);  <br />
     if($i!=&#8221;0&#8243;)<br />
      ImageLine($this-&gt;IMAGE,$xx-$this-&gt;BORDER,$height_next,$xx,$height_now,$color);  <br />
      <br />
     ImageString($this-&gt;IMAGE,$this-&gt;FONTSIZE,$xx+2,$height_now-$this-&gt;BORDER/2,$item_array[$i],$this-&gt;FONTCOLOR);  <br />
     $height_next=$height_now;  <br />
     //用于间隔  <br />
     $xx=$xx+$this-&gt;BORDER;  <br />
    }  <br />
}  <br />
//&#8212;&#8212;&#8212;&#8212;&#8211;饼状图<br />
function imageCircle(){<br />
    $total = 0;<br />
    $item_array=Split($this-&gt;ARRAYSPLIT,$this-&gt;ITEMARRAY);  <br />
    $num=Count($item_array);  <br />
    $item_max=0;  <br />
    for ($i=0;$i&lt;$num;$i++){<br />
     $item_max=Max($item_max,$item_array[$i]);<br />
     $total += $item_array[$i];<br />
    }<br />
    $yy=$this-&gt;Y-$this-&gt;BORDER*2;  <br />
   <br />
    //画饼状图的阴影部分  <br />
    $e=0;<br />
    for ($i=0;$i&lt;$num;$i++){<br />
     srand((double)microtime()*1000000);<br />
     if($this-&gt;R!=255 &amp;&amp; $this-&gt;G!=255 &amp;&amp; $this-&gt;B!=255){  <br />
      $R=Rand($this-&gt;R,200);  <br />
      $G=Rand($this-&gt;G,200);  <br />
      $B=Rand($this-&gt;B,200);  <br />
     }else{  <br />
      $R=Rand(50,200);  <br />
      $G=Rand(50,200);  <br />
      $B=Rand(50,200);  <br />
     }<br />
     $s=$e;<br />
     $leight=$item_array[$i]/$total*360;<br />
     $e=$s+$leight;<br />
     $color=ImageColorAllocate($this-&gt;IMAGE,$R,$G,$B);<br />
     $colorarray[$i]=$color;  <br />
     //画圆   <br />
     for ($j = 90; $j &gt; 70; $j&#8211;) imagefilledarc($this-&gt;IMAGE, 110, $j, 200, 100, $s, $e, $color, IMG_ARC_PIE);  <br />
      //imagefilledarc($this-&gt;IMAGE, 110, 70, 200, 100, $s, $e, $color, IMG_ARC_PIE);  <br />
      //ImageFilledRectangle($this-&gt;IMAGE,$this-&gt;BORDER,$yy-$this-&gt;BORDER,$leight,$yy,$color);  <br />
      //ImageString($this-&gt;IMAGE,$this-&gt;FONTSIZE,$leight+2,$yy-$this-&gt;BORDER,$item_array[$i],$this-&gt;FONTCOLOR);  <br />
      //用于间隔  <br />
      $yy=$yy-$this-&gt;BORDER*2;  <br />
    }<br />
   <br />
    //画饼状图的表面部分<br />
    $e=0;<br />
    for ($i=0;$i&lt;$num;$i++){<br />
     srand((double)microtime()*1000000);<br />
     if($this-&gt;R!=255 &amp;&amp; $this-&gt;G!=255 &amp;&amp; $this-&gt;B!=255){  <br />
      $R=Rand($this-&gt;R,200);  <br />
      $G=Rand($this-&gt;G,200);  <br />
      $B=Rand($this-&gt;B,200);  <br />
     }else{  <br />
      $R=Rand(50,200);  <br />
      $G=Rand(50,200);  <br />
      $B=Rand(50,200);  <br />
     }<br />
     $s=$e;<br />
     $leight=$item_array[$i]/$total*360;<br />
     $e=$s+$leight;<br />
     //$color=$colorarray[$i];<br />
     $color=ImageColorAllocate($this-&gt;IMAGE,$R,$G,$B);  <br />
     //画圆   <br />
     //for ($j = 90; $j &gt; 70; $j&#8211;) imagefilledarc($this-&gt;IMAGE, 110, $j, 200, 100, $s, $e, $color, IMG_ARC_PIE);  <br />
     imagefilledarc($this-&gt;IMAGE, 110, 70, 200, 100, $s, $e, $color, IMG_ARC_PIE);  <br />
    }  <br />
}  <br />
//&#8212;&#8212;&#8212;&#8212;&#8211;完成打印图形  <br />
function printAll(){  <br />
   ImagePNG($this-&gt;IMAGE);<br />
   ImageDestroy($this-&gt;IMAGE);  <br />
}  <br />
//&#8212;&#8212;&#8212;&#8212;&#8211;调试  <br />
function debug(){  <br />
   echo &#8220;X:&#8221;.$this-&gt;X.&#8221;&lt;br/&gt;Y:&#8221;.$this-&gt;Y;  <br />
   echo &#8220;&lt;br/&gt;BORDER:&#8221;.$this-&gt;BORDER;  <br />
   $item_array=split($this-&gt;ARRAYSPLIT,$this-&gt;ITEMARRAY);  <br />
   $num=Count($item_array);  <br />
   echo &#8220;&lt;br/&gt;数值个数:&#8221;.$num.&#8221;&lt;br/&gt;数值:&#8221;;  <br />
   for ($i=0;$i&lt;$num;$i++){<br />
    echo &#8220;&lt;br/&gt;&#8221;.$item_array[$i];  <br />
   }  <br />
}  <br />
}  <br />
//$report-&gt;debug();//调式之用<br />
/*<br />
Header( &#8220;Content-type:image/png&#8221;);<br />
$report=new ImageReport;<br />
$report-&gt;setImage(600,500,255,255,255,1);//参数(长,高,背影色R,G,B,是否透明1或0)  <br />
$temparray=&#8221;0,260,400,124,48,720,122,440,475&#8243;;//数值,用指定符号隔开  <br />
$report-&gt;setItem(&#8216;,&#8217;,$temparray,3,23);//参数(分隔数值的指定符号,数值变量,样式1为竖柱图2为横柱图3为折线图4为饼图,距离)  <br />
$report-&gt;setFont(1);//字体大小1-10  <br />
//$report-&gt;setX(1,1);//设置X轴刻度值(起始刻度值=1，刻度间隔值=1)<br />
$report-&gt;PrintReport();<br />
*/<br />
?&gt;</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=562</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linxu top命令解析</title>
		<link>http://www.woduba.com/?p=560</link>
		<comments>http://www.woduba.com/?p=560#comments</comments>
		<pubDate>Thu, 19 Aug 2010 02:09:21 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[linxu]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=560</guid>
		<description><![CDATA[top命令是Linux下常用的性能分析工具，能够实时显示系统中各个进程的资源占用状况，类似于Windows的任务管理器。下面详细介绍它的使用方法。 top &#8211; 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60, 0.48 Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0 zombie Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0% hi,  0.0% si Mem:    191272k total,   173656k used,    17616k free,    22052k buffers Swap:   192772k total,        0k used,   192772k free,   [...]]]></description>
			<content:encoded><![CDATA[<p>top命令是Linux下常用的性能分析工具，能够实时显示系统中各个进程的资源占用状况，类似于Windows的任务管理器。下面详细介绍它的使用方法。<br />
top &#8211; 01:06:48 up  1:22,  1 user,  load average: 0.06, 0.60, 0.48<br />
Tasks:  29 total,   1 running,  28 sleeping,   0 stopped,   0 zombie<br />
Cpu(s):  0.3% us,  1.0% sy,  0.0% ni, 98.7% id,  0.0% wa,  0.0% hi,  0.0% si<br />
Mem:    191272k total,   173656k used,    17616k free,    22052k buffers<br />
Swap:   192772k total,        0k used,   192772k free,   123988k cached</p>
<p>   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND<br />
  1379 root      16   0  7976 2456 1980 S  0.7  1.3   0:11.03 sshd<br />
14704 root      16   0  2128  980  796 R  0.7  0.5   0:02.72 top<br />
     1 root      16   0  1992  632  544 S  0.0  0.3   0:00.90 init<br />
     2 root      34  19     0    0    0 S  0.0  0.0   0:00.00 ksoftirqd/0<br />
     3 root      RT   0     0    0    0 S  0.0  0.0   0:00.00 watchdog/0<br />
统计信息区<br />
前五行是系统整体的统计信息。第一行是任务队列信息，同 uptime 命令的执行结果。其内容如下：<br />
01:06:48当前时间<br />
up 1:22系统运行时间，格式为时:分<span id="more-560"></span><br />
1 user当前登录用户数<br />
load average: 0.06, 0.60, 0.48系统负载，即任务队列的平均长度。<br />
三个数值分别为 1分钟、5分钟、15分钟前到现在的平均值。</p>
<p>第二、三行为进程和CPU的信息。当有多个CPU时，这些内容可能会超过两行。内容如下：<br />
Tasks: 29 total进程总数<br />
1 running正在运行的进程数<br />
28 sleeping睡眠的进程数<br />
0 stopped停止的进程数<br />
0 zombie僵尸进程数<br />
Cpu(s): 0.3% us用户空间占用CPU百分比<br />
1.0% sy内核空间占用CPU百分比<br />
0.0% ni用户进程空间内改变过优先级的进程占用CPU百分比<br />
98.7% id空闲CPU百分比<br />
0.0% wa等待输入输出的CPU时间百分比<br />
0.0% hi<br />
0.0% si</p>
<p>最后两行为内存信息。内容如下：<br />
Mem: 191272k total物理内存总量<br />
173656k used使用的物理内存总量<br />
17616k free空闲内存总量<br />
22052k buffers用作内核缓存的内存量<br />
Swap: 192772k total交换区总量<br />
0k used使用的交换区总量<br />
192772k free空闲交换区总量<br />
123988k cached缓冲的交换区总量。<br />
内存中的内容被换出到交换区，而后又被换入到内存，但使用过的交换区尚未被覆盖，<br />
该数值即为这些内容已存在于内存中的交换区的大小。<br />
相应的内存再次被换出时可不必再对交换区写入。</p>
<p>进程信息区<br />
统计信息区域的下方显示了各个进程的详细信息。首先来认识一下各列的含义。<br />
序号列名含义<br />
aPID进程id<br />
bPPID父进程id<br />
cRUSERReal user name<br />
dUID进程所有者的用户id<br />
eUSER进程所有者的用户名<br />
fGROUP进程所有者的组名<br />
gTTY启动进程的终端名。不是从终端启动的进程则显示为 ?<br />
hPR优先级<br />
iNInice值。负值表示高优先级，正值表示低优先级<br />
jP最后使用的CPU，仅在多CPU环境下有意义<br />
k%CPU上次更新到现在的CPU时间占用百分比<br />
lTIME进程使用的CPU时间总计，单位秒<br />
mTIME+进程使用的CPU时间总计，单位1/100秒<br />
n%MEM进程使用的物理内存百分比<br />
oVIRT进程使用的虚拟内存总量，单位kb。VIRT=SWAP+RES<br />
pSWAP进程使用的虚拟内存中，被换出的大小，单位kb。<br />
qRES进程使用的、未被换出的物理内存大小，单位kb。RES=CODE+DATA<br />
rCODE可执行代码占用的物理内存大小，单位kb<br />
sDATA可执行代码以外的部分(数据段+栈)占用的物理内存大小，单位kb<br />
tSHR共享内存大小，单位kb<br />
unFLT页面错误次数<br />
vnDRT最后一次写入到现在，被修改过的页面数。<br />
wS进程状态。<br />
D=不可中断的睡眠状态<br />
R=运行<br />
S=睡眠<br />
T=跟踪/停止<br />
Z=僵尸进程<br />
xCOMMAND命令名/命令行<br />
yWCHAN若该进程在睡眠，则显示睡眠中的系统函数名<br />
zFlags任务标志，参考 sched.h</p>
<p>默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。</p>
<p>更改显示内容<br />
通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表，按 a-z 即可显示或隐藏对应的列，最后按回车键确定。<br />
按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动，而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定。<br />
按大写的 F 或 O 键，然后按 a-z 可以将进程按照相应的列进行排序。而大写的 R 键可以将当前的排序倒转。<br />
命令使用<br />
1． 工具（命令）名称<br />
top<br />
2．工具（命令）作用<br />
显示系统当前的进程和其他状况； top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序；而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.<br />
3．环境设置<br />
在Linux下使用。<br />
4．使用方法<br />
4．1使用格式<br />
top [-] [d] [p] [q] [c] [C] [S] [s]  [n]<br />
4．2参数说明<br />
 d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。<br />
 p 通过指定监控进程ID来仅仅监控某个进程的状态。<br />
 q该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限，那么top将以尽可能高的优先级运行。<br />
 S 指定累计模式<br />
 s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。<br />
 i  使top不显示任何闲置或者僵死进程。<br />
 c  显示整个命令行而不只是显示命令名<br />
4.3其他<br />
　　下面介绍在top命令执行过程中可以使用的一些交互命令。从使用角度来看，熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的，如果在命令行选项中使用了s选项，则可能其中一些命令会被屏蔽掉。<br />
　　Ctrl+L 擦除并且重写屏幕。<br />
　　h或者? 显示帮助画面，给出一些简短的命令总结说明。<br />
　　k 终止一个进程。系统将提示用户输入需要终止的进程PID，以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号；如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽。<br />
　　i 忽略闲置和僵死进程。这是一个开关式命令。<br />
　　q 退出程序。<br />
　　r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低，反之则可以使该进程拥有更高的优先权。默认值是10。<br />
　　S 切换到累计模式。<br />
　　s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间，单位为s。如果有小数，就换算成m s。输入0值则系统将不断刷新，默认值是5 s。需要注意的是如果设置太小的时间，很可能会引起不断刷新，从而根本来不及看清显示的情况，而且系统负载也会大大增加。<br />
　　f或者F 从当前显示中添加或者删除项目。<br />
　　o或者O 改变显示项目的顺序。<br />
　　l 切换显示平均负载和启动时间信息。<br />
　　m 切换显示内存信息。<br />
　　t 切换显示进程和CPU状态信息。<br />
　　c 切换显示命令名称和完整命令行。<br />
　　M 根据驻留内存大小进行排序。<br />
　　P 根据CPU使用百分比大小进行排序。<br />
　　T 根据时间/累计时间进行排序。<br />
    W 将当前设置写入~/.toprc文件中。这是写top配置文件的推荐方法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=560</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>memcached内存释放问题</title>
		<link>http://www.woduba.com/?p=558</link>
		<comments>http://www.woduba.com/?p=558#comments</comments>
		<pubDate>Tue, 17 Aug 2010 14:54:53 +0000</pubDate>
		<dc:creator>请叫我可爱熊</dc:creator>
				<category><![CDATA[技术杂文]]></category>
		<category><![CDATA[memcached]]></category>
		<category><![CDATA[内存释放]]></category>

		<guid isPermaLink="false">http://www.woduba.com/?p=558</guid>
		<description><![CDATA[今天观察系统memcached内存使用情况时突然发现从2010年1月19日开始，memcached内存使用量呈不断上升趋势，短短的几天由原来的几M长到了80M，memcached开的最大内存为128M，照这个速度，春节期间肯定就满了，为什么呢？      查看1月19日的升级记录，发现当天的确对系统进行了升级，主要内容是将session由数据库管理改为由memcached管理，但是程序中设置session两小时不活动即自动失效，为什么内存没有释放的迹象呢？在网上查找了一些资料发现，原来memcached缓存定时失效以及采用flush清空所有缓存时，memcached是不释放已占用内存的，仅仅是将这些缓存的内容标识为无效，当缓存满了（对于我们的系统说也就是缓存达到128M）后再有新信息放入缓存时，memcached会自动将无效的信息清理掉，周而复始。如果需要手动清理内存，只能使用delete。终于松了口气，系统没啥问题，我可以安心过年了。      但随即又想到了一个新问题，我如何能够了解memcached中有效信息内存的使用情况呢？这是有意义的，因为缓存达到上限后，当所有无效信息清理后仍有新信息不断存入时，memcached会依据LRU的原则清除缓存中的有效信息，对于session而言，很多有效的session会被无缘无故的清理掉，这肯定是我们不期望看到的，那么，如何能够及时监控memcached有效信息的内存使用情况呢？很遗憾，我没有在网上找到答案。      翻了翻memcached提供的函数，发现delete函数可以设置信息删除时间，譬如delete(&#8216;a&#8217;,60)意思是60秒后删除key值为a的信息，那么我把set和delete组合起来用，是不是可以做到信息到达失效时间后自动从内存中清除掉呢？做了个实验： //将批量信息注入memcached &#60;?php $memcache = new Memcache; $memcache-&#62;connect(&#8217;10.4.120.222&#8242;,21212) or die (&#8220;Could not connect&#8221;); $status = $memcache-&#62;getStats(); echo &#8220;存储前内存使用情况:&#8221;.$status['bytes'].&#8221;\n&#8221;; echo &#8220;开始存储数值&#8230; &#8230;\n&#8221;; for($i=0;$i&#60;100000;$i++) {     $memcache-&#62;set(&#8216;b&#8217;.$i,rand(1,99)); } $status = $memcache-&#62;getStats(); echo &#8220;存储结束后内存使用情况:&#8221;.$status['bytes'].&#8221;\n&#8221;; /*关闭连接*/ $memcache-&#62;close(); ?&#62; //从内存中删除 &#60;?php $memcache = new Memcache; $memcache-&#62;connect(&#8217;10.4.120.222&#8242;,21212) or die (&#8220;Could not connect&#8221;); $status = $memcache-&#62;getStats(); [...]]]></description>
			<content:encoded><![CDATA[<p>今天观察系统memcached内存使用情况时突然发现从2010年1月19日开始，memcached内存使用量呈不断上升趋势，短短的几天由原来的几M长到了80M，memcached开的最大内存为128M，照这个速度，春节期间肯定就满了，为什么呢？<br />
     查看1月19日的升级记录，发现当天的确对系统进行了升级，主要内容是将session由数据库管理改为由memcached管理，但是程序中设置session两小时不活动即自动失效，为什么内存没有释放的迹象呢？在网上查找了一些资料发现，原来memcached缓存定时失效以及采用flush清空所有缓存时，memcached是不释放已占用内存的，仅仅是将这些缓存的内容标识为无效，当缓存满了（对于我们的系统说也就是缓存达到128M）后再有新信息放入缓存时，memcached会自动将无效的信息清理掉，周而复始。如果需要手动清理内存，只能使用delete。终于松了口气，系统没啥问题，我可以安心过年了。<span id="more-558"></span><br />
     但随即又想到了一个新问题，我如何能够了解memcached中有效信息内存的使用情况呢？这是有意义的，因为缓存达到上限后，当所有无效信息清理后仍有新信息不断存入时，memcached会依据LRU的原则清除缓存中的有效信息，对于session而言，很多有效的session会被无缘无故的清理掉，这肯定是我们不期望看到的，那么，如何能够及时监控memcached有效信息的内存使用情况呢？很遗憾，我没有在网上找到答案。<br />
     翻了翻memcached提供的函数，发现delete函数可以设置信息删除时间，譬如delete(&#8216;a&#8217;,60)意思是60秒后删除key值为a的信息，那么我把set和delete组合起来用，是不是可以做到信息到达失效时间后自动从内存中清除掉呢？做了个实验：</p>
<div>//将批量信息注入memcached<br />
&lt;?php<br />
$memcache = new Memcache;<br />
$memcache-&gt;connect(&#8217;10.4.120.222&#8242;,21212) or die (&#8220;Could not connect&#8221;);</div>
<div>$status = $memcache-&gt;getStats();<br />
echo &#8220;存储前内存使用情况:&#8221;.$status['bytes'].&#8221;\n&#8221;;<br />
echo &#8220;开始存储数值&#8230; &#8230;\n&#8221;;</div>
<div>for($i=0;$i&lt;100000;$i++) {<br />
    $memcache-&gt;set(&#8216;b&#8217;.$i,rand(1,99));<br />
}</div>
<div>$status = $memcache-&gt;getStats();<br />
echo &#8220;存储结束后内存使用情况:&#8221;.$status['bytes'].&#8221;\n&#8221;;</div>
<div>/*关闭连接*/<br />
$memcache-&gt;close();<br />
?&gt;</div>
<div>//从内存中删除<br />
&lt;?php<br />
$memcache = new Memcache;<br />
$memcache-&gt;connect(&#8217;10.4.120.222&#8242;,21212) or die (&#8220;Could not connect&#8221;);</div>
<div>$status = $memcache-&gt;getStats();<br />
echo &#8220;删除前内存使用情况:&#8221;.$status['bytes'].&#8221;\n&#8221;;<br />
echo &#8220;开始删除&#8230; &#8230;\n&#8221;;</div>
<div>for($i=0;$i&lt;100000;$i++) {<br />
    $memcache-&gt;delete(&#8220;b&#8221;.$i,60);<br />
}</div>
<div>$status = $memcache-&gt;getStats();<br />
echo &#8220;delete后内存使用情况:&#8221;.$status['bytes'].&#8221;\n&#8221;;</div>
<div>/*关闭连接*/<br />
$memcache-&gt;close();<br />
?&gt;</div>
<div>    两个文件在几秒之内先后执行，很遗憾，删除脚本执行后，相应键值对立即在内存中失效了，只是间隔60秒后，失效内存被彻底释放。</div>
<div>    幸好memcached提供了stats命令，可以查询memcached内存的一些细节信息，结合memcached的创造者Brad写的名为memcached-tool的Perl脚本，编写了如下shell脚本，可以查询memcached有效内存占用、每秒访问次数以及命中率</div>
<div>#!/bin/sh<br />
mem_server=127.0.0.1<br />
mem_port=21212<br />
v_valid_size=0<br />
v_now_time=`date +%s`</div>
<div>#get time,uptime,app start time<br />
v_time=`memcached-tool $mem_server:$mem_port stats | awk &#8216;$1==&#8221;time&#8221; {printf(&#8220;%d&#8221;,$2)}&#8217;`<br />
v_uptime=`memcached-tool $mem_server:$mem_port stats | awk &#8216;$1==&#8221;uptime&#8221; {printf(&#8220;%d&#8221;,$2)}&#8217;`<br />
v_app_time=`awk -v a=$v_time -v b=$v_uptime &#8216;BEGIN{printf &#8220;%d&#8221;,a-b}&#8217;`<br />
v_cmd_get=`memcached-tool $mem_server:$mem_port stats | awk &#8216;$1==&#8221;cmd_get&#8221; {printf(&#8220;%d&#8221;,$2)}&#8217;`<br />
v_get_hits=`memcached-tool $mem_server:$mem_port stats | awk &#8216;$1==&#8221;get_hits&#8221; {printf(&#8220;%d&#8221;,$2)}&#8217;`</div>
<div>#get slab class number,item_size,count<br />
for x in ` memcached-tool $mem_server:$mem_port | awk &#8216;{if ($3 == &#8220;B&#8221;) printf(&#8220;%d,%.1f,%d\n&#8221;,$1,$2,$7);else if ($3 == &#8220;kB&#8221;) printf(&#8220;%d,%.1f,%d\n&#8221;,$1,$2*1024,$7);}&#8217; `<br />
{      <br />
    #get slabno,chunk_cnt<br />
    v_slabno=`echo $x | awk -F &#8220;,&#8221; &#8216;{print $1}&#8217;`<br />
    v_chunk_size=`echo $x | awk -F &#8220;,&#8221; &#8216;{print $2}&#8217;`<br />
    v_chunk_cnt=`echo $x | awk -F &#8220;,&#8221; &#8216;{print $3}&#8217;`<br />
   <br />
   <br />
    #get valid record<br />
    for y in ` printf &#8220;stats cachedump $v_slabno $v_chunk_cnt\nquit\n&#8221; | nc $mem_server $mem_port | awk &#8216;{gsub(/\[/,"");if ($1 == "ITEM") printf("%d,%d\n",$3,$5);}' `<br />
    {  <br />
        v_byte=`echo $y | awk -F "," '{print $1}'`<br />
        v_byte_time=`echo $y | awk -F "," '{print $2}'`<br />
        if [ "$v_byte_time" -eq "$v_app_time" ] || [ "$v_byte_time" -ge "$v_now_time" ]<br />
        then<br />
            v_valid_size=`expr $v_valid_size + $v_byte`<br />
        fi<br />
       <br />
    }<br />
}</div>
<div>printf &#8220;当前内存占用有效值为 : &#8221;<br />
echo $v_valid_size | awk &#8216;{printf(&#8220;%.2f M\n&#8221;,$1/1024/1024)}&#8217;</div>
<div>if [ $v_uptime -ne 0 ]<br />
then<br />
    printf &#8220;每秒访问次数 : &#8221;<br />
    echo $v_cmd_get $v_uptime | awk &#8216;{printf(&#8220;%.2f\n&#8221;,$1/$2)}&#8217;<br />
fi</div>
<div>if [ $v_cmd_get -ne 0 ]<br />
then<br />
    printf &#8220;访问命中率 : &#8221;<br />
    echo $v_cmd_get $v_get_hits | awk &#8216;{printf(&#8220;%.2f %\n&#8221;,$2*100/$1)}&#8217;<br />
fi</div>
<div> </div>
]]></content:encoded>
			<wfw:commentRss>http://www.woduba.com/?feed=rss2&amp;p=558</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
