<?xml version="1.0" encoding="GBK" ?>
<rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dcterms="http://purl.org/dc/terms/">
 <channel>
  	  <title><![CDATA[小和尚真情无限]]></title>
	  <link>http://liufabin66688.blog.163.com</link>
	  <description><![CDATA[喜欢交朋友 每天盘存自己的思想，去掉多余的东西]]></description>
	  <language>zh-CN</language>
	  <pubDate>Thu, 2 Jul 2009 01:24:50 +0800</pubDate>
	  <lastBuildDate>Thu, 2 Jul 2009 01:24:50 +0800</lastBuildDate>
	  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
	  <generator><![CDATA[NetEase Space]]></generator>
	  <managingEditor><![CDATA[liufabin66688]]></managingEditor>
	  <webMaster><![CDATA[ 小和尚]]></webMaster>
		  <ttl>120</ttl>
	  <image>
	  	<title><![CDATA[小和尚真情无限]]></title>
	  	<url>http://ava.bimg.126.net/photo/vdGC02PbGQbTip2UhY3W3A==/429249339484679637.jpg</url>
	  	<link>http://liufabin66688.blog.163.com</link>
	  </image>
  <item>
  	<title><![CDATA[安装crawl,libevent,berkeley-db]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/1396854820096212441212</link>
    <description><![CDATA[<div>&nbsp;项目：http://www.monkey.org/~provos/crawl/<br>需要安装：libevent和Berkeley<br>先安装Berkeley<br>下载到：http://www.oracle.com/technology/software/products/berkeley-db/index.html<br>然后：tar xzvf&nbsp; db-4.7.25.tar.gz <br>比较简单的就是：<br>cd build_unix/<br>如果以gcc和g++编译的话,须执行#env CC=gcc CCC=g++ ../dist/configure，<br><p>编译.<br>../dist/configure --prefix=/opt/Berkeley<br>make<br>make install</p><p>最后：</p><p><span > #vi /etc/ld.so.conf
并将berkeleyDB的lib路径加到该文件的最后一行,这样才能找到并加载它的库文件.ld.so.conf是什么东西？它就是系统动态链接库的配
置文件。此文件内,存放着可被LINUX共享的动态链接库所在目录的名字(系统目录/lib,/usr/lib除外)，各个目录名间以空白字符(空格，换
行等)或冒号或逗号分隔。</span></p><p><span >成功后，测试一段代码是否争：代码为：</span></p><p><span >编译：</span></p><p>gcc test.c -ggdb -I /opt/Berkeley/include/ -L/opt/Berkeley/lib/ -ldb -lpthread -o test.out<br><span >从网上找到的测试代码：红色部分是修改的</span></p><p><span >#include &lt;db.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;pthread.h&gt;<br><span style="color: rgb(255, 0, 0);">#include &lt;string.h&gt; //添加</span><br><br>/* DB的函数执行完成后，返回0代表成功，否则失败 */<br>void print_error(int ret)<br>{<br>&nbsp; if(ret != 0)<br>&nbsp;&nbsp;&nbsp; printf("ERROR: %s\n",db_strerror(ret));<br>}<br><br>/* 数据结构DBT在使用前，应首先初始化，否则编译可通过但运行时报参数错误 */<br>void init_DBT(DBT * key, DBT * data)<br>{<br>&nbsp; memset(key, 0, sizeof(DBT));<br>&nbsp; memset(data, 0, sizeof(DBT));<br>}<br><br>int&nbsp; main(){<br>&nbsp; DB *dbp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; DBT key, data;<br>&nbsp; u_int32_t flags;<br>&nbsp; int ret;<br><br>&nbsp; char *fruit = "apple";<br>&nbsp; int number = 15;<br><br>&nbsp; typedef struct customer<br>&nbsp; {<br>&nbsp;&nbsp;&nbsp; int c_id;<br>&nbsp;&nbsp;&nbsp; char name[10];<br>&nbsp;&nbsp;&nbsp; char address[20];<br>&nbsp;&nbsp;&nbsp; int age;<br>&nbsp; } CUSTOMER;<br>&nbsp; CUSTOMER cust;<br>&nbsp; int key_cust_c_id = 1;<br><br>&nbsp; cust.c_id = 1;<br>&nbsp; strncpy(cust.name, "javer", 9);<br>&nbsp; strncpy(cust.address, "chengdu", 19);<br>&nbsp; cust.age = 32;<br><br>&nbsp; /* 首先创建数据库句柄 */<br>&nbsp; ret = db_create(&amp;dbp, NULL, 0);<br>&nbsp; print_error(ret);<br><br>&nbsp; /* 创建数据库标志 */<br>&nbsp; flags = DB_CREATE;&nbsp; <br><br>&nbsp; /* 创建一个名为single.db的数据库，使用B+树访问算法，本段代码演示对简单数据类型的处理<br>&nbsp;&nbsp; * */<br>&nbsp; ret = dbp-&gt;open(dbp, NULL, "single.db", NULL, DB_BTREE, flags, 0);<br>&nbsp; print_error(ret);<br><br>&nbsp; init_DBT(&amp;key, &amp;data);<br><br>&nbsp; /* 分别对关键字和数据赋值和规定长度<br>&nbsp;&nbsp; * */<br>&nbsp; key.data = fruit;<br>&nbsp; key.size = strlen(fruit) + 1;<br>&nbsp; data.data = &amp;number;<br>&nbsp; data.size = sizeof(int);<br><br>&nbsp; /* 把记录写入数据库中，不允许覆盖关键字相同的记录<br>&nbsp;&nbsp; * */<br>&nbsp; ret = dbp-&gt;put(dbp, NULL, &amp;key, &amp;data,DB_NOOVERWRITE);<br>&nbsp; print_error(ret);<br><br>&nbsp; /* 手动把缓存中的数据刷新到硬盘文件中，实际上在关闭数据库时，数据会被自动刷新<br>&nbsp;&nbsp; *<span style="color: rgb(255, 0, 0);"> */</span><br style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">&nbsp; //dbp-&gt;sync();//注释掉没找到错误，注释掉后可以运行，原来的拷贝是中文错误</span><br style="color: rgb(255, 0, 0);"><br>&nbsp; init_DBT(&amp;key, &amp;data);<br><br>&nbsp; key.data = fruit;<br>&nbsp; key.size = strlen(fruit) + 1;<br><br>&nbsp; /* 从数据库中查询关键字为apple的记录<br>&nbsp;&nbsp; * */<br>&nbsp; ret = dbp-&gt;get(dbp, NULL, &amp;key, &amp;data, 0);<br>&nbsp; print_error(ret);<br><br>&nbsp; /* 特别要注意数据结构DBT的字段data为void<br>&nbsp;&nbsp; * *型，所以在对data赋值和取值时，要做必要的类型转换。<br>&nbsp;&nbsp; * */<br>&nbsp; printf("The number = %d\n", *(int*)(data.data));<br><br>&nbsp; if(dbp != NULL)<br>&nbsp;&nbsp;&nbsp; dbp-&gt;close(dbp, 0);<br><br>&nbsp; ret = db_create(&amp;dbp, NULL, 0);<br>&nbsp; print_error(ret);<br><br>&nbsp; flags = DB_CREATE;&nbsp; <br><br>&nbsp; /* 创建一个名为complex.db的数据库，使用HASH访问算法，本段代码演示对复杂数据结构的处理<br>&nbsp;&nbsp; * */<br>&nbsp; ret = dbp-&gt;open(dbp, NULL, "complex.db", NULL, DB_HASH, flags, 0);<br>&nbsp; print_error(ret);<br><br>&nbsp; init_DBT(&amp;key, &amp;data);<br><br>&nbsp; key.size = sizeof(int);<br>&nbsp; key.data = &amp;(cust.c_id);<br><br>&nbsp; data.size = sizeof(CUSTOMER);<br>&nbsp; data.data = &amp;cust;<br><br>&nbsp; ret = dbp-&gt;put(dbp, NULL, &amp;key, &amp;data,DB_NOOVERWRITE);<br>&nbsp; print_error(ret);<br><br>&nbsp; memset(&amp;cust, 0, sizeof(CUSTOMER));<br><br>&nbsp; key.size = sizeof(int);<br>&nbsp; key.data = &amp;key_cust_c_id;<br><br>&nbsp; data.data = &amp;cust;<br>&nbsp; data.ulen = sizeof(CUSTOMER);<br>&nbsp; data.flags = DB_DBT_USERMEM;<br><br>&nbsp; dbp-&gt;get(dbp, NULL, &amp;key, &amp;data, 0);<br>&nbsp; print_error(ret);<br><br>&nbsp; printf("c_id = %d name = %s address = %s age = %d\n",<br>&nbsp;&nbsp;&nbsp; &nbsp; cust.c_id, cust.name, cust.address, cust.age);<br><br>&nbsp; if(dbp != NULL)<br>&nbsp;&nbsp;&nbsp; dbp-&gt;close(dbp, 0);<br>&nbsp; return 0;<br>}</span></p><p><span >运行.test.out:</span></p><p><span >ERROR: DB_KEYEXIST: Key/data pair already exists<br>The number = 15<br>ERROR: DB_KEYEXIST: Key/data pair already exists<br>ERROR: DB_KEYEXIST: Key/data pair already exists<br>c_id = 1 name = javer address = chengdu age = 32<br>说明安装成功：以后研究：</span></p><p><span >然后安装libevent：</span></p><p><span >cd libevent:</span></p><pre>[root@localhost]#cd libevent-1.2<br>[root@localhost]#./configure --prefix=/opt/libevent &amp;&amp; make &amp;&amp; make install</pre><p><span >安装成功后，安装crawl</span></p><p><span >参数为：</span></p><pre> ./configure --prefix=/opt/crall  --with-libevent=/usr/<br>checking build system type... i686-pc-linux-gnu<br>checking host system type... i686-pc-linux-gnu<br>checking target system type... i686-pc-linux-gnu<br>checking for a BSD-compatible install... /usr/bin/install -c<br>checking whether build environment is sane... yes<br>checking whether make sets ${MAKE}... yes<br>checking for working aclocal-1.4... missing<br>checking for working autoconf... missing<br>checking for working automake-1.4... missing<br>checking for working autoheader... missing<br>checking for working makeinfo... missing<br>checking for gcc... gcc<br>checking for C compiler default output... a.out<br>checking whether the C compiler works... yes<br>checking whether we are cross compiling... no<br>checking for suffix of executables... <br>checking for suffix of object files... o<br>checking whether we are using the GNU C compiler... yes<br>checking whether gcc accepts -g... yes<br>checking for gcc option to accept ANSI C... none needed<br>checking for a BSD-compatible install... /usr/bin/install -c<br>checking if we may use "-I/usr/include"... no<br>checking for libevent... /usr/<br>configure: error: event.h or libevent.a not found in /usr/<br><br></pre>而且已经把libevent-1.4.so.2 copy到/usr/lib<br>为什么不可以呢？<br> </div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/1396854820096212441212</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/1396854820096212441212</guid>
    <pubDate>Thu, 2 Jul 2009 01:24:41 +0800</pubDate>
    <dcterms:modified>2009-07-02T01:24:41+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[数码摄影技巧]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200952710493451</link>
    <description><![CDATA[<div>&nbsp;今日看了看《跟我学数码摄影》，里面还是有些东西值得学习的，豆瓣的地址：http://www.douban.com/subject/3208677。<br>记录下他们介绍的原则：<br>摄影构图的基本原则<br>1 选择和突出主体<br>2 尽可能简单<br>3 似与不似之间<br>4 确定注视中心的位置：由矩形的某一个顶点向对角线做一条垂线，垂线与对角线相交的这个点式确定注视中心的最合适的位置<br>5 三分之一原则。<br>6 黄金分割和井字格<br>7中心对称构图<br>8对称与非对称<br>9 运用前景<br>10 明暗对比<br>11 虚实对比<br>12 横与竖<br>13 视线牵引<br>14 近大远小<br>15 抽象的摄影<br>16 视线运动的前方要留白<br>17 色彩的冷暖和象征<br>18 色彩的和谐<br>19 色彩的互补和对比<br>20 倾斜和动感<br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200952710493451</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200952710493451</guid>
    <pubDate>Sat, 27 Jun 2009 10:49:34 +0800</pubDate>
    <dcterms:modified>2009-06-27T10:49:34+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[awk使用找到mysql结果的数据]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200952665056907</link>
    <description><![CDATA[<div>mysql选择出的数据格式为：<br>*************************** 1. row ***************************<br>url_id: 1#386808#267#雕刻时光推荐好声音（第二场）—台湾组合乐队专场<br>*************************** 2. row ***************************<br>url_id: 1#387113#267#感恩父亲节专场演唱会温馨谢幕~<br>找出相应的uid的shell<br>sed '/\*/d' topiclist.txt |awk -F '#' 'BEGIN{ORS=","}{print $2}'|sort|uniq|sed 's/.$//'</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200952665056907</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200952665056907</guid>
    <pubDate>Fri, 26 Jun 2009 18:50:56 +0800</pubDate>
    <dcterms:modified>2009-06-26T18:50:56+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[数据库永久连接mysql_pconnect和mysql_connect]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200952554133438</link>
    <description><![CDATA[<div>&nbsp;&nbsp;&nbsp; 一直对mysql_pconnect 和mysql_connect的理解差别是p链接是持久链接，不会关闭了链接，即使你使用了mysql_close();建立连接后，将保持sleep状态，可以使用show processlist 查看有哪些正在sleep的连接，这样p链接的好处是当有新的请求时就直接返回这个连接，感觉类似于http1.1协议的keep-alive的用法，到底是开个还是关呢还是不关呢，一般那些专家都告诉你，当用户量不多时，可以打开keep -live 这样可以，在http协议进行打交道时，给用户保持连接。用户第一次打开建立，然后继续浏览时就不需要新开了，提高用户的体验，当用户量比较大的时候，大量的保持连接会给服务器造成很大压力，所以需要找一个平衡点是开到底还是不开，回过头来看mysql_p 的理解：&nbsp;&nbsp;&nbsp; 在网上搜索了没有找到满意的答案，但是在竟然在手册上看到一个解释的比较完美的，看来以后应该多看手册：<br>&nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">定义：</span><br>&nbsp;&nbsp;&nbsp; 永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个（前面已经开启的）相同的永久连接。如果存在，将直接使用这个连接；如果不存在，则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。 <br>&nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">先看看手册上的总结：</span><br>&nbsp;&nbsp;&nbsp; 永久连接是为通常连接建立一对一的分布而设计的。这意味着必须能够保证在将永久连接替换为非永久连接时，脚本的行为不会改变。使用永久连接将（非常）有可能改变脚本的效率，但不改变其行为！ <br><span style="font-weight: bold;">&nbsp;&nbsp;&nbsp; 如果永久连接并没有任何附加的功能，那么使用它有什么好处？ </span><br>&nbsp;&nbsp;&nbsp; 答案非常简单――效率。当客户端对 SQL 服务器的连接请求非常频繁时，永久连接将更加高效。连接请求频繁的标准取决于很多因素。例如，数据库的种类，数据库服务和 web 服务是否在同一台服务器上，SQL 服务器如何加载负载等。但我们至少知道，当连接请求很频繁时，永久连接将显著的提高效率。<span style="color: rgb(255, 0, 0); font-weight: bold;">它使得每个子进程在其生命周期中只做一次连接操作，而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。这也就是说，每个子进程将对服务器建立各自独立的永久连接。</span>例如，如果有 20 个不同的子进程运行某脚本建立了永久的 SQL 服务器永久连接，那么实际上向该 SQL 服务器建立了 20 个不同的永久连接，每个进程占有一个。<br>&nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">注意</span>，如果永久连接的子进程数目超过了设定的数据库连接数限制，系统将会产生一些缺陷。如果数据库的同时连接数限制为 16，而在繁忙会话的情况下，有 17 个线程试图连接，那么有一个线程将无法连接。如果这个时候，在脚本中出现了使得连接无法关闭的错误（例如无限循环），则该数据库的 16 个连接将迅速地受到影响。请查阅使用的数据库的文档，以获取关于如何处理已放弃的及闲置的连接的方法。 <br>&nbsp;&nbsp;&nbsp; <span style="font-weight: bold;">警告</span>：在使用永久连接时还有一些特别的问题需要注意。例如在永久连接中使用数据表锁时，如果脚本不管什么原因无法释放该数据表锁，其随后使用相同连接的脚本将会被永久的阻塞，使得需要重新启动 httpd 服务或者数据库服务。另外，在使用事务处理时，如果脚本在事务阻塞产生前结束，则该阻塞也会影响到使用相同连接的下一个脚本。不管在什么情况下，都可以通过使用 register_shutdown_function() 函数来注册一个简单的清理函数来打开数据表锁，或者回滚事务。或者更好的处理方法，是不在使用数据表锁或者事务处理的脚本中使用永久连接，这可以从根本上解决这个问题（当然还可以在其它地方使用永久连接）。 <br><br><br><span style="font-weight: bold;">&nbsp;web 服务器可以用三种方法来利用 PHP 生成 web 页面。 </span><br><br>&nbsp;第一种方法是将 PHP 用作一个“外壳”。以这种方法运行，PHP 会为向 web 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束，因此任何在这个线程中利用的任何资源（例如指向 SQL 数据库服务器的连接）都会随线程的结束而关闭。在这种情况下，使用永久连接不会获得任何地改变――因为它们根本不是永久的。 <br><br>第二，也是最常用的方法，是把 PHP 用作多进程 web 服务器的一个模块，这种方法目前只适用于 Apache。对于一个多进程的服务器，其典型特征是有一个父进程和一组子进程协调运行，其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时，该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时，它将有可能被一个不同的子进程来处理。在开启了一个永久连接后，所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。 <br><br>最后一种方法是将 PHP 用作多线程 web 服务器的一个插件。目前 PHP 4 已经支持 ISAPI、WSAPI 和 NSAPI（在 Windows 环境下），这些使得 PHP 可以被用作诸如 Netscape FastTrack (iPlanet)、Microsoft's Internet Information Server (IIS) 和 O'Reilly's WebSite Pro 等多线程 web 服务器的插件。永久连接的行为和前面所描述的多过程模型在本质上是相同的。注意 PHP 3 不支持 SAPI。 <br><br><br><br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200952554133438</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200952554133438</guid>
    <pubDate>Thu, 25 Jun 2009 17:41:33 +0800</pubDate>
    <dcterms:modified>2009-06-27T10:53:38+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[ssh tar 合作处理网络文件]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200952461957462</link>
    <description><![CDATA[<div>传输文件有时候考ryscn完成，但是有一些功能可以通过tar和ssh完成<br>先看一句 ：<br>sed "s%^$BASEDIR/$module_name/%%" $listOP |<br>ssh $REMOTE_USER@$remote_host "mkdir -p $bpath $REMOTE_PATH; tar -C $REMOTE_PATH -jcf $bpath/$tarball.$VER_TODAY$remove_suffix -T - $remove_args";<br>这句就是别人写的一个应用：<br>然后我发现了一些：<br>tar和find结合的：<br><br>find / -type f -print | grep -iE '\.doc$' | tar -czvf test.tar.gz<br>find . -mount -depth -type f -print | grep -iE '*\.txt$' | tar -czvf ../test.tar.gz <br>继续一些别的命令学习：<br>ssh myname@boxname 'cd /logs; tar cf - $(find . -name "*.Z")' |tar xf - <br>(cd /bkup02/ieee/fulltext/2007; tar cf - $(find . -name xml.zip) ) | ssh user@xxx.xxx.xxx.xxx"tar -C /opt/backup/ieee/2007 -xf -"<br>user@xxx.xxx.xxx.xxx's password:<br>tar cf - files | ssh surtr "(cd /home/joe/tmp; tar xf -)"<br>$ ssh surtr "(cd /home/joe/tmp; tar cvjf /home/joe/pkgs.tar.bz2 pkgs)" \<br>&amp;&amp; scp surtr:~/pkgs.tar.bz2<br>学会了这些我们来个终极版：<br>地址在：<br>&nbsp;&nbsp; &nbsp;http://ultra.ap.krakow.pl/~bar/DOC/ssh_backup.html<br><br>PUSH 将本地文件到远程服务器:<br><br>&nbsp;&nbsp;&nbsp; * tar cvf - . | gzip -c -1 | ssh user@host cat "&gt;" remotefile.gz<br>&nbsp;&nbsp;&nbsp; * ssh target_address cat &lt;localfile "&gt;" remotefile<br>&nbsp;&nbsp;&nbsp; * ssh target_address cat &lt;localfile - "&gt;" remotefile<br>&nbsp;&nbsp;&nbsp; * cat localfile | ssh target_address cat "&gt;" remotefile<br>&nbsp;&nbsp;&nbsp; * cat localfile | ssh target_address cat - "&gt;" remotefile<br>&nbsp;&nbsp;&nbsp; * dd if=localfile | ssh target_address dd of=remotefile<br>&nbsp;&nbsp;&nbsp; * ssh target_address cat &lt;localfile "|" dd of=remotefile<br>&nbsp;&nbsp;&nbsp; * ssh target_address cat - &lt;localfile "|" dd of=remotefile<br>&nbsp;&nbsp;&nbsp; * ( cd SOURCEDIR &amp;&amp; tar cf - . ) | ssh target_address "(cd DESTDIR &amp;&amp; tar xvpf - )"<br>&nbsp;&nbsp;&nbsp; * ( cd SOURCEDIR &amp;&amp; tar cvf - . ) | ssh target_address "(cd DESTDIR &amp;&amp; cat - &gt; remotefile.tar )"<br>&nbsp;&nbsp;&nbsp; * ( cd SOURCEDIR &amp;&amp; tar czvf - . ) | ssh target_address "(cd DESTDIR &amp;&amp; cat - &gt; remotefile.tgz )"<br>&nbsp;&nbsp;&nbsp; * ( cd SOURCEDIR &amp;&amp; tar cvf - . | gzip -1 -) | ssh target_address "(cd DESTDIR &amp;&amp; cat - &gt; remotefile.tgz )"<br>&nbsp;&nbsp;&nbsp; * ssh target_address "( nc -l -p 9210 &gt; remotefile &amp; )" &amp;&amp; cat source-file | gzip -1 - | nc target_address 9210<br>&nbsp;&nbsp;&nbsp; * cat localfile | gzip -1 - | ssh target_address cat "&gt;" remotefile.gz<br><br><br>PULL:把远程文件从远程弄到本地<br>&nbsp;&nbsp; &nbsp;# ssh target_address cat remotefile &gt; localfile<br>&nbsp;&nbsp; &nbsp;# ssh target_address dd if=remotefile | dd of=localfile<br>&nbsp;&nbsp; &nbsp;# ssh target_address cat "&lt;" remotefile &gt;localfile<br>&nbsp;&nbsp; &nbsp;# ssh target_address cat "&lt;" remotefile.gz | gunzip &gt;localfile<br><br>COMPARE:<br>&nbsp;&nbsp; &nbsp;# ###This one uses CPU cycles on the remote server to compare the files:<br>&nbsp;&nbsp; &nbsp;# ssh target_address cat remotefile | diff - localfile<br>&nbsp;&nbsp; &nbsp;# cat localfile | ssh target_address diff - remotefile<br>&nbsp;&nbsp; &nbsp;# ###This one uses CPU cycles on the local server to compare the files:<br>&nbsp;&nbsp; &nbsp;# ssh target_address cat &lt;localfile "|" diff - remotefile<br>本地文件的一些操作<br>复制<br>&nbsp;&nbsp;&nbsp; * ( cd SOURCEDIR &amp;&amp; tar cf - . ) | (cd DESTDIR &amp;&amp; tar xvpf - )<br><br>FTP VIEW:<br><br>&nbsp;&nbsp;&nbsp; * ftp&gt; get file.gif "| xv -"<br>&nbsp;&nbsp;&nbsp; * ftp&gt; get README "| more"<br><br>FTP PUSH:<br><br>&nbsp;&nbsp;&nbsp; * ftp&gt; put "| tar cvf - ." myfile.tar<br>&nbsp;&nbsp;&nbsp; * ftp&gt; put "| tar cvf - . | gzip " myfile.tar.gz<br><br>FTP PULL:<br><br>&nbsp;&nbsp;&nbsp; * ftp&gt; get myfile.tar "| tar xvf -"<br><br>Pipes and Redirects:<br><br>&nbsp;&nbsp;&nbsp; * zcat Fig.ps.Z | gv -<br>&nbsp;&nbsp;&nbsp; * gunzip -c Fig.ps.gz | gv -<br>&nbsp;&nbsp;&nbsp; * tar xvf mydir.tar<br>&nbsp;&nbsp;&nbsp; * tar xvf - &lt; mydir.tar<br>&nbsp;&nbsp;&nbsp; * cat mydir.tar | tar xvf -<br>&nbsp;&nbsp;&nbsp; * tar cvf mydir.tar .<br>&nbsp;&nbsp;&nbsp; * tar cvf - . &gt; mydir.tar<br>&nbsp;&nbsp;&nbsp; * tar cf - . | (cd ~/newdir; tar xf -)<br>&nbsp;&nbsp;&nbsp; * gunzip -c foo.gz &gt; bar<br>&nbsp;&nbsp;&nbsp; * cat foo.gz | gunzip &gt; bar<br>&nbsp;&nbsp;&nbsp; * zcat foo.gz &gt; bar<br>&nbsp;&nbsp;&nbsp; * gzip -c foo &gt; bar.gz<br>&nbsp;&nbsp;&nbsp; * cat foo | gzip &gt; bar.gz<br>&nbsp;&nbsp;&nbsp; * cat foo | gzip &gt; bar.gz<br>相信你能学会很多从这里<br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200952461957462</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200952461957462</guid>
    <pubDate>Wed, 24 Jun 2009 18:19:57 +0800</pubDate>
    <dcterms:modified>2009-06-24T18:27:17+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[统计php.err里的错误]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200952321556950</link>
    <description><![CDATA[<div><style></style><div><font size="2">如题：<br><br>awk -F "]" '{if(NF&gt;=3){print $3} else{print $2}}' php.err 
|sort|uniq|sed -e 's/^:/ /'|awk '{print NR,$0}' &gt;only.err<br><br><br>删除掉script里的文本：<br></font><div  &nbsp;&nbsp;style="font-family:Fixdays" id="code0">:%s#\(&lt;script contentType="application/x-javascript"&gt;\)[^&lt;]*\(&lt;/script&gt;\)#\1\2#</div><font size="2">同事学习了下awk里的循环：<br><span style="color: rgb(0, 0, 0); font-weight: bold;">（摘抄）</span><br></font>awk条件语句<br><br>条件语句<br><br>awk中的条件语句是从C语言中借鉴过来的，可控制程序的流程。<br>14.5.1. if语句<br><br>格式：<br>{if (expression){<br>statement; statement; ...<br>}<br>}<br><br>$ awk '{if ($1 &lt;$2) print $2 "too high"}' test。如果第一个域小于第二个域则打印。<br><br>$ awk '{if ($1 &lt; $2) {count++; print "ok"}}' test.如果第一个域小于第二个域，则count加一，并打印ok。<br>14.5.2. if/else语句，用于双重判断。<br><br>格式：<br>{if (expression){<br>statement; statement; ...<br>}<br>else{<br>statement; statement; ...<br>}<br>}<br><br>$ awk '{if ($1 &gt; 100) print $1 "bad" ; else print "ok"}' test。如果$1大于100则打印$1 bad,否则打印ok。<br><br>$ awk '{if ($1 &gt; 100){ count++; print $1} else {count--; print $2}' test。如果$1大于100，则count加一，并打印$1，否则count减一，并打印$1。<br>14.5.3. if/else else if语句，用于多重判断。<br><br>格式：<br>{if (expression){<br>statement; statement; ...<br>}<br>else if (expression){<br>statement; statement; ...<br>}<br>else if (expression){<br>statement; statement; ...<br>}<br>else {<br>statement; statement; ...<br>}<br>}<br><br>14.6. 循环<br><br>*<br><br>awk有三种循环:while循环；for循环；special for循环。<br>*<br><br>$ awk '{ i = 1; while ( i &lt;= NF ) { print NF,$i; i++}}' test。变量的初始值为1，若i小于可等于NF(记录中域的个数),则执行打印语句，且i增加1。直到i的值大于NF.<br>*<br><br>$ awk '{for (i = 1; i *<br><br>breadkcontinue语句。break用于在满足条件的情况下跳出循环；continue用于在满足条件的情况下忽略后面的语句，直接返回循环的顶端。如：<br><br>{for ( x=3; x&lt;=NF; x++) <br>if ($x&lt;0){print "Bottomed out!"; break}}<br>{for ( x=3; x&lt;=NF; x++)<br>if ($x==0){print "Get next item"; continue}}<br><br><br>*<br><br>next语句从输入文件中读取一行，然后从头开始执行awk脚本。如：<br><br>{if ($1 ~/test/){next}<br>else {print}<br>}<br><br><br>*<br><br>exit语句用于结束awk程序，但不会略过END块。退出状态为0代表成功，非零值表示出错。<br><br>14.7. 数组<br><br>awk中的数组的下标可以是数字和字母，称为关联数组。<br>14.7.1. 下标与关联数组<br><br>*<br><br>用变量作为数组下标。如：$ awk {name[x++]=$2};END{for(i=0;i *<br><br>special for循环用于读取关联数组中的元素。格式如下：<br><br>{for (item in arrayname){<br>print arrayname[item]<br>}<br>}<br><br>$ awk '/^tom/{name[NR]=$1}; END{for(i in name){print name[i]}}' test。打印有值的数组元素。打印的顺序是随机的。<br>*<br><br>用字符串作为下标。如：count["test"]<br>*<br><br>用
域值作为数组的下标。一种新的for循环方式，for (index_value in array) statement。如:$ awk
'{count[$1]++} END{for(name in count) print name,count[name]}'
test。该语句将打印$1中字符串出现的次数。它首先以第一个域作数组count的下标，第一个域变化，索引就变化。<br>*<br><br>delete
函数用于删除数组元素。如：$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}'
test。分配给数组line的是第一个域的值，所有记录处理完成后，special for循环将删除每一个元素。<br><font size="2"><br></font></div></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200952321556950</comments>
    <slash:comments>2</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200952321556950</guid>
    <pubDate>Tue, 23 Jun 2009 14:15:56 +0800</pubDate>
    <dcterms:modified>2009-06-23T16:26:52+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[Crucial Concepts Behind Advanced Regular Expressions(转)]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200952011585455</link>
    <description><![CDATA[<div><p><br></p><p>转：http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/<br></p><p>Regular expressions (or regex) are a powerful way to traverse large
strings in order to find information. They rely on underlying patterns
in a string’s structure to work their magic. Unfortunately, simple
regular expressions are unable to cope with complex patterns and
symbols. To deal with this dilemma, you can use <strong>advanced regular expressions</strong>.</p>
<p>Below, we present an <strong>introduction to advanced regular expressions</strong>,
with eight commonly used concepts and examples. Each example outlines a
simple way to match patterns in complex strings. If you do not yet have
experience with basic regular expressions, have a look at <a href="http://www.lateralcode.com/regular-expressions/">this article</a> to get started. The syntax used here matches PHP’s Perl-compatible regular expressions.</p>
<h3>1. Greediness/Laziness</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" original="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/greed.jpg" src="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/greed.jpg" alt="Greed" height="300" width="400"></p>
<p>All regex repetition operators are <strong>greedy</strong>. They try
to match as much as possible in a string. Unfortunately, this might not
always be a desired effect. Thus, lazy operators are used to solve this
problem. They only match the smallest possible pattern and are used by
adding a ‘?’ after the respective greedy operator. Alternatively, the
‘U’ modifier may be used to make all repetiton operators lazy.
Differentiating between greediness and laziness is key to fully
understanding advanced regular expressions.</p>
<h4>Greedy Operators</h4>
<p>The * operator matches the previous expression 0 or more times. It is a greedy operator. Consider the following expression:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>preg_match(&nbsp;</span><span >'/&lt;h1&gt;.*&lt;\/h1&gt;/'</span><span>,&nbsp;'&lt;h1&gt;This&nbsp;is&nbsp;a&nbsp;heading.&lt;/h1&gt;&nbsp;&nbsp;</span></span></li><li ><span>&lt;h1&gt;This&nbsp;is&nbsp;another&nbsp;one.&lt;/h1&gt;',&nbsp;<span >$matches</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >preg_match( '/&lt;h1&gt;.*&lt;\/h1&gt;/', '&lt;h1&gt;This is a heading.&lt;/h1&gt;
&lt;h1&gt;This is another one.&lt;/h1&gt;', $matches );</pre>

<p>Recall that a . means any character except a new line. The above
regular expression is looking for an h1 tag and all of its contents. It
uses the . and * operators to constantly match anything inside the tag.
This pattern will match:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>&lt;h1&gt;This&nbsp;is&nbsp;a&nbsp;heading.&lt;/h1&gt;&lt;h1&gt;This&nbsp;is&nbsp;another&nbsp;one.&lt;/h1&gt;&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >&lt;h1&gt;This is a heading.&lt;/h1&gt;&lt;h1&gt;This is another one.&lt;/h1&gt;</pre>

<p>It returns the whole string. The * operator will continuously match
everything — even the middle closing h1 tag — because it is greedy.
Matching the whole string is the best it can do.</p>
<h4>Lazy Operators</h4>
<p>Let’s change the above operator by adding a ‘?’ after it. This will make it lazy:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/&lt;h1&gt;.*?&lt;\/h1&gt;/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/&lt;h1&gt;.*?&lt;\/h1&gt;/</pre>

<p>The regex now fulfills its duty and matches only the first h1 tag.
Another greedy operator that uses this same property is {n,}. This
matches the previous expression n or more times. If it is used without
a question mark, it looks for the most repetitions possible. Otherwise,
it starts from n repetitions:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span >#&nbsp;Set&nbsp;up&nbsp;a&nbsp;String</span><span>&nbsp;&nbsp;</span></span></li><li ><span><span >$str</span><span>&nbsp;=&nbsp;</span><span >'hihi'</span><span>;&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;Match&nbsp;it&nbsp;using&nbsp;the&nbsp;greedy&nbsp;{n,}&nbsp;operator</span><span>&nbsp;&nbsp;</span></span></li><li ><span>preg_match(&nbsp;<span >'/(hi){1,}/'</span><span>,&nbsp;</span><span >$str</span><span>,&nbsp;</span><span >$matches</span><span>&nbsp;);&nbsp;</span><span >#&nbsp;matches[0]&nbsp;will&nbsp;be&nbsp;'hihi'</span><span>&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;Match&nbsp;it&nbsp;with&nbsp;the&nbsp;lazy&nbsp;{n,}?&nbsp;operator</span><span>&nbsp;&nbsp;</span></span></li><li ><span>preg_match(&nbsp;<span >'/(hi){1,}?/'</span><span>,&nbsp;</span><span >$str</span><span>,&nbsp;</span><span >$matches</span><span>&nbsp;);&nbsp;</span><span >#&nbsp;matches[0]&nbsp;will&nbsp;be&nbsp;'hi'</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  ># Set up a String
$str = 'hihi';

# Match it using the greedy {n,} operator
preg_match( '/(hi){1,}/', $str, $matches ); # matches[0] will be 'hihi'

# Match it with the lazy {n,}? operator
preg_match( '/(hi){1,}?/', $str, $matches ); # matches[0] will be 'hi'</pre>

<h3>2. Back Referencing</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" style="display: inline;" original="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/back.jpg" src="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/back.jpg" alt="Back Referencing" height="290" width="300"></p>
<h4>What it does</h4>
<p><strong>Back referencing</strong> is a way to refer to previously
matched patterns inside a regular expression. For example, take a look
at this simple regex that matches an expression in quotes:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span >#&nbsp;Set&nbsp;up&nbsp;an&nbsp;array&nbsp;of&nbsp;matches</span><span>&nbsp;&nbsp;</span></span></li><li ><span><span >$matches</span><span>&nbsp;=&nbsp;</span><span >array</span><span>();&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;Create&nbsp;a&nbsp;String</span><span>&nbsp;&nbsp;</span></span></li><li ><span><span >$str</span><span>&nbsp;=&nbsp;</span><span >"\"This&nbsp;is&nbsp;a&nbsp;'string'\""</span><span>;&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;Traverse&nbsp;it&nbsp;with&nbsp;regular&nbsp;expressions</span><span>&nbsp;&nbsp;</span></span></li><li ><span>preg_match(&nbsp;<span >"/(\"|').*?(\"|')/"</span><span>,&nbsp;</span><span >$str</span><span>,&nbsp;</span><span >$matches</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;Print&nbsp;the&nbsp;whole&nbsp;match</span><span>&nbsp;&nbsp;</span></span></li><li ><span><span >echo</span><span>&nbsp;&nbsp;</span><span >$matches</span><span>[0];&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  ># Set up an array of matches
$matches = array();

# Create a String
$str = "\"This is a 'string'\"";

# Traverse it with regular expressions
preg_match( "/(\"|').*?(\"|')/", $str, $matches );

# Print the whole match
echo  $matches[0];</pre>

<p>Unfortunately, this will not correctly match the string. Instead, it will print:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>"This&nbsp;is&nbsp;a&nbsp;'&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >"This is a '</pre>

<p>This regular expression matches the opening double quote but finds a
different type of quote to close it. This is because it was given the
option of picking a double or single quote at the end. In order to fix
this, you can use back referencing. The <strong>expressions \1, \2, ….,  \9</strong> hold references to previously captured subpatterns. The first matched quote, in this case, will be held by the variable \1.</p>
<h4>How to Use It</h4>
<p>In order to apply this concept to the aforementioned example, use \1 in place of the last quote:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>preg_match(&nbsp;</span><span >'/("|\').*?\1/'</span><span>,&nbsp;</span><span >$str</span><span>,&nbsp;</span><span >$matches</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >preg_match( '/("|\').*?\1/', $str, $matches );</pre>

<p>This will now correctly return:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span >"This&nbsp;is&nbsp;a&nbsp;'string'"</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >"This is a 'string'"</pre>

<p>Remember that back referencing may also be used by <code>preg_replace</code>.
Note that instead of \1 … \9, you should use $1 … $9 … $n (any number
of these will work). For example, if you want to replace all paragraph
tags with text that represents them, use:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span >$text</span><span>&nbsp;=&nbsp;preg_replace(&nbsp;</span><span >'/&lt;p&gt;(.*?)&lt;\/p&gt;/'</span><span>,&nbsp;&nbsp;</span></span></li><li ><span><span >"&amp;lt;p&amp;gt;$1&amp;lt;/p&amp;gt;"</span><span>,&nbsp;</span><span >$html</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >$text = preg_replace( '/&lt;p&gt;(.*?)&lt;\/p&gt;/',
"&amp;lt;p&amp;gt;$1&amp;lt;/p&amp;gt;", $html );</pre>

<p>The $1 back reference holds the text inside the paragraph and is
being used in the replace pattern itself. This completely valid
expression shows an easy way to access matched patterns even while
replacing.</p>
<h3>3. Named Groups</h3>
<p>When using multiple back references, a regular expression can
quickly become confusing and hard to understand. An alternative way to
back reference is by using <strong>named groups</strong>. A named group is specified by using <code>(?P&lt;name&gt;pattern)</code>,
where name is the name of the group and pattern is the regular
expression in the group itself. The group can then be referred to by
(?P=name). For example, consider the following:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/(?P&lt;quote&gt;"|').*?(?P=quote)/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/(?P&lt;quote&gt;"|').*?(?P=quote)/</pre>

<p>The above expression will create the same effect as the previous
back reference example, but by instead using named groups. It is also
significantly easier to read.</p>
<p>Named groups are also useful when sifting through the array of
matches. The name given to a specific pattern is also the key of the
corresponding matches array.</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>preg_match(&nbsp;</span><span >'/(?P&lt;quote&gt;"|\')/'</span><span>,&nbsp;"</span><span >'String'</span><span>",&nbsp;</span><span >$matches</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;This&nbsp;will&nbsp;print&nbsp;"'"</span><span>&nbsp;&nbsp;</span></span></li><li ><span><span >echo</span><span>&nbsp;</span><span >$matches</span><span>[1];&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;</span></li><li ><span><span >#&nbsp;This&nbsp;will&nbsp;also&nbsp;print&nbsp;"'",&nbsp;as&nbsp;it&nbsp;is&nbsp;a&nbsp;named&nbsp;group</span><span>&nbsp;&nbsp;</span></span></li><li ><span><span >echo</span><span>&nbsp;</span><span >$matches</span><span>[</span><span >'quote'</span><span>];&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >preg_match( '/(?P&lt;quote&gt;"|\')/', "'String'", $matches );

# This will print "'"
echo $matches[1];

# This will also print "'", as it is a named group
echo $matches['quote'];</pre>

<p>Thus, named groups not only make code easier to read but also organize it.</p>
<h3>4. Word Boundaries</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" style="display: inline;" original="http://media1.smashingmagazine.com/images/advanced-regular-expressions-php/boundary.jpg" src="http://media1.smashingmagazine.com/images/advanced-regular-expressions-php/boundary.jpg" alt="Word Boundaries" height="284" width="400"></p>
<p><strong>Word boundaries</strong> are places in a string that come
between a word character and a non-word character. The specialty of
these boundaries is the fact that they don’t actually match a
character. Their length is <em>zero</em>. The <code>\b</code> regular expression matches any word boundary.</p>
<p>Unfortunately, boundaries are so often skimmed over that many do not
recognize their real significance. For example, let’s say you want to
match the word “import”:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/import/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/import/</pre>

<p>Watch out! Regular expressions can be tricky. The above expression will also match:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>important&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >important</pre>

<p>You may think it is as simple as adding a space before and after import to prevent these bogus matches:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/&nbsp;import&nbsp;/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/ import /</pre>

<p>But what about this case?</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>The&nbsp;trader&nbsp;voted&nbsp;</span><span >for</span><span>&nbsp;the&nbsp;import&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >The trader voted for the import</pre>

<p>When import is at the beginning or the end of a string, the modified
regex will fail. Thus, splitting this up into cases is required:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/(^import&nbsp;|&nbsp;import&nbsp;|&nbsp;import$)/i&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/(^import | import | import$)/i</pre>

<p>Looking back at our regular expression, it does not take periods or
other punctuation into account. Just to match this single word, a
regular expressions may look like this:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/(^import(:|;|,)?&nbsp;|&nbsp;import(:|;|,)?&nbsp;|&nbsp;import(\.|\?|!)?$)/i&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/(^import(:|;|,)? | import(:|;|,)? | import(\.|\?|!)?$)/i</pre>
<p>That’s a lot of code to match just a single word. This is why word
boundaries are so significant. To accomplish the above statement and <strong>many other variations</strong> with word boundaries, all that is necessary is:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/\bimport\b/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/\bimport\b/</pre>

<p>This will match every case above and more. <code>\b</code>’s
flexibility comes from the fact that it matches a zero-length string.
All it matches is an imaginary space between two characters. It checks
if one of the characters is a non-word character and the other is a
word character. If so, it matches it. If the beginning or end of a
string is encountered, <code>\b</code> treats it as a non-word character. Because the <code>i</code> in import is still considered a word character, it will match import.</p>
<p>Note that the opposite of \b is \B. This operator will match the
space in-between two word or two non-word characters. Thus, if you
would like to match ‘hi’ inside another word, you could use:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>\Bhi\B&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >\Bhi\B</pre>

<h3>5. Atomic Groups</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" style="display: inline;" original="http://media1.smashingmagazine.com/images/advanced-regular-expressions-php/groups.jpg" src="http://media1.smashingmagazine.com/images/advanced-regular-expressions-php/groups.jpg" alt="Advanced Operators" height="266" width="400"></p>
<p><strong>Atomic groups</strong> are special regex groups that are
non-capturing. They are usually used to increase the efficiency of a
regular expression, but may also be applied to eliminate certain
matches. An atomic group is specified by using (?&gt;pattern):</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/(?&gt;his|this)/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/(?&gt;his|this)/</pre>

<p>When the regex engine matches an atomic group, it will discard
backtracting positions that came with all tokens inside it. Consider
the word ’smashing’. Using the above regular expression, the regex
engine will first try to match the pattern ‘his’ in ’smashing’. It will
not find a match. At this point, the atomic group will kick in. The
engine will discard all backtracking positions. This means that it will
not search for ‘this’ inside ’smashing’. Why? If ‘his’ did not return a
match, then obviously ‘this’ (which includes ‘his’) will not return
positive either.</p>
<p>The above example did not have many practical uses. We might as well have used <code>/t?his?/</code> instead. Look at the following:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/\b(engineer|engrave|</span><span >end</span><span>)\b/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/\b(engineer|engrave|end)\b/</pre>

<p>If the regex engine is given the word ‘engineering’, it will
correctly match ‘engineer’. The next word boundary, \b, will not match.
Thus, it will move on to the next match: engrave. It realizes that the
‘eng’ matches, but the rest do not. Finally, ‘end’ is attempted and
also failed. If you look carefully, you will realize that once the
engine matches ‘engineer’ and fails the last word boundary, it can not
possibly match ‘engrave’ or ‘end’. These two matches are smaller words
than ‘engineer’, and thus the regex engine should not continue with the
other trials.</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/\b(?&gt;engineer|engrave|</span><span >end</span><span>)\b/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/\b(?&gt;engineer|engrave|end)\b/</pre>

<p>The above is a much better alternative that will save the regex engine time and improve the code’s efficiency.</p>
<h3>6. Recursion</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" style="display: inline;" original="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/recursion.jpg" src="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/recursion.jpg" alt="Recursion" height="300" width="400"></p>
<p><strong>Recursion</strong> in regular expressions can be used to match nested constructs, such as parentheses, (this (that)), and HTML tags, <code>&lt;div&gt;&lt;/div&gt;</code>. They require the use of <code>(?R)</code>, an operator that matches recursive sub-patterns. Consider the regular expression that matches nested parentheses:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/\(((?&gt;[^()]+)|(?R))*\)/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/\(((?&gt;[^()]+)|(?R))*\)/</pre>

<p>The outermost parentheses in this regular expression match the
beginning of the nested constructs. Then comes an optional operator,
which can either match non-parenthetical characters (<code>?&gt;[^()]+</code>)
or the whole expression again in a sub-pattern, (?R). Notice that this
operator is repeated as many times as possible to match all nested
parentheses.</p>
<p>Another example of recursion at work is the following:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/&lt;([\w]+).*?&gt;((?&gt;[^&lt;&gt;]+)|((?R)))*&lt;\/\1&gt;/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/&lt;([\w]+).*?&gt;((?&gt;[^&lt;&gt;]+)|((?R)))*&lt;\/\1&gt;/</pre>
<p>The above expression combines character groups, greedy operators,
back-tracking, and atomic groups to match nested tags. The first
parenthesized group ([\w]+) matches the tag name for use later in the
regular expression. It then proceeds to match the rest of the tag. The
next parenthesized sub-expression is very similar to the one above. It
either matches non-tag (?&gt;[^&lt;&gt;]+) characters or recurses over
another tag (?R). Finally, the last part of the expression matches the
close tag.</p>
<h3>7. Callbacks</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" style="display: inline;" original="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/call.jpg" src="http://media2.smashingmagazine.com/images/advanced-regular-expressions-php/call.jpg" alt="Callbacks" height="290" width="400"></p>
<p>Certain matches in a pattern may require special modifications. In order to apply multiple or complex changes, <strong>callbacks</strong> can be used. A callback is used for dynamic substitution Strings in the <code>preg_replace_callback</code>
function. They take in a function as a parameter to use when a match is
found. This function receives the match array as a parameter and
returns a modified string that is used as a replacement.</p>
<p>As an example, consider a regular expression that changes all words
to uppercase in a given string. Unfortunately, PHP does not have a
regex operator that changes a character to a different case. To
accomplish this task, a callback may be used. First, the expression
must match all letters that need to be capitalized:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/\b\w/&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/\b\w/</pre>

<p>The above uses both word boundaries and character classes to work.
Now that we have this expression, we can write a callback function:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span >function</span><span>&nbsp;upper_case(&nbsp;</span><span >$matches</span><span>&nbsp;)&nbsp;{&nbsp;&nbsp;</span></span></li><li ><span>&nbsp;&nbsp;&nbsp;&nbsp;<span >return</span><span>&nbsp;</span><span >strtoupper</span><span>(&nbsp;</span><span >$matches</span><span>[0]&nbsp;);&nbsp;&nbsp;</span></span></li><li ><span>}&nbsp;&nbsp;</span></li></ol></div><pre style="display: none;"  >function upper_case( $matches ) {
 return strtoupper( $matches[0] );
}</pre>

<p><code>upper_case</code> takes in an array of matches and returns the whole matched pattern in uppercase. <code>$matches[0]</code>, in this case, represents the letter that needs to be capitalized. All of this can now be put together using the <code>preg_replace_callback</code> function:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>preg_replace_callback(&nbsp;</span><span >'/\b\w/'</span><span>,&nbsp;</span><span >"upper_case"</span><span>,&nbsp;</span><span >$str</span><span>&nbsp;);&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >preg_replace_callback( '/\b\w/', "upper_case", $str );</pre>

<p>That is the power of a simple callback.</p>
<h3>8. Commenting</h3>
<p><img title="Crucial Concepts Behind Advanced Regular Expressions(转) -  小和尚 - 小和尚真情无限" style="display: inline;" original="http://media1.smashingmagazine.com/images/advanced-regular-expressions-php/comment.jpg" src="http://media1.smashingmagazine.com/images/advanced-regular-expressions-php/comment.jpg" alt="Commenting" height="300" width="400"></p>
<p><strong>Commenting</strong> is not a way to actually match strings,
but it is one of the most important parts of regular expressions. As
you dive deep into larger, more complex expressions, it becomes hard to
decipher what is actually being matched. Using comments in the middle
of regular expressions is the perfect way to minimize such confusion.</p>
<p>To place a comment inside a regular expression, use the <code>(?#comment)</code> format. Replace “comment” with the word(s) of your choice:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/(?</span><span >#digit)\d/</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/(?#digit)\d/</pre>

<p>It is especially important to comment regular expressions that you
release to the public. Users of your regex will be able to easily
understand and modify the pattern to meet their needs. It can even go
so far as to help you decode it when revisiting a program.</p>
<p>Consider using the “x” or (?x) modifier for free-spacing mode with
comments. This causes a regular expression to ignore white space
between tokens. All spaces can still be represented with <code>[ ]</code> or <code>\ </code> (a backslash and a space):</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/&nbsp;&nbsp;</span></span></li><li ><span>\d&nbsp;&nbsp;&nbsp;&nbsp;<span >#digit</span><span>&nbsp;&nbsp;</span></span></li><li ><span>[&nbsp;]&nbsp;&nbsp;&nbsp;<span >#space</span><span>&nbsp;&nbsp;</span></span></li><li ><span>\w+&nbsp;&nbsp;&nbsp;<span >#word</span><span>&nbsp;&nbsp;</span></span></li><li ><span>/x&nbsp;&nbsp;</span></li></ol></div><pre style="display: none;"  >/
\d    #digit
[ ]   #space
\w+   #word
/x</pre>

<p>The above is the same as:</p>
<div ><div ><div ><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >view plain</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >copy to clipboard</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >print</a><a href="http://www.smashingmagazine.com/2009/05/06/introduction-to-advanced-regular-expressions/#" >?</a></div></div><ol ><li ><span><span>/\d(?</span><span >#digit)[&nbsp;](?#space)\w+(?#word)/</span><span>&nbsp;&nbsp;</span></span></li></ol></div><pre style="display: none;"  >/\d(?#digit)[ ](?#space)\w+(?#word)/</pre>

<p>Always create well-documented code.</p>
<h3>Further Resources</h3>
<ul><li><a href="http://www.regular-expressions.info/">Regular-Expressions.info</a><br>Comprehensive website on regular expressions</li><li><a href="http://www.addedbytes.com/cheat-sheets/regular-expressions-cheat-sheet/">Cheat Sheet</a><br>Informative regular expressions cheat sheet</li><li><a href="http://www.jslab.dk/tools.regex.php">Regex Generator</a><br>JavaScript regular expressions generator</li></ul>
<h4>About the author</h4><em>Karthik Viswanathan is a high-school student who loves to program and create websites. You can view Karthik’s work on his blog, <a href="http://www.lateralcode.com/">Lateral Code</a>, and explore the most popular articles on the Web through his online <a href="http://twitter.lateralcode.com/">Twitter application</a>.</em><br><br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200952011585455</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200952011585455</guid>
    <pubDate>Sat, 20 Jun 2009 11:58:05 +0800</pubDate>
    <dcterms:modified>2009-06-20T11:58:05+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[dd奇技淫巧]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/139685482009518201234</link>
    <description><![CDATA[<div><p>在cu上看到一个帖子：http://bbs2.chinaunix.net/viewthread.php?tid=1469980&amp;extra=&amp;page=1</p><p>
<span style="font-size: 16px; color: rgb(0, 0, 0);">
 
<b>怎样对一个大文件的某个字节进行直接修改</b></span></p><div>比如我想把一个很大的视频文件中的第i个字节的值改成0x41（也就是大写字母A的ASCII值），<br>
不用C的话，有没有现成的工具可以用啊？<br>实现：
echo A | dd of=bigfile seek=$i bs=1 count=1 conv=notrunc<br>股沟之：<br></div>
<p><br></p><p>一、dd命令的解释。</p>
<p>dd：用指定大小的块拷贝一个文件，并在拷贝的同时进行指定的转换。</p>
<p>注意：指定数字的地方若以下列字符结尾则乘以相应的数字：b=512；c=1；k=1024；w=2</p>
<p>参数：</p>
<p>1. if=文件名：输入文件名，缺省为标准输入。即指定源文件。&lt; if=input file &gt;</p>
<p>2. of=文件名：输出文件名，缺省为标准输出。即指定目的文件。&lt; of=output file &gt;</p>
<p>3. ibs=bytes：一次读入bytes个字节，即指定一个块大小为bytes个字节。</p>
<p>&nbsp;&nbsp;&nbsp; obs=bytes：一次输出bytes个字节，即指定一个块大小为bytes个字节。</p>
<p>&nbsp;&nbsp;&nbsp; bs=bytes：同时设置读入/输出的块大小为bytes个字节。</p>
<p>4. cbs=bytes：一次转换bytes个字节，即指定转换缓冲区大小。</p>
<p>5. skip=blocks：从输入文件开头跳过blocks个块后再开始复制。</p>
<p>6. seek=blocks：从输出文件开头跳过blocks个块后再开始复制。</p>
<p>注意：通常只用当输出文件是磁盘或磁带时才有效，即备份到磁盘或磁带时才有效。</p>
<p>7. count=blocks：仅拷贝blocks个块，块大小等于ibs指定的字节数。</p>
<p>8. conv=conversion：用指定的参数转换文件。</p>
<p>&nbsp;&nbsp;&nbsp; ascii：转换ebcdic为ascii</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; ebcdic：转换ascii为ebcdic</p>
<p>&nbsp;&nbsp;&nbsp; ibm：转换ascii为alternate ebcdic</p>
<p>&nbsp;&nbsp;&nbsp; block：把每一行转换为长度为cbs，不足部分用空格填充</p>
<p>&nbsp;&nbsp;&nbsp; unblock：使每一行的长度都为cbs，不足部分用空格填充</p>
<p>&nbsp;&nbsp;&nbsp; lcase：把大写字符转换为小写字符</p>
<p>&nbsp;&nbsp;&nbsp; ucase：把小写字符转换为大写字符</p>
<p>&nbsp;&nbsp;&nbsp; swab：交换输入的每对字节</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; noerror：出错时不停止</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; notrunc：不截短输出文件</p>
<p>&nbsp;&nbsp;&nbsp; sync：将每个输入块填充到ibs个字节，不足部分用空（NUL）字符补齐。</p>
<p>二、dd应用实例。</p>
<p>1.将本地的/dev/hdb整盘备份到/dev/hdd</p>
<p>&nbsp;&nbsp; dd if=/dev/hdb of=/dev/hdd</p>
<p>2.将/dev/hdb全盘数据备份到指定路径的image文件</p>
<p>&nbsp;&nbsp; dd if=/dev/hdb of=/root/image</p>
<p>3.将备份文件恢复到指定盘</p>
<p>&nbsp;&nbsp; dd if=/root/image of=/dev/hdb</p>
<p>4.备份/dev/hdb全盘数据，并利用gzip工具进行压缩，保存到指定路径</p>
<p>&nbsp;&nbsp;&nbsp; dd if=/dev/hdb | gzip &gt; /root/image.gz</p>
<p>5.将压缩的备份文件恢复到指定盘</p>
<p>&nbsp;&nbsp; gzip -dc /root/image.gz | dd of=/dev/hdb</p>
<p>6.备份磁盘开始的512个字节大小的MBR信息到指定文件</p>
<p>&nbsp;&nbsp; dd if=/dev/hda of=/root/image count=1 bs=512</p>
<p>&nbsp;&nbsp; count=1指<span style="color: rgb(255, 0, 255);">仅拷贝一个块</span>；bs=512指<span style="color: rgb(255, 0, 255);">块大小为512个字节</span>。</p>
<p>&nbsp;&nbsp; 恢复：dd if=/root/image of=/dev/hda</p>
<p>7.备份软盘</p>
<p>&nbsp;&nbsp; dd if=/dev/fd0 of=disk.img count=1 bs=1440k (即块大小为1.44M)</p>
<p>8.拷贝内存内容到硬盘</p>
<p>&nbsp;&nbsp; dd if=/dev/mem of=/root/mem.bin bs=1024 (指定块大小为1k)&nbsp;&nbsp;</p>
<p>9.拷贝光盘内容到指定文件夹，并保存为cd.iso文件</p>
<p>&nbsp;&nbsp; dd if=/dev/cdrom(hdc) of=/root/cd.iso</p>
<p>10.增加swap分区文件大小</p>
<p>第一步：创建一个大小为256M的文件：</p>
<p><span style="color: rgb(255, 0, 0);">dd if=/dev/zero of=/swapfile bs=1024 count=262144</span></p>
<p>第二步：把这个文件变成swap文件：</p>
<p><span style="color: rgb(255, 0, 0);">mkswap /swapfile</span></p>
<p>第三步：启用这个swap文件：</p>
<p><span style="color: rgb(255, 0, 0);">swapon /swapfile</span></p>
<p>第四步：编辑/etc/fstab文件，使在每次开机时自动加载swap文件：</p>
<p><span style="color: rgb(255, 0, 0);">/swapfile&nbsp;&nbsp;&nbsp; swap&nbsp;&nbsp;&nbsp; swap&nbsp;&nbsp;&nbsp; default&nbsp;&nbsp; 0 0</span></p>
<p>11.销毁磁盘数据</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/urandom of=/dev/hda1</p>
<p>注意：<span style="color: rgb(255, 0, 0);">利用随机的数据填充硬盘</span>，在某些必要的场合可以用来销毁数据。</p>
<p>12.测试硬盘的读写速度</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dd if=/root/1Gb.file bs=64k | dd of=/dev/null</p>
<p>通过以上两个命令输出的命令执行时间，可以计算出硬盘的读、写速度。</p>
<p>13.确定硬盘的最佳块大小：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file</p>
<p>通过比较以上命令输出中所显示的<span style="color: rgb(255, 0, 255);">命令执行时间</span>，即可确定系统最佳的块大小。</p>
<p>14.修复硬盘：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; dd if=/dev/sda of=/dev/sda 或dd if=/dev/hda of=/dev/hda</p>
<p>当硬盘较长时间(一年以上)放置不使用后，磁盘上会产生magnetic flux
point，当磁头读到这些区域时会遇到困难，并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时，可能导致硬盘报废。上边的命令有可能使这些数
据起死回生。并且这个过程是安全、高效的。</p>



<div><span style="color: rgb(255, 102, 0);"><strong>/dev/null和/dev/zero的区别</strong></span></div>
<div><span style="color: rgb(255, 102, 0);"><strong></strong></span></div>
/dev/null，外号叫无底洞，你可以向它输出任何数据，它通吃，并且不会撑着！<br>/dev/zero,是一个输入设备，你可你用它来初始化文件。

<p>/dev/null，外号叫无底洞，你可以向它输出任何数据，它通吃，并且不会撑着！<br>/dev/zero,是一个输入设备，你可你用它来初始化文件。</p>

<div>/dev/null------它是空设备，也称为位桶（bit bucket）。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件，那么可以将消息重定向到位桶。<br>/dev/zero------该设备无穷尽地提供0，可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入字符串0。</div>
<p>oracle@localhost oracle]$if=/dev/zero of=./test.txt bs=1k count=1<br>oracle@localhost oracle]$ ls -l<br>total 4<br>-rw-r--r--&nbsp; &nbsp; 1 oracle&nbsp; &nbsp;dba&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 1024 Jul 15 16:56 test.txt</p>

<p>eg,<br><br>&nbsp; &nbsp; find / -name access_log&nbsp;&nbsp;2&gt;/dev/null</p>



<p>使用/dev/null <br>把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.</p>
<p>禁止标准输出.&nbsp;&nbsp;&nbsp; 1 cat $filename &gt;/dev/null<br>&nbsp;&nbsp; 2 # 文件内容丢失，而不会输出到标准输出.<br>&nbsp;</p>
<p><br>禁止标准错误 (来自例子 12-3).&nbsp;&nbsp;&nbsp; 1 rm $badname 2&gt;/dev/null<br>&nbsp;&nbsp; 2 #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样错误信息[标准错误]就被丢到太平洋去了.<br>&nbsp;</p>
<p><br>禁止标准输出和标准错误的输出.&nbsp;&nbsp;&nbsp; 1 cat $filename 2&gt;/dev/null &gt;/dev/null<br>&nbsp;&nbsp; 2 # 如果"$filename"不存在，将不会有任何错误信息提示.<br>&nbsp;&nbsp; 3 # 如果"$filename"存在, 文件的内容不会打印到标准输出.<br>&nbsp;&nbsp; 4 # 因此Therefore, 上面的代码根本不会输出任何信息.<br>&nbsp;&nbsp; 5 #<br>&nbsp;&nbsp; 6 #&nbsp; 当只想测试命令的退出码而不想有任何输出时非常有用。<br>&nbsp;&nbsp; 7 #<br>&nbsp;&nbsp; 8 #<br>&nbsp;&nbsp; 9 # cat $filename &amp;&gt;/dev/null<br>&nbsp; 10 #&nbsp;&nbsp;&nbsp;&nbsp; 也可以, 由 Baris Cicek 指出.<br>&nbsp;</p>
<p><br>Deleting contents of a file, but preserving the file itself,
with all attendant permissions (from Example 2-1 and Example 2-3):&nbsp;&nbsp;&nbsp; 1
cat /dev/null &gt; /var/log/messages<br>&nbsp;&nbsp; 2 #&nbsp; : &gt; /var/log/messages&nbsp;&nbsp; 有同样的效果, 但不会产生新的进程.（因为:是内建的）<br>&nbsp;&nbsp; 3 <br>&nbsp;&nbsp; 4 cat /dev/null &gt; /var/log/wtmp<br>&nbsp;</p>
<p><br>自动清空日志文件的内容 (特别适合处理这些由商业Web站点发送的讨厌的"cookies"):</p>
<p><br>--------------------------------------------------------------------------------</p>
<p>例子 28-1. 隐藏cookie而不再使用</p>
<p>&nbsp;&nbsp; 1 if [ -f ~/.netscape/cookies ]&nbsp; # 如果存在则删除.<br>&nbsp;&nbsp; 2 then<br>&nbsp;&nbsp; 3&nbsp;&nbsp; rm -f ~/.netscape/cookies<br>&nbsp;&nbsp; 4 fi<br>&nbsp;&nbsp; 5 <br>&nbsp;&nbsp; 6 ln -s /dev/null ~/.netscape/cookies<br>&nbsp;&nbsp; 7 # 现在所有的cookies都会丢入黑洞而不会保存在磁盘上了.<br>&nbsp;</p>
<p>--------------------------------------------------------------------------------</p>
<p>使用/dev/zero <br>像/dev/null一样, /dev/zero也是一个伪文件,
但它实际上产生连续不断的null的流（二进制的零流，而不是ASCII型的）. 写入它的输出会丢失不见,
而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到.
/dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件，就像临时交换文件.</p>
<p><br>--------------------------------------------------------------------------------</p>
<p>例子 28-2. 用/dev/zero创建一个交换临时文件</p>
<p>&nbsp;&nbsp; 1 #!/bin/bash<br>&nbsp;&nbsp; 2 # 创建一个交换文件.<br>&nbsp;&nbsp; 3 <br>&nbsp;&nbsp; 4 ROOT_UID=0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # Root 用户的 $UID 是 0.<br>&nbsp;&nbsp; 5 E_WRONG_USER=65&nbsp;&nbsp;&nbsp; # 不是 root?<br>&nbsp;&nbsp; 6 <br>&nbsp;&nbsp; 7 FILE=/swap<br>&nbsp;&nbsp; 8 BLOCKSIZE=1024<br>&nbsp;&nbsp; 9 MINBLOCKS=40<br>&nbsp; 10 SUCCESS=0<br>&nbsp; 11 <br>&nbsp; 12 <br>&nbsp; 13 # 这个脚本必须用root来运行.<br>&nbsp; 14 if [ "$UID" -ne "$ROOT_UID" ]<br>&nbsp; 15 then<br>&nbsp; 16&nbsp;&nbsp; echo; echo "You must be root to run this script."; echo<br>&nbsp; 17&nbsp;&nbsp; exit $E_WRONG_USER<br>&nbsp; 18 fi&nbsp; <br>&nbsp; 19&nbsp;&nbsp; <br>&nbsp; 20 <br>&nbsp; 21 blocks=${1:-$MINBLOCKS}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; 如果命令行没有指定，<br>&nbsp; 22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #+ 则设置为默认的40块.<br>&nbsp; 23 # 上面这句等同如：<br>&nbsp; 24 # --------------------------------------------------<br>&nbsp; 25 # if [ -n "$1" ]<br>&nbsp; 26 # then<br>&nbsp; 27 #&nbsp;&nbsp; blocks=$1<br>&nbsp; 28 # else<br>&nbsp; 29 #&nbsp;&nbsp; blocks=$MINBLOCKS<br>&nbsp; 30 # fi<br>&nbsp; 31 # --------------------------------------------------<br>&nbsp; 32 <br>&nbsp; 33 <br>&nbsp; 34 if [ "$blocks" -lt $MINBLOCKS ]<br>&nbsp; 35 then<br>&nbsp; 36&nbsp;&nbsp; blocks=$MINBLOCKS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 最少要有 40 个块长.<br>&nbsp; 37 fi&nbsp; <br>&nbsp; 38 <br>&nbsp; 39 <br>&nbsp; 40 echo "Creating swap file of size $blocks blocks (KB)."<br>&nbsp; 41 dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks&nbsp; # 把零写入文件.<br>&nbsp; 42 <br>&nbsp; 43 mkswap $FILE $blocks&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 将此文件建为交换文件（或称交换分区）.<br>&nbsp; 44 swapon $FILE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 激活交换文件.<br>&nbsp; 45 <br>&nbsp; 46 echo "Swap file created and activated."<br>&nbsp; 47 <br>&nbsp; 48 exit $SUCCESS<br>&nbsp;</p>
<p>--------------------------------------------------------------------------------</p>
<p>关于 /dev/zero 的另一个应用是为特定的目的而用零去填充一个指定大小的文件, 如挂载一个文件系统到环回设备 （loopback device） (参考例子 13-8) 或"安全地" 删除一个文件(参考例子 12-55).</p>
<p><br>--------------------------------------------------------------------------------</p>
<p>例子 28-3. 创建ramdisk</p>
&nbsp;&nbsp; 1 #!/bin/bash<br>&nbsp;&nbsp; 2 # ramdisk.sh<br>&nbsp;&nbsp; 3 <br>&nbsp;&nbsp; 4 #&nbsp; "ramdisk"是系统RAM内存的一段，<br>&nbsp;&nbsp; 5 #+ 它可以被当成是一个文件系统来操作.<br>&nbsp;&nbsp; 6 #&nbsp; 它的优点是存取速度非常快 (包括读和写).<br>&nbsp;&nbsp; 7 #&nbsp; 缺点: 易失性, 当计算机重启或关机时会丢失数据.<br>&nbsp;&nbsp; 8 #+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 会减少系统可用的RAM.<br>&nbsp;&nbsp; 9 #<br>&nbsp; 10 #&nbsp; 那么ramdisk有什么作用呢?<br>&nbsp; 11 #&nbsp; 保存一个较大的数据集在ramdisk, 比如一张表或字典,<br>&nbsp; 12 #+ 这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.<br>&nbsp; 13 <br>&nbsp; 14 <br>&nbsp; 15 E_NON_ROOT_USER=70&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 必须用root来运行.<br>&nbsp; 16 ROOTUSER_NAME=root<br>&nbsp; 17 <br>&nbsp; 18 MOUNTPT=/mnt/ramdisk<br>&nbsp; 19 SIZE=2000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 2K 个块 (可以合适的做修改)<br>&nbsp; 20 BLOCKSIZE=1024&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 每块有1K (1024 byte) 的大小<br>&nbsp; 21 DEVICE=/dev/ram0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 第一个 ram 设备<br>&nbsp; 22 <br>&nbsp; 23 username=`id -nu`<br>&nbsp; 24 if [ "$username" != "$ROOTUSER_NAME" ]<br>&nbsp; 25 then<br>&nbsp; 26&nbsp;&nbsp; echo "Must be root to run \"`basename $0`\"."<br>&nbsp; 27&nbsp;&nbsp; exit $E_NON_ROOT_USER<br>&nbsp; 28 fi<br>&nbsp; 29 <br>&nbsp; 30 if [ ! -d "$MOUNTPT" ]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #&nbsp; 测试挂载点是否已经存在了,<br>&nbsp; 31 then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了<br>&nbsp; 32&nbsp;&nbsp; mkdir $MOUNTPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #+ 因为前面已经建立了.<br>&nbsp; 33 fi<br>&nbsp; 34 <br>&nbsp; 35 dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE&nbsp; # 把RAM设备的内容用零填充.<br>&nbsp; 36&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 为何需要这么做?<br>&nbsp; 37 mke2fs $DEVICE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 在RAM设备上创建一个ext2文件系统.<br>&nbsp; 38 mount $DEVICE $MOUNTPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 挂载设备.<br>&nbsp; 39 chmod 777 $MOUNTPT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 使普通用户也可以存取这个ramdisk.<br>&nbsp; 40&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 但是, 只能由root来缷载它.<br>&nbsp; 41 <br>&nbsp; 42 echo "\"$MOUNTPT\" now available for use."<br>&nbsp; 43 # 现在 ramdisk 即使普通用户也可以用来存取文件了.<br>&nbsp; 44 <br>&nbsp; 45 #&nbsp; 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.<br>&nbsp; 46 #<br>&nbsp; 47 #&nbsp; 拷贝所有你想保存文件到一个常规的磁盘目录下.<br>&nbsp; 48 <br>&nbsp; 49 # 重启之后, 运行这个脚本再次建立起一个 ramdisk.<br>&nbsp; 50 # 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.<br>&nbsp; 51 <br>&nbsp; 52 #&nbsp; 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,<br>&nbsp; 53 #+ 以使系统启动时能自动设立一个ramdisk.<br>&nbsp; 54 #&nbsp; 这样很合适速度要求高的数据库服务器.<br>&nbsp; 55 <br>&nbsp; 56 exit 0<br><br><br>这样，一些诸如一些错误信息就不会显示出来</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/139685482009518201234</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/139685482009518201234</guid>
    <pubDate>Thu, 18 Jun 2009 14:00:01 +0800</pubDate>
    <dcterms:modified>2009-06-18T14:00:45+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[ 如何优化你的php（二）]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/139685482009426113210323</link>
    <description><![CDATA[<div><style>
<!--    @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;}    p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} p  {mso-margin-top-alt:auto;  margin-right:0cm;  mso-margin-bottom-alt:auto;  margin-left:0cm;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:宋体;  mso-bidi-font-family:宋体;}    @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;} -->
-->--></style>

<p><span style="font-size: 10.5pt;">翻译：http://phplens.com/lens/php-book/optimizing-debugging-php.php</span></p><p><span style="font-size: 10.5pt;">今天翻译着翻译着，已经烦了，看来真的持之以恒做一件事很难，尤其是不太喜欢的事情，我略过和跳过，和翻译错了很多。<br></span></p><p><span style="font-size: 10.5pt;">为<span lang="EN-US">php</span>调试你的<span lang="EN-US">web</span>服务器<span lang="EN-US"></span></span></p>

<p style="text-indent: 21pt;"><span style="font-size: 10.5pt;">我们将论述在今天两种非常常用的<span lang="EN-US">web</span>服务器如何得到最好的性能，<span lang="EN-US">apache1.2</span>和<span lang="EN-US">iis</span>，当然也有许多关于服务<span lang="EN-US">html</span>的建议。<span lang="EN-US"></span></span></p>

<p><span style="font-size: 10.5pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span>Php</span><span style="font-size: 10.5pt;">的作者表示<span lang="EN-US">apache2.0</span>相对于<span lang="EN-US">apache1.3</span>没有性能和架构的优点，特别是多线程模式，但<span lang="EN-US">apache2.0</span>以预分配模式运行的时候，下面的讨论依然有关系（<span lang="EN-US">2003</span>年<span lang="EN-US">11 21</span>）<span lang="EN-US"></span></span></p>

<p style="text-indent: 21pt;"><span style="font-size: 10.5pt;">（<span lang="EN-US">a
apache1.3/2.0</span></span></p>

<p><span style="font-size: 10.5pt;" lang="EN-US">apache</span><span style="font-size: 10.5pt;">可以运行在<span lang="EN-US">unix</span>和<span lang="EN-US">windows</span>上面，它是当今世界最流行的服务器，<span lang="EN-US">apache1.3</span>在服务器运行时用了预分配模式，但它启动时，它会创建多个子进程来处理<span lang="EN-US">http</span>请求，初始化的父进程间就像一个呵护天使，确保每个子进程工作地顺利同时协调所有的事情，越多的<span lang="EN-US">http</span>请求过来，越多的子进程出来处理它们，但<span lang="EN-US">http</span>请求慢下来的时候，父进程会杀死一个空闲的进程，为别的进程释放资源，这个模式使得<span lang="EN-US">apache</span>非常的健壮，即使一个子进程崩溃了，父进程和别的进程是和这个崩溃的进程独立的。<span lang="EN-US"></span></span></p>

<p><span style="font-size: 10.5pt;">预分配模式不像别的设计的那么快，但对我来说，服务一个<span lang="EN-US">php</span>脚本足够了，当<span lang="EN-US">apache</span>性能组织非常重大的影响前还有很多别的瓶颈要找。<span lang="EN-US">Apache</span>的健壮性和信赖性非常重要。<span lang="EN-US"></span></span></p>

<p><span style="font-size: 10.5pt;" lang="EN-US">Apace2.0</span><span style="font-size: 10.5pt;">提供了在执行时采用多线程模式，我的测试表明在这种模式下只有一点性能上的优点。当然好多<span lang="EN-US">php</span>的扩展部兼容。<span lang="EN-US">Apache2.0.47</span>（<span lang="EN-US">2003</span>）。<span lang="EN-US"></span></span></p>

<p><span style="font-size: 10.5pt;" lang="EN-US">Apache</span><span style="font-size: 10.5pt;">的配置使用<span lang="EN-US">httpd.conf</span>，下面的参数在配置子进程的时候非常重要。<span lang="EN-US"></span></span></p>

<table style="width: 486.75pt;" width="649" border="1" cellpadding="0" cellspacing="1">
 <tbody><tr style="">
  <td style="padding: 5.25pt; width: 21%;" valign="top" width="21%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: 宋体;">命令</span></b><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span></b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 13%;" valign="top" width="13%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: 宋体;">默认</span></b><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span></b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 65%;" valign="top" width="65%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: 宋体;">描述</span></b><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span></b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 21%;" valign="top" width="21%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">MaxClients</span><span style="font-size: 7.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 13%;" valign="top" width="13%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">256 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 65%;" valign="top" width="65%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">最大的子进程的数量，默认的意思是最多同时处理</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">256</span><span style="font-size: 12pt; font-family: 宋体;">个</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-size: 12pt; font-family: 宋体;">请求，多的连接被放在队列里。</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 21%;" valign="top" width="21%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">StartServers</span><span style="font-size: 7.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 13%;" valign="top" width="13%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">5 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 65%;" valign="top" width="65%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">启动时候创建的子进程个数</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 21%;" valign="top" width="21%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">MinSpareServers</span><span style="font-size: 7.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 13%;" valign="top" width="13%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">5 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 65%;" valign="top" width="65%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">需要创建的空闲子进程的数目，如果子进程的数目低于这个数字，</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">个子进程被初始化创建，然后是</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">2</span><span style="font-size: 12pt; font-family: 宋体;">个，后来是</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">4</span><span style="font-size: 12pt; font-family: 宋体;">个，直到</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">32</span><span style="font-size: 12pt; font-family: 宋体;">个被创建每秒钟</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 21%;" valign="top" width="21%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">MaxSpareServers</span><span style="font-size: 7.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 13%;" valign="top" width="13%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">10 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 65%;" valign="top" width="65%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">如果激活的子进程多于这个数字，多的进程将被中止掉</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 21%;" valign="top" width="21%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">MaxRequestsPerChild
  </span><span style="font-size: 7.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 13%;" valign="top" width="13%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 65%;" valign="top" width="65%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">子进程中止前能处理的</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-size: 12pt; font-family: 宋体;">请求数</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">设置成</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0 </span><span style="font-size: 12pt; font-family: 宋体;">表示永远不终止</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-size: 12pt; font-family: 宋体;">设置为</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">100</span><span style="font-size: 12pt; font-family: 宋体;">到</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">10000</span><span style="font-size: 12pt; font-family: 宋体;">如果你怀疑有内存泄漏，或者来释放一些没有用的资源</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">. </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
</tbody></table>

<p><span style="font-size: 10.5pt;">如果是大一点的网站，值设置成下面的会好一点：<span lang="EN-US"></span></span></p>

<p><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">MinSpareServers
32 </span></p>

<p><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">MaxSpareServers
64</span></p>

<p><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">Apache</span><span style="font-size: 10.5pt;">在</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span><span style="font-size: 10.5pt;">有点不一样，它不是用子进程，而是用线程，上面的参数将不会用到，相比我们有一个参数：</span><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">ThreadsPerChild</span></i><i><span style="font-size: 10.5pt;">，默认的是</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">50</span></i><i><span style="font-size: 10.5pt;">，这个参数表示</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">apache</span></i><i><span style="font-size: 10.5pt;">可以多少个线程交换</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">.</span></i><i><span style="font-size: 10.5pt;">在</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span></i><i><span style="font-size: 10.5pt;">的版主中只有一个子进程，默认的设置成</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">50<span style="">&nbsp;&nbsp; </span></span></i><i><span style="font-size: 10.5pt;">当前只可以处理</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">50</span></i><i><span style="font-size: 10.5pt;">个请求。但</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">web</span></i><i><span style="font-size: 10.5pt;">服务器经历高的网络流量时，增加它在</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">256</span></i><i><span style="font-size: 10.5pt;">和</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">1024</span></i><i><span style="font-size: 10.5pt;">之间，一些有用的参数你可以改变，包括如下：</span></i><i><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></i></p>

<table style="width: 465.75pt;" width="621" border="1" cellpadding="0" cellspacing="1">
 <tbody><tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: 宋体;">参数</span></b><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span></b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: 宋体;">默认</span></b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: 宋体;">描述</span></b><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">SendBufferSize </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">设置成操作系统默认的</span><span style="font-family: &quot;Courier New&quot;;"> </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">决定在用</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tcp/ip</span><span style="font-family: 宋体;">连接时候用到的输出的缓冲大小。对于忙的网络是非常有用的当你缓存时候，你可以设置这个参数关闭最大的文件下载。每个客户端连接的时候</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tcp/ip</span><span style="font-family: 宋体;">缓冲都会创建。</span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">KeepAlive [on|off]</span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">On </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">在老的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-family: 宋体;">协议中，每个</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-family: 宋体;">请求都需要在服务器上单独建立个连接。为了减少过多的正常连接，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">keep-live</span><span style="font-family: 宋体;">的头被发展开了，它告诉服务器继续使用同一个</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">socket</span><span style="font-family: 宋体;">处理多个请求，如果一个独立的专为突破服务器的服务器，你可以关闭这个选项，这个技术很大的提高了资源的可用性</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">. </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">KeepAliveTimeout </span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">15 </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">这个数字式保持</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">socket</span><span style="font-family: 宋体;">连接的存活时间，这个时间包括服务器生成内容，和客户机响应，如果客户机不响应，他将生成一个新连接。这个值得将保持低值做为</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">socket</span><span style="font-family: 宋体;">扩展时代的空闲</span><span style="font-family: &quot;Courier New&quot;;"> </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">MaxKeepAliveRequests </span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">100 </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">当它设置的值达到的时候</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">socket</span><span style="font-family: 宋体;">的连接将会被终止，保持这个高数字，在</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">maxclients</span><span style="font-family: 宋体;">和</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">threadsperchild</span><span style="font-family: 宋体;">之间</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">TimeOut </span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">300 </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">当空闲时间超出这个断开连接</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">.</span><span style="font-family: 宋体;">但你的用户很少的时候你可以设置的很低</span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 33.5%;" valign="top" width="33%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">LimitRequestBody </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 19.74%;" valign="top" width="19%">
  <p style="text-align: left;" align="left"><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">0 </span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 46.16%;" valign="top" width="46%">
  <p style="text-align: left;" align="left"><span style="font-family: 宋体;">最大的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">post</span><span style="font-family: 宋体;">或者</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">get</span><span style="font-family: 宋体;">的值</span><span style="font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
</tbody></table>

<p><span style="font-size: 10.5pt;">如果你不需要</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">dns</span><span style="font-size: 10.5pt;">轮询同时你不需要</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">httaccess</span><span style="font-size: 10.5pt;">文件配置你的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">apache</span><span style="font-size: 10.5pt;">设置你可以设置的私人的目录：</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"># </span><span style="font-size: 9pt;">禁用</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">dns</span><span style="font-size: 9pt;">轮询</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">php</span><span style="font-size: 9pt;">脚本只得到</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">ip</span><span style="font-size: 9pt;">地址</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">&nbsp; </span></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">HostnameLookups
<b>off </b></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"># </span><span style="font-size: 9pt;">关闭</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">htaccess</span><span style="font-size: 9pt;">的检查</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">&lt;Directory
/&gt; </span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">AllowOverride
<b>none </b></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">&lt;/Directory&gt;
</span></p>

<p><span style="font-size: 9pt;">但有符号链接的时候，如果你不担心路径的安全，打开</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">FollowSymLinks</span><span style="font-size: 9pt;">，关闭</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">SymLinksIfOwnerMatch</span><span style="font-size: 9pt;">，防止多余的</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">lstat</span><span style="font-size: 9pt;">系统调用，当创造的时候。</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">Options
FollowSymLinks </span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">#Options
SymLinksIfOwnerMatch</span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">(b iis </span><span style="font-size: 9pt;">的调试：</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 9pt;">跳过</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 9pt;">在</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span><span style="font-size: 9pt;">下的高性能：</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">iis</span><span style="font-size: 9pt;">和</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">fastcgi<br>
</span><span style="font-size: 9pt;">通过多次测试，我发现在</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">windows</span><span style="font-size: 9pt;">下最好的性能是</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">iis</span><span style="font-size: 9pt;">用</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">fastcgi</span><span style="font-size: 9pt;">方式，</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cgi</span><span style="font-size: 9pt;">是个协议为服务器调用其他程序，它不快，因为每次页面请求完后，他就中止了，</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">fastcgi</span><span style="font-size: 9pt;">为了高性能，修改了这个协议，使得每个页面请求完，</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cgi</span><span style="font-size: 9pt;">程序永久的，当心的页面过来时重新使用这个程序。</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US">Php4<span style="font-family: 宋体;" lang="EN-US"><span lang="EN-US">’</span></span>s
zend engine</span></p>

<p><span style="font-size: 9pt;">简略的：工作模式如下：</span><span style="font-size: 9pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p style="text-align: center;" align="center"><a href="http://img.bimg.126.net/photo/3dDlIi5Q7uLRYjR1cuzrLQ==/3994692869478332889.jpg" target="_blank"><img title=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" alt=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" src="http://img.bimg.126.net/photo/3dDlIi5Q7uLRYjR1cuzrLQ==/3994692869478332889.jpg"></a></p>

<p><span lang="EN-US">Php</span>脚本被<span lang="EN-US">zend engine</span>加载，编译到<span lang="EN-US">zend opcode</span>，执行代码的缩写代码，低级的二进制指令，<span lang="EN-US">opcode</span>被执行后，生成<span lang="EN-US">html</span>发送到客户端。执行时<span lang="EN-US">opcode</span>将被在内存中刷新。</p>

<p><span style="font-size: 9pt;">今天有多种产品和技术帮助你加速这个进程，下图我们展现<span lang="EN-US">php</span>脚本的工作方式，每个方框都是功能。<span lang="EN-US"></span></span></p>

<p style="text-align: center;" align="center"><a href="http://img.bimg.126.net/photo/JaMNqyqYPj0XsP57Xmixpw==/5644980657932805833.jpg" target="_blank"><img title=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" alt=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" src="http://img.bimg.126.net/photo/JaMNqyqYPj0XsP57Xmixpw==/5644980657932805833.jpg"></a></p><p style="text-align: center;" align="center"><br></p><p style="text-align: center;" align="center">中间能加缓存的就加吧，如<br></p><p><font size="3"><strong>一、eAccelerator</strong></font></p><p><font size="3"><strong>二、APC</strong></font></p><p><font size="3"><strong>三、XCache</strong></font></p><p><font size="+2" face="helvetica,verdana,sans-serif"><b><font size="3">四 PHP Accelerator</font></b></font></p><p><font size="+2" face="helvetica,verdana,sans-serif"><b><font size="3">提供如下几个图</font></b></font></p><p><a href="http://img.bimg.126.net/photo/Wayn_nJ0XHTxK4i5dlbrCw==/2845712014545310968.jpg" target="_blank"><img title=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" alt=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" src="http://img.bimg.126.net/photo/Wayn_nJ0XHTxK4i5dlbrCw==/2845712014545310968.jpg"></a><a href="http://img.bimg.126.net/photo/JbwR88iow09HgKt4JqN77g==/2845712014545310969.jpg" target="_blank"><img title=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" alt=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" src="http://img.bimg.126.net/photo/JbwR88iow09HgKt4JqN77g==/2845712014545310969.jpg"></a><a href="http://img.bimg.126.net/photo/BoMz7yDMtCZJa0OdxBHkaQ==/2845712014545310970.jpg" target="_blank"><img title=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" alt=" 如何优化你的php（二） - 玉树临风 - 小和尚真情无限" src="http://img.bimg.126.net/photo/BoMz7yDMtCZJa0OdxBHkaQ==/2845712014545310970.jpg"></a></p><p><font size="+2" face="helvetica,verdana,sans-serif"><b><font size="3"><br></font></b></font></p>

<p style="text-align: center;" align="center"><span lang="EN-US">&nbsp;</span></p>

</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/139685482009426113210323</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/139685482009426113210323</guid>
    <pubDate>Tue, 26 May 2009 23:32:10 +0800</pubDate>
    <dcterms:modified>2009-05-26T23:52:53+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[如何优化php（-）]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200942604156835</link>
    <description><![CDATA[<div><style>
<!--    @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;}    p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0cm;  margin-bottom:.0001pt;  text-align:justify;  text-justify:inter-ideograph;  mso-pagination:none;  font-size:10.5pt;  mso-bidi-font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;  mso-font-kerning:1.0pt;} p  {mso-margin-top-alt:auto;  margin-right:0cm;  mso-margin-bottom-alt:auto;  margin-left:0cm;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:宋体;  mso-bidi-font-family:宋体;}    @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:612.0pt 792.0pt;  margin:72.0pt 90.0pt 72.0pt 90.0pt;  mso-header-margin:36.0pt;  mso-footer-margin:36.0pt;  mso-paper-source:0;} div.Section1  {page:Section1;}    @list l0  {mso-list-id:153377719;  mso-list-type:hybrid;  mso-list-template-ids:-1127597584 450769930 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;} @list l0:level1  {mso-level-number-format:alpha-lower;  mso-level-text:"(%1)";  mso-level-tab-stop:24.0pt;  mso-level-number-;  margin-left:24.0pt;  text-indent:-24.0pt;} ol  {margin-bottom:0cm;} ul  {margin-bottom:0cm;} -->
-->--></style>

<p style="text-indent: 21pt;"><span lang="EN-US">翻译：http://phplens.com/lens/php-book/optimizing-debugging-php.php<br></span></p><p style="text-indent: 21pt;"><span lang="EN-US">Php</span><span style="font-family: 宋体;">是一门快速的</span><span lang="EN-US">web</span><span style="font-family: 宋体;">编程开发语言，远比</span><span lang="EN-US">php</span><span style="font-family: 宋体;">代码的执行的速度还有更多需要我们的优化，</span></p>

<p><span style="font-family: 宋体;">这作者的文章中将给你介绍优化你的</span><span lang="EN-US">php</span><span style="font-family: 宋体;">有许多和编码不相关的多个因素，调试我们的</span><span lang="EN-US">php</span><span style="font-family: 宋体;">需要我们理解更多的和</span><span lang="EN-US">php</span><span style="font-family: 宋体;">运行相关的东西，如服务器，找出问题的瓶颈，修复他们，这里将讲述如何调试优化他们，使他们执行的更快。</span></p>

<p><b style=""><span style="font-size: 12pt;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></b><b style=""><span style="font-size: 12pt; font-family: 宋体;">获得更好的性能</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"></span></b></p>

<p><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">当我们将好的性能的时候，我们不止是讲你的脚步运行的有多快，性能是你的架构和速度之间的平衡，脚步可能用少的资源可能比缓存的执行要慢，但是多个复制的同一个脚步在一个服务器上可以同时执行。</span></p>

<p><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">在下面的例子中，</span><span lang="EN-US">A.php</span><span style="font-family: 宋体;">是一个短跑的能跑的很快，但是</span><span lang="EN-US">B.php</span><span style="font-family: 宋体;">则是一个马拉松选手在一个很长的时间内跑同样的速度，负载比较轻的情况下，</span><span lang="EN-US">A.php</span><span style="font-family: 宋体;">相继会很快，但是网络流量增加时，当</span><span lang="EN-US">A.php</span><span style="font-family: 宋体;">跑完了气力的时候</span><span lang="EN-US">B.php</span><span style="font-family: 宋体;">只是降低了一点。</span></p>

<p style="text-align: center;" align="center"><a href="http://img.bimg.126.net/photo/jVDwLUIQFVtOMa5hCEdLdw==/3169689712739305422.jpg" target="_blank"><img title="如何优化php（-） - 玉树临风 - 小和尚真情无限" alt="如何优化php（-） - 玉树临风 - 小和尚真情无限" src="http://img.bimg.126.net/photo/jVDwLUIQFVtOMa5hCEdLdw==/3169689712739305422.jpg"></a></p>

<p><span style="font-family: 宋体;">让我们举更现实的例子来阐述的更透彻，假设我们需要写一个</span><span lang="EN-US">php</span><span style="font-family: 宋体;">的脚本，来读取一个</span><span lang="EN-US">250k</span><span style="font-family: 宋体;">的文件来生成一个</span><span lang="EN-US">html</span><span style="font-family: 宋体;">的大致内容，写两个</span><span lang="EN-US">php</span><span style="font-family: 宋体;">来做同样一个事情，</span><span lang="EN-US">hare.php</span><span style="font-family: 宋体;">读取一次整个文件到内存，一次性处理文件，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tortoise.php</span><span style="font-family: 宋体;">读文件，一次读取一行<b>，</b>使内存中不保留更多的内容，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">tortoise.php</span><span style="font-family: 宋体;">但多次读取的时候会变慢，需要更多的系统的调用，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">hare.php</span><span style="font-family: 宋体;">需要</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">0.04</span><span style="font-family: 宋体;">秒和</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">10m</span><span style="font-family: 宋体;">的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ram</span><span style="font-family: 宋体;">，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">toroise.php</span><span style="font-family: 宋体;">需要</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">0.06</span><span style="font-family: 宋体;">秒和</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">5m</span><span style="font-family: 宋体;">的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">ram</span><span style="font-family: 宋体;">，服务器有</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">100m</span><span style="font-family: 宋体;">的空内存，这时</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">cpu</span><span style="font-family: 宋体;">是</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">99%</span><span style="font-family: 宋体;">的空闲，简单的假设没有内存碎片。</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">跑</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">10</span><span style="font-family: 宋体;">次脚本，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">hare.php</span><span style="font-family: 宋体;">会内存泄漏，在这个时候</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">toroise</span><span style="font-family: 宋体;">还有</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">50m</span><span style="font-family: 宋体;">的空闲内存，当低</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">11</span><span style="font-family: 宋体;">次的时候，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">hare.php</span><span style="font-family: 宋体;">不得不去请开始虚拟内存交换，这使得他的速度将会减少为原来的一般，每次</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">hare.php</span><span style="font-family: 宋体;">的执行，将花费</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">cpu</span><span style="font-family: 宋体;">的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">0.08</span><span style="font-family: 宋体;">秒，同时，</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">toroise.php</span><span style="font-family: 宋体;">将会继续保持原来的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">0.06</span><span style="font-family: 宋体;">秒，在下表中，在不同的负载下快的</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">php</span><span style="font-family: 宋体;">将会用粗体标出：</span><span style="font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&nbsp;</span></p>

<p><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&nbsp;</span></p>

<p><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&nbsp;</span></p>

<p><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&nbsp;</span></p>

<p><span style="font-family: &quot;Courier New&quot;;" lang="EN-US">&nbsp;</span></p>

<p><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>

<table style="width: 478.5pt;" width="638" border="1" cellpadding="0" cellspacing="1">
 <tbody><tr style="">
  <td style="padding: 5.25pt; width: 22%;" valign="top" width="22%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: 宋体;">连接</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 24%;" valign="top" width="24%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">1</span><span style="font-size: 12pt; font-family: 宋体;">个</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-size: 12pt; font-family: 宋体;">请求</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cpu</span><span style="font-size: 12pt; font-family: 宋体;">需要的时间</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 27%;" valign="top" width="27%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">10</span><span style="font-size: 12pt; font-family: 宋体;">个</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-size: 12pt; font-family: 宋体;">请求</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cpu</span><span style="font-size: 12pt; font-family: 宋体;">需要的时间</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 28%;" valign="top" width="28%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">11</span><span style="font-size: 12pt; font-family: 宋体;">个</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">http</span><span style="font-size: 12pt; font-family: 宋体;">请求</span><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">cpu</span><span style="font-size: 12pt; font-family: 宋体;">需要的时间</span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 22%;" valign="top" width="22%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">hare.php
  </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 24%;" valign="top" width="24%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0.04</span></b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 27%;" valign="top" width="27%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0.40</span></b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 28%;" valign="top" width="28%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0.88<br>
  (runs out of RAM) </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
 <tr style="">
  <td style="padding: 5.25pt; width: 22%;" valign="top" width="22%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">tortoise.php
  </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 24%;" valign="top" width="24%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0.06 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 27%;" valign="top" width="27%">
  <p style="text-align: left;" align="left"><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0.60 </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
  <td style="padding: 5.25pt; width: 28%;" valign="top" width="28%">
  <p style="text-align: left;" align="left"><b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US">0.66</span></b><span style="font-size: 12pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> </span><span style="font-size: 12pt; font-family: 宋体;" lang="EN-US"></span></p>
  </td>
 </tr>
</tbody></table>

<p><span style="font-family: 宋体;">从上面的例子我们将看出，获得好的性能，不仅关系到写好的</span><span lang="EN-US">php</span><span style="font-family: 宋体;">脚本，高性能的</span><span lang="EN-US">php</span><span style="font-family: 宋体;">需要理解硬件，操作系统，以及他支持的软件，如服务器，数据库。</span></p>

<p><b style=""><span style="font-size: 12pt; font-family: 宋体;">瓶颈</span></b><b style=""><span style="font-size: 12pt;" lang="EN-US"></span></b></p>

<p><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体;">上面的</span><span lang="EN-US">share</span><span style="font-family: 宋体;">和</span><span lang="EN-US">tororse</span><span style="font-family: 宋体;">的例子说明了瓶颈导致慢了下来，有无限多的</span><span lang="EN-US">ram</span><span style="font-family: 宋体;">的时候</span><span lang="EN-US">hare.php</span><span style="font-family: 宋体;">将会永远的比</span><span lang="EN-US">tortoize.php</span><span style="font-family: 宋体;">快，不幸的是，上面的例子有点简单，除了</span><span lang="EN-US">ram</span><span style="font-family: 宋体;">还有许多瓶颈影响。</span></p>

<p style="margin-left: 24pt; text-indent: -24pt;"><span lang="EN-US"><span style="">(a)<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp;&nbsp;&nbsp;
</span></span></span>网络</p>

<p><span style="font-size: 10.5pt;">你的网络将是最大的瓶颈，假设你有<span lang="EN-US">10m</span>的连接到因特网上，你能在一秒钟输出<span lang="EN-US">1m</span>字节的数据，如果一个页面是<span lang="EN-US">30k</span>，只需要一秒钟<span lang="EN-US">33</span>个页面就使得你饱和，许多微妙的网络瓶颈包括正常的请求到慢的服务如，<span lang="EN-US">dns</span>，分配不够多的内存给网络软件，<span lang="EN-US"></span></span></p>

<p><span lang="EN-US">(b) cpu</span></p>

<p style="text-indent: 21pt;"><span style="font-size: 10.5pt;">如果你监视你的<span lang="EN-US">cpu</span>负载，通过网络发送一个<span lang="EN-US">html</span>页面，不单单要耗费你的<span lang="EN-US">cpu</span>，就像我们提到的瓶颈是网络，但是<span lang="EN-US">php</span>生成的复杂的动态页面，你的<span lang="EN-US">cpu</span>的速度将会变成有限度的因素，多核处理器或者服务器集群能做到。<span lang="EN-US"></span></span></p>

<p><span lang="EN-US">(c) </span>共享内存</p>

<p><span style="font-size: 10.5pt;">共享内存是用在进程内的交换，在多进程中存储资源，比如缓存数据和代码，如果内存分配的不足，任何连接这些用于内存共享，如数据库连接，代码执行等资源都会有很差的性能。<span lang="EN-US"></span></span></p>

<p><span lang="EN-US">(d) </span>文件系统</p>

<p><span lang="EN-US"><span style="">&nbsp;&nbsp;&nbsp; </span></span>从硬盘中读取数据要比<span lang="EN-US">ram</span>中慢<span lang="EN-US">50</span>到<span lang="EN-US">100</span>倍，文件缓存用<span lang="EN-US">ram</span>能完成这些，尽管低内存的状态讲减少文件缓存中内存利用的次数，文件系统当然也会带来系统碎片，降低硬盘的读取，过多的使用符号链接在<span lang="EN-US">unix</span>系统中将减慢硬盘的读取。</p>

<p>（<span lang="EN-US">e</span>）进程管理</p>

<p>在一些操作系统中，比如<span lang="EN-US">windows</span>中创建一个新进程将是一个很慢的操作，这就意味这<span lang="EN-US">cgi</span>程序需要创建一个新进程在每一个激活的连接中，在这些操作系统中这将非常的慢，在多线程下跑<span lang="EN-US">php</span>可能提高反应的时间。（注：老版本的<span lang="EN-US">php</span>在多线程下不稳定）。</p>

<p><span style="font-size: 10.5pt;">在你的服务器中避免过多的不需要的进程，比如，如果你的服务器只做<span lang="EN-US">web</span>服务器，避免跑甚至装<span lang="EN-US">x-winows</span>在机器上，在<span lang="EN-US">windows</span>上，避免跑微软的查找部分，和三维的屏保会导致<span lang="EN-US">cpu100%.</span></span></p>

<p><span style="font-size: 10.5pt;">一些程序包括你考虑移除掉没有用的网络协议，邮件服务器，杀毒扫描，硬件鼠标驱动，红外线端口，等，在<span lang="EN-US">unix</span>下，加入你连接你的服务器你用<span lang="EN-US">ssh</span>，你可以考虑卸载掉一下：一些守护进程如<span lang="EN-US">:</span></span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"> telnetd, inetd, atd, ftpd, lpd, sambad,</span><span style="font-size: 10.5pt;">发送邮件的接受</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">mail</span><span style="font-size: 10.5pt;">，</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">portmap for NFS<br>
xfs, fvwm, xinit, X</span><span style="font-size: 10.5pt;">。</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 10.5pt;">你可以禁用一些各种各样的服务通过修改启动文件，这些文件通常保存在</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">/etc/init* </span><span style="font-size: 10.5pt;">或者</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">/etc/rc*/init*</span><span style="font-size: 10.5pt;">文件下下。</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p><span style="font-size: 10.5pt;">同时查看下你的</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US">crontab</span><span style="font-size: 10.5pt;">文件，你是否需要移除他们，或者重新规划。</span><span style="font-size: 10.5pt; font-family: &quot;Courier New&quot;;" lang="EN-US"></span></p>

<p>（<span lang="EN-US">f</span>）连接其他服务器</p>

<p><span style="font-size: 10.5pt;">如果你的<span lang="EN-US">web</span>服务器需要在其他服务器上运行，可能那些服务器就会成为瓶颈，追普通的例子就是一个很慢的数据库服务器为多个<span lang="EN-US">web</span>服务器上的多个复杂的<span lang="EN-US">sql</span>语句进行服务。<span lang="EN-US"></span></span></p>

<p>花絮：何时优化程序？</p>

<p><span style="font-size: 9pt;">有些人认为拖延到编码完成时进行，这个建议如果是你的编程团队有高质量的编程，你也对你的应用程序有高效的参数有感觉，这样才会很有意义，不然你将会把你推到重写你的部分代码的风险上，在测试后。<span lang="EN-US"></span></span></p>

<p><span style="font-size: 9pt;">我的建议是在设计软件前，你应该做一些基础的测试在你的硬件和软件上，以来得到一些最大的性能，然后你可以设计开发应用程序，期望的参数在脑中，因为每一步，他将会平衡在性能，可用性，安全性，灵活性。<span lang="EN-US"></span></span></p>

<p><span style="font-size: 9pt;">选择好的测试数据，如果你的数据期望存贮<span lang="EN-US">100</span>，<span lang="EN-US">000</span>条记录，避免只测试<span lang="EN-US">100</span>条记录，不然你将会后悔，这曾经发生 在我们公司的一个程序员身上，我们没有检查这个慢的代码，到了后来，导致花费很多时间去重写许多能工作但是不易扩展的代码<span lang="EN-US"></span></span></p>

</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200942604156835</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200942604156835</guid>
    <pubDate>Tue, 26 May 2009 00:41:56 +0800</pubDate>
    <dcterms:modified>2009-05-26T00:44:06+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[回忆的介质想到的]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/139685482009425112769</link>
    <description><![CDATA[<div>什么是通向回忆的介质？一段歌声，一件旧物，一份情感，也许一切的事物在经过之后，会在我们记忆的神经网络中打下烙印，按照多维的去存储，其中有夹杂着多种参数，就像一个多元的高次的一个方程，至今还未能领会，时间的参数，让这段信息存储的某一维会更深，在人的现实世界种，人有有意识的压迫着这些意识的发展与活跃，故有时候在会出现在我们们中奇怪的现象，就像弗洛伊德的精神分析法，但我们触到这些物质时，这些存贮从相似的东西会产生一种介质，导致我们伤感，导致我们的幸福，让我们大胆的想象，大脑是不是一台更加高级的机器，有自己的运算法则，有自己的存储介质，有自己的算法等。他的算法是不是又一种新的数学分支，比如人脑数学，神经元数学等，人类在这方面是要进行更深的探索，在我看来，这个世界永远是着一套自己运行的法则，自然哲学，自然界的完美，这些很早以前就在探索，地心说，日新说，人们都一直在探索，这种历程还需要走多远？？？？自</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/139685482009425112769</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/139685482009425112769</guid>
    <pubDate>Mon, 25 May 2009 23:02:07 +0800</pubDate>
    <dcterms:modified>2009-05-25T23:02:07+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[取当前进程对应之静态映像文件的绝对路径/proc/self/exe]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200942202325181</link>
    <description><![CDATA[<div>提供一个linux&nbsp; advanced programming 上的得到绝对路径目录的函数：<br>char* get_self_executable_directory ()<br>{<br>&nbsp; int rval;<br>&nbsp; char link_target[1024];//目标地址<br>&nbsp; char* last_slash;<br>&nbsp; size_t result_length;//结果的长度<br>&nbsp; char* result;<br><br>&nbsp; /* Read the target of the symbolic link /proc/self/exe.&nbsp; */<br>读取绝对路径<br>&nbsp; rval = readlink ("/proc/self/exe", link_target, sizeof (link_target) - 1);<br>&nbsp; if (rval == -1)<br>&nbsp;&nbsp;&nbsp; /* The call to readlink failed, so bail.&nbsp; */<br>&nbsp;&nbsp;&nbsp; abort ();<br>&nbsp; else<br>&nbsp;&nbsp;&nbsp; /* NUL-terminate the target.&nbsp; */<br>&nbsp;&nbsp;&nbsp; link_target[rval] = '\0';<br>&nbsp; /* We want to trim the name of the executable file, to obtain the<br>&nbsp;&nbsp;&nbsp;&nbsp; directory that contains it.&nbsp; Find the rightmost slash.&nbsp; */<br>找到最后一个/<br>&nbsp; last_slash = strrchr (link_target, '/');<br>如果是空或者是以/开头，则退出<br>&nbsp; if (last_slash == NULL || last_slash == link_target)<br>&nbsp;&nbsp;&nbsp; /* Something stange is going on.&nbsp; */<br>&nbsp;&nbsp;&nbsp; abort ();<br>last_slash保存的是最后的/的地址<br>&nbsp; /* Allocate a buffer to hold the resulting path.&nbsp; */<br>link_target开始的地址<br>&nbsp; result_length = last_slash - link_target;<br>&nbsp; result = (char*) xmalloc (result_length + 1);<br>&nbsp; /* Copy the result.&nbsp; */<br>&nbsp; strncpy (result, link_target, result_length);<br>&nbsp; result[result_length] = '\0';<br>&nbsp; return result;<br>}<br><br>同时可以用以下程序得到绝对路径<br><font >#include&nbsp;&lt;stdio.h&gt;<br>
#include&nbsp;&lt;stdlib.h&gt;<br>
#include&nbsp;&lt;unistd.h&gt;<br>
<br>
#define&nbsp;MAXBUFSIZE&nbsp;1024<br>
<br>
int&nbsp;main&nbsp;(&nbsp;int&nbsp;argc,&nbsp;char&nbsp;*&nbsp;argv[]&nbsp;)<br>
{<br>
&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;buf[&nbsp;MAXBUFSIZE&nbsp;];<br>
&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;count;<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;count&nbsp;=&nbsp;readlink(&nbsp;"/proc/self/exe",&nbsp;buf,&nbsp;MAXBUFSIZE&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(&nbsp;count&nbsp;&lt;&nbsp;0&nbsp;||&nbsp;count&nbsp;&gt;=&nbsp;MAXBUFSIZE&nbsp;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"Failed\n"&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(&nbsp;EXIT_FAILURE&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;}<br>
&nbsp;&nbsp;&nbsp;&nbsp;buf[&nbsp;count&nbsp;]&nbsp;=&nbsp;'\0';<br>
&nbsp;&nbsp;&nbsp;&nbsp;printf(&nbsp;"/proc/self/exe&nbsp;-&gt;&nbsp;[%s]\n",&nbsp;buf&nbsp;);<br>
&nbsp;&nbsp;&nbsp;&nbsp;return(&nbsp;EXIT_SUCCESS&nbsp;);<br>
}&nbsp; </font><br><br><br>网站 ：<br>1 http://www.smth.edu.cn/bbsanc.php?path=%2Fgroups%2Fos.faq%2FUnix%2F13%2Fhellguard_unix_faq%2FM.1031923592.U0<br>2&nbsp; http://blog.linux.org.tw/~jserv/archives/002041.html<br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200942202325181</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200942202325181</guid>
    <pubDate>Fri, 22 May 2009 00:23:25 +0800</pubDate>
    <dcterms:modified>2009-05-22T00:23:25+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[解决location.href在ie下得不到referer]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/139685482009419105357178</link>
    <description><![CDATA[<div>/**<br>*功能：解决onclick.href 跳转时候在ie下得不到refer的问题<br>*@url 需要跳转的地方<br>*@author fabin<br>*使用方法：onclick="href('url')"<br>*/<br>function href(url){<br>&nbsp;&nbsp; &nbsp;var fakeLink = document.createElement ("a");<br>&nbsp;&nbsp; &nbsp;if (typeof(fakeLink.click) == 'undefined')<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;location.href = url;&nbsp; // sends referrer in FF, not in IE<br>&nbsp;&nbsp; &nbsp;else<br>&nbsp;&nbsp; &nbsp;{<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fakeLink.href = url;<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;document.body.appendChild(fakeLink);<br>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;fakeLink.click();&nbsp;&nbsp; // click() method defined in IE only<br>&nbsp;&nbsp; &nbsp;}<br><br>}<br>另外一种方式<br><br>function goTo(url) {<br>&nbsp;&nbsp;&nbsp; var a = document.createElement("a");<br>&nbsp;&nbsp;&nbsp; if(!a.click) { //only IE has this (at the moment);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; window.location = url;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; a.setAttribute("href", url);<br>&nbsp;&nbsp;&nbsp; a.style.display = "none";<br>&nbsp;&nbsp;&nbsp; document.bodyappendChild(a);<br>&nbsp;&nbsp;&nbsp; a.click();<br>}</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/139685482009419105357178</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/139685482009419105357178</guid>
    <pubDate>Tue, 19 May 2009 10:53:57 +0800</pubDate>
    <dcterms:modified>2009-05-19T10:53:57+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[如何让自己写的服务器支持php？]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/1396854820094151198412</link>
    <description><![CDATA[<div>&nbsp;写一个支持支持静态的文件的c服务器很简单，就是些文件目录等操作，如何写一个支持get方式php的呢？<br>很简单的可以用一个shell搞定 ，例如，但是如何支持post等操作呢？<br>#include &lt;stdio.h&gt;<stdio.h><br>void command_mess(char *command, char *buf, int length) <br>{<br>&nbsp;&nbsp;&nbsp; FILE&nbsp;&nbsp; *stream;<br><br>&nbsp;&nbsp;&nbsp; stream = popen(command,"r");<br>&nbsp;&nbsp;&nbsp; fread( buf, sizeof(char), length,&nbsp; stream);<br>&nbsp;&nbsp;&nbsp; pclose( stream );<br>&nbsp;&nbsp;&nbsp; return; <br>}<br><br>int main( void )<br>{<br>&nbsp;&nbsp;&nbsp; char buf[4096] = "";&nbsp; //请注意系统命令要输出的数据大小，小心得到的数据不全哦<br>&nbsp;&nbsp;&nbsp; char com[64] = "/home/liufabin/php/bin/php test.php";<br>&nbsp;&nbsp;&nbsp; command_mess(com, buf, sizeof(buf));<br>&nbsp;&nbsp;&nbsp; printf("Message:
%s",buf);<br>&nbsp;&nbsp;&nbsp; return 0;<br><br>}<br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/1396854820094151198412</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/1396854820094151198412</guid>
    <pubDate>Fri, 15 May 2009 13:19:08 +0800</pubDate>
    <dcterms:modified>2009-05-15T13:19:08+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[我怎么了]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200941411347516</link>
    <description><![CDATA[<div>曾一段段时间心情徘徊在低谷，毕业一年了，应该算是迷茫，抑或说自己心智不成熟，有些事情总是得不到释怀，职业规划的迷茫？自己到底想做什么？自己有能力做什么？如何找到自己的极致，如何做到合理的舍弃，勇敢的追求，很快，在流逝中，在思考这些问题的时间总，已经过去了，很少能真正的释怀，工作了，并没有感觉到前所未有的轻松，反而是更大的压力，不断地学习，对自己的，工作地不满，虽然在长达了一年的时间里，我汲取了好多知识，包括更方面的，尤其是数学，东城区图书馆的好多数学书我都浏览过，当然还有些别的书，然后就是技术，断断续续的也学了点c，从技术的io操作，到进程，线程，ipc，网络编程等，也曾试着去读linux的kernerl，当还是没有坚持下来，唯一让我欣慰的是一年来坚持锻炼了身体，并养成了锻炼身体的好习惯。在技术方面的追求和前进还是比较缓慢的，也许是我太局限了，太不敢向前了。纵然自己自认为有些计算机的基础，包括数据结构算法分析等。<br>很长一段时间自己把自己的计划打乱。改写的没有写。基本上周末很少写过程序，在家里也从来没有学过和php相关的，除了写点c语言，浏览点技术性论坛，博客。我是怎么 了？我不知道？我该怎么了？我不知道。久久的凝滞在一个地方，也行偶然的机遇让 我找到了你。thank you。<br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200941411347516</comments>
    <slash:comments>1</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200941411347516</guid>
    <pubDate>Thu, 14 May 2009 23:34:07 +0800</pubDate>
    <dcterms:modified>2009-05-14T23:34:07+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[speeding up your nginx server with memcached]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200948187491</link>
    <description><![CDATA[<div><br><br><br>可以看这篇文章http://wiki.nginx.org/NginxChsHttpProxyModule ，说的是nginx和memcache可以提升你4倍的性能，请看他们&nbsp;&nbsp; 的图<br><br><img title="speeding up your nginx server with memcached - 玉树临风 - 小和尚真情无限" alt="speeding up your nginx server with memcached - 玉树临风 - 小和尚真情无限" src="http://www.igvita.com/posts/02-08/nginx-memcached.png"><br>nginx在前端可以通过重写规则写到app servrs 还可以通过原生的memcache去查看一些东西是否存在，比如一些小的用户头像，存到cache里，最近看qconbeijing2009的daouban的架构的演化好像经历过这一步，不过他们好像是lighhttd服务器，内置的memache的东西，看看他们的配置文件<br>user&nbsp; usr usr;<br>worker_processes&nbsp; 2;<br><br>http {<br>&nbsp;&nbsp;&nbsp; types {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text/javascript&nbsp;&nbsp;&nbsp; js;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application/xml&nbsp;&nbsp;&nbsp; xml;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>&nbsp;&nbsp;&nbsp; # By default, return content sa<br>&nbsp;&nbsp;&nbsp; default_type&nbsp; application/xml;<br><br>&nbsp;&nbsp;&nbsp; access_log&nbsp; /home/api/logs/nginx.log&nbsp; main;<br><br>&nbsp;&nbsp;&nbsp; sendfile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br>&nbsp;&nbsp;&nbsp; tcp_nopush&nbsp;&nbsp;&nbsp;&nbsp; on;<br><br>&nbsp;&nbsp;&nbsp; keepalive_timeout&nbsp; 65;<br>&nbsp;&nbsp;&nbsp; tcp_nodelay&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; on;<br><br>&nbsp;&nbsp;&nbsp; # app. server(s) / cluster definition<br>&nbsp;&nbsp;&nbsp; upstream dynamic_srv { server 127.0.0.1:9020; }<br><br>&nbsp;&nbsp;&nbsp; server {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9000;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; server_name&nbsp; srv;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /home/usr;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; # Match any request that begins with /dynamic_request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; location /dynamic_request {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; # Append a file-extension to every request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($args ~* format=json) { rewrite ^/dynamic_request/?(.*)$ /dynamic_request.js$1 break; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ($args ~* format=xml)&nbsp; { rewrite ^/dynamic_request/?(.*)$ /dynamic_request.xml$1 break; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; # Check if local memcached server can answer this request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memcached_pass 127.0.0.1:11211;<br><br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; # Send to app. server if Memcached could not ansewr the request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error_page 404 = @dynamic_request;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; location @dynamic_feed_id { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # only internal requests can reach this endpoint<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; internal; <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # dispatch to our app_server cluster / instance<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_pass http://dynamic_srv;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }<br>}<br><pre >然后在学习的过程中，发现一篇更好的文章<br>http://lserinol.blogspot.com/2009/03/speeding-up-your-nginx-server-with.html<br>nginx 的memcache的modual，豆瓣就是用的这个缓存小图片，减少磁盘的io操作，Serving content from memory will be faster than serving it from disk<br>首先需要定义一个反向代理请求的的server，<br>92.168.2.3 的性能要比<br>92.168.2.4的好，所以我们他的权重写一些。<br><br>upstream backend {<br>     server 192.168.2.3 weight=2;<br>     server 192.168.2.4;<br>} <br><br>然后写他的配置文件 ：<br><br>location ~* \.(jpg|png|gif)$ {<br>access_log   off;<br>expires      max;<br>add_header   Last-Modified "Thu, 26 Mar 2000 17:35:45 GMT";<br><span style="font-weight: bold;">set $memcached_key $uri;</span><br><span style="font-weight: bold;">memcached_pass     127.0.0.1:11211;</span><br><span style="font-weight: bold;">error_page         404 = /fetch;</span><br>}<br>把图片文件重定向过来，然后查找在memcache中是否存在，不存在调到404,然后404错误页面会找到fetch<br><span style="font-weight: bold;">location /fetch {</span><br>internal;<br>access_log   off;<br>expires      max;<br>add_header   Last-Modified "Thu, 26 Mar 2000 17:35:45 GMT";<br><span style="font-weight: bold;">proxy_pass http://backend;</span><br>break;<br><span style="font-weight: bold;">}</span><br>然后fetch就会反向代理到后端backend后面。这时候就需要负载均衡到相应的server。可以看出他的原生的memcache只能<br>获取，而不能设置，所以我们需要自己手工完成如对图片存贮到memcache ，写个对应的脚本：<br><br>&lt;?php<br><br>function rscandir($base='', &amp;$data=array()) {<br>$array = array_diff(scandir($base), array('.', '..'));<br><br>foreach($array as $value) :<br>  if (is_dir($base.$value)) {<br>    $data = rscandir($base.$value.'/', $data);<br><br>  }<br>  elseif (is_file($base.$value)) {<br>   $rest = substr($value, -4);<br>   if ((!strcmp($rest,'.jpg')) || (!strcmp($rest,'.png'))<br>                                || (!strcmp($rest,'.gif')) ){<br>         $data[] = $base.$value;<br>   }<br> }<br><br>endforeach;<br>return $data;<br>}<br><br>$mylist=rscandir("/var/www/mysite");<br><br>$srch = array('/var/www/mysite');<br>$newval = array('');<br><br>$memcache_obj = memcache_connect("192.168.2.1", 11211);<br><br>while (list($key, $val) = each($mylist)) {<br>  $url=str_replace($srch,$newval,$val);<br>  echo "$key =&gt; $val -&gt; ".filesize($val)."\n";<br>  $value = file_get_contents($val);<br>  memcache_add($memcache_obj, $url, $value, false, 0);<br>}<br></pre>以上操作就应该能完成你所需要的功能。 以上文字主要来源于作者的文章，算我我的一个理解和翻译。<br><br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200948187491</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200948187491</guid>
    <pubDate>Fri, 8 May 2009 01:08:07 +0800</pubDate>
    <dcterms:modified>2009-05-08T01:08:07+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[c获取文件的大小的两种方法和行读取]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/1396854820094611423405</link>
    <description><![CDATA[<div><br>1 fseek移动指针获取<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br><br>long filesize( FILE *fp )<br>{<br>&nbsp;&nbsp;&nbsp; long int save_pos;<br>&nbsp;&nbsp;&nbsp; long size_of_file;<br><br>&nbsp;&nbsp;&nbsp; /* Save the current position. */<br>&nbsp;&nbsp;&nbsp; save_pos = ftell( fp );<br><br>&nbsp;&nbsp;&nbsp; /* Jump to the end of the file. */<br>&nbsp;&nbsp;&nbsp; fseek( fp, 0L, SEEK_END );<br><br>&nbsp;&nbsp;&nbsp; /* Get the end position. */<br>&nbsp;&nbsp;&nbsp; size_of_file = ftell( fp );<br><br>&nbsp;&nbsp;&nbsp; /* Jump back to the original position. */<br>&nbsp;&nbsp;&nbsp; fseek( fp, save_pos, SEEK_SET );<br><br>&nbsp;&nbsp;&nbsp; return( size_of_file );<br>}<br><br>int main( void )<br>{<br>&nbsp;&nbsp;&nbsp; FILE *fp;<br><br>&nbsp;&nbsp;&nbsp; fp = fopen( "aa.txt", "r" );<br><br>&nbsp;&nbsp;&nbsp; if( fp != NULL ) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf( "File size=%ld\n", filesize( fp ) ); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fclose( fp );<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return EXIT_SUCCESS;<br>&nbsp;&nbsp;&nbsp; }<br><br>&nbsp;&nbsp;&nbsp; return EXIT_FAILURE;<br>}<br><br>2 stat获取<br><br><br><pre>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;sys/stat.h&gt;<br><br>int main( void )<br>  {<br>    struct stat buf;<br><br>    if( stat( "file", &amp;buf ) != -1 ) {<br>      printf( "File size = %d\n", buf.st_size );<br>    }<br>    return EXIT_SUCCESS;<br><br><br>  }</pre>但是是有区别的，如<br>参考fseek()。<br>
　　通过fseek()、ftell()两个函数，我们就可以随意访问文件的任何位置了，想了想好像操作文件就这么easy，实在也没有更多可说的了。对
了，fseek()和ftell()存在一个潜在的问题就是他们限制文件的大小只能在long类型的表示范围以内，也就是说通过这种方式，只能打开
2,000,000,000字节的文件，不过在绝大多数情况下似乎也已经够用了。如果需要打开更大的文件，你需要用到fgetpos()、
fsetpos()函数了，那是另一个命题了。<br><br>#include &lt;stdio.h&gt;<br>#include &lt;string.h&gt;<br><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp; int&nbsp; i;<br>&nbsp;&nbsp;&nbsp; long k;<br>&nbsp;&nbsp;&nbsp; char buf[100];<br>&nbsp;&nbsp;&nbsp; long int save_pos;<br><br>&nbsp;&nbsp;&nbsp; FILE *fp;<br><br>&nbsp;&nbsp;&nbsp; fp=fopen("aa.txt","rb");<br>&nbsp;&nbsp;&nbsp; for(i=1;i&lt;10;i++)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fscanf(fp,"%[^\n]",buf);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //这句读取一行，直到遇到\n，停止，并把读到的内容放到buf里，而此时文件指针的位置指向\n<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; printf("%s\n",buf);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //k=strlen(buf);<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fseek(fp,1,SEEK_CUR);<br>&nbsp;&nbsp;&nbsp; //跳过\n，则从下一行的开始读。这里主要是跳过换行符。如果为k的话，就是从第二行跳过k个字符的位置开始读，当然是不对的了。<br>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; buf[0]='\0';<br><br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; fclose(fp);<br>&nbsp;&nbsp;&nbsp; return 0;<br>}<br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/1396854820094611423405</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/1396854820094611423405</guid>
    <pubDate>Wed, 6 May 2009 11:04:23 +0800</pubDate>
    <dcterms:modified>2009-05-07T13:32:06+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[                        浅谈程序员的数学修养 （转）]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/139685482009330105236523</link>
    <description><![CDATA[<div> 浅谈程序员的数学修养
<br>
<br>
<br>&nbsp;&nbsp;&nbsp; 可能有很多朋友在网上看过google公司早几年的招聘广告，它的第一题如下了:{first 10-digit prime
found in consecutive digits
e}.com，e中出现的连续的第一个10个数字组成的质数。据说当时这个试题在美国很多地铁的出站口都有大幅广告，只要正确解答了这道题，在浏览器的地
址栏中输入这个答案，就可以进入下一轮的测试，整个测试过程如同一个数学迷宫，直到你成为google的一员。
<br>
<br>　　又如Intel某年的一道面试题目:巴拿赫病故于1945年8月31日。他的出生年份恰好是他在世时某年年龄的平方，问:他是哪年出生的?这道看似很简单的数学问题，你能不能能快地解答呢?
<br>
<br>　　下面则是一道世界第一大软件公司微软的招聘测试题:中间只隔一个数字的两个素数被称为素数对，比如5和7，17和19，证明素数对之间的数字
总能被6
整除(假设这两个素数都大于6)，现在证明没有由三个素数组成的素数对。这样的试题还有很多很多，这些题目乍初看上去都是一些数学问题。但是世界上一些著
名的公司都把它们用于招聘测试，可见它们对新员工数学基础的重视。数学试题与应用程序试题是许多大型软件公司面试中指向性最明显的一类试题，这些试题就是
考察应聘者的数学能力与计算机能力。
<br>
<br>　　某咨询公司的一名高级顾问曾说:微软是一家电脑软件公司，当然要求其员工有一定的计算机和数学能力，面试中自然就会考察这类能力。微软的面试
题目就考察了应聘人员对基础知识的掌握程度、对基础知识的应用能力，甚至暗含了对计算机基本原理的考察。所以，这样的面试题目的确很“毒辣”，足以筛选到
合适的人。
<br>
<br>　　四川大学数学学院的曹广福教授曾说过:“一个大学生将来的作为与他的数学修养有很大的关系”。大学计算机专业学生都有感触，计算机专业课程中
最难的几门课程莫过于离散数学、编译原理、数据结构，当然像组合数学、密码学、计算机图形学等课程也令许多人学起来相当吃力，很多自认为数据库学得很好的
学生在范式、函数依赖、传递依赖等数学性比较强的概念面前感到力不从心，这些都是因为数学基础或者说数学知识的缺乏所造成的。
<br>
<br>　　数学是计算机的基础，这也是为什么考计算机专业研究生数学都采用最难试题(数学一)的原因，当然这也能促使一些新的交叉学科如数学与应用软
件、信息与计算科学专业等飞速发展。许多天才程序员本身就是数学尖子，众所周知，Bill
Gates的数学成绩一直都很棒，他甚至曾经期望当一名数学教授，他的母校——湖滨中学的数学系主任弗雷福·赖特曾这样谈起过他的学生:“他能用一种最简
单的方法来解决某个代数或计算机问题，他可以用数学的方法来找到一条处理问题的捷径，我教了这么多年的书，没见过像他这样天分的数学奇才。他甚至可以和我
工作过多年的那些优秀数学家媲美。当然，比尔也各方面表现得都很优秀，不仅仅是数学，他的知识面非常广泛，数学仅是他众多特长之一。”。影响一代中国程序
人的金山软件股份有限公司董事长求伯君当年高考数学成绩满分进一步说明了问题。很多数学基础很好的人，一旦熟悉了某种计算机语言，他可以很快地理解一些算
法的精髓，使之能够运用自如，并可能写出时间与空间复杂度都有明显改善的算法。
<br>
<br>　　程序设计当中解决的相当一部分问题都会涉及各种各样的科学计算，这需要程序员具有什么样的基础呢?实际问题转换为程序，要经过一个对问题抽象
的过程，建立起完善的数学模型，只有这样，我们才能建立一个设计良好的程序。从中我们不难看出数学在程序设计领域的重要性。算法与计算理论是计算机程序设
计领域的灵魂所在，是发挥程序设计者严谨，敏锐思维的有效工具，任何的程序设计语言都试图将之发挥得淋漓尽致。
<br>
<br>　　程序员需要一定的数学修养，不但是编程本身的需要，同时也是培养逻辑思维以及严谨的编程作风的需要。数学可以锻炼我们的思维能力，可以帮助我
们解决现实中的问题。可以帮助我们更高的学习哲学。为什么经常有人对一些科学计算程序一筹莫展，他可以读懂每一行代码，但是却无法预测程序的预测结果，甚
至对程序的结构与功能也一知半解，给他一个稍微复杂点的数学公式，他可能就不知道怎么把它变成计算机程序。很多程序员还停留在做做简单的MIS，设计一下
MDI，写写简单的Class或用SQL语句实现查询等基础的编程工作上，对于一些需要用到数学知识的编程工作就避而远之，当然实现一个累加程序或者一个
税率的换算程序还是很容易的，因为它们并不需要什么高深的数学知识。
<br>
<br>　　一名有过10多年开发经验的老程序员曾说过:“所有程序的本质就是逻辑。技术你已经较好地掌握了，但只有完成逻辑能力的提高，你才能成为一名
职业程序员。打一个比方吧，你会十八般武艺，刀枪棍棒都很精通，但就是力气不够，所以永远都上不了战场，这个力气对程序员而言就是逻辑能力(其本质是一个
人的数学修养，注意，不是数学知识)。”
<br>
<br>　　程序员的数学修养不是一朝一夕就可以培养的。数学修养与数学知识不一样，修养需要一个长期的过程，而知识的学习可能只是一段短暂的时间。下面是一些我个人对于程序员如何提高与培养自己的数学修养的基本看法。
<br>
<br>&nbsp;&nbsp;
首先，应该意识到数学修养的重要性。作为一个优秀的程序员，一定的数学修养是十分重要也是必要的。数学是自然科学的基础，计算机科学实际上是数学的一个分
支。计算机理论其实是很多数学知识的融合，软件工程需要图论，密码学需要数论，软件测试需要组合数学，计算机程序的编制更需要很多的数学知识，如集合论、
排队论、离散数学、统计学，当然还有微积分。计算机科学一个最大的特征是信息与知识更新速度很快，随着数学知识与计算机理论的进一步结合，数据挖掘、模式
识别、神经网络等分支科学得到了迅速发展，控制论、模糊数学、耗散理论、分形科学都促进了计算机软件理论、信息管理技术的发展。严格的说，一个数学基础不
扎实的程序不能算一个合格的程序员，很多介绍计算机算法的书籍本身也就是数学知识的应用与计算机实现手册。
<br>
<br>　　其次，自身数学知识的积累，培养自己的空间思维能力和逻辑判断能力。数学是一门分支众多的学科，我们无法在短暂的一生中学会所有的数学知识，
像泛函理论、混沌理论以及一些非线性数学问题不是三五几天就可以掌握的。数学修养的培养并不在与数学知识的多少，但要求程序员有良好的数学学习能力，能够
很快地把一些数学知识和自己正在解决的问题联系起来，很多理学大师虽然不是数学出身，但是他们对数学有很强的理解能力和敏锐的观察力，于是一系列新的学科
诞生了，如计算化学、计算生物学、生物信息学、化学信息学、计算物理学，计算材料学等等。数学是自然学科的基础，计算机技术作为理论与实践的结合，更需要
把数学的一些精髓融入其中。从计算机的诞生来看它就是在数学的基础上产生的，最简单的0、1进制就是一个古老的数学问题。程序设计作为一项创造性很强的职
业，它需要程序员有一定的数学修养，也具有一定的数学知识的积累，可以更好地把一些数学原理与思想应用于实际的编程工作中去。学无止境，不断的学习是提高
修养的必经之路。
<br>
<br>　　第三，多在实践中运用数学。有些高等学校开设了一门这样的课程——《数学建模》。我在大学时期也曾学过，这是一门内容很丰富的课程。它把很多
相关的学科与数学都联系在一起，通过很多数学模型来解决实际的生产生活问题，很多问题的解决需要计算机程序来实现。我在大学和研究生阶段都参加过数学建模
竞赛，获得了不少的经验，同时也进一步提高了自己的数学修养。实际上，现在的程序设计从某些角度来看就是一个数学建模的过程，模型的好坏关系到系统的成
败，现在数学建模的思想已经用于计算机的许多相关学科中，不单只是计算机程序设计与算法分析。应该知道，数学是一门需要在实践中展示其魅力的科学，而计算
机程序也是为帮助解决实际问题而编制的，因此，应该尽量使它们结合起来，在这个方面，计算机密码学是我认为运用数学知识最深最广泛的，每一个好的加密算法
后面都有一个数学理论的支持，如椭圆曲线、背包问题、素数理论等。作为一名优秀的程序员，应该在实际工作中根据需要灵活运用数学知识，培养一定的数学建模
能力，善于归纳总结，慢慢使自己的数学知识更加全面，数学修养得到进一步提高。
<br>
<br>　　第四，程序员培养制度与教学的改革。许多程序员培养体制存在很多缺陷，一开始就要求学员能够快速精通某种语言，以语言为中心，对算法的核心思
想与相关的数学知识都一笔带过，讲得很少，这造成很多程序员成为背程序的机器，这样不利于程序员自身的快速成长，也不利于程序员解决新问题。我在长期的程
序员培训与计算机教学工作采用了一些与传统方式不一致的方法，收到了一定的效果。很多初学程序的人往往写程序时有时候会有思维中断，或者对一些稍难的程序
觉得无法下手，我采用了一些课前解决数学小问题的方法来激励大家的学习兴趣，这些小问题不单单是脑筋急转弯，其中不少是很有代表意义的数学思考题。通过数
学问题来做编程的热身运动，让学员在数学试题中激发自己的思维能力，记得有位专家曾经说过，经常做做数学题目会使自己变聪明，很长时间不去接触数学问题会
使自己思维迟钝。通过一些经典的数学问题来培养学员的思维的严谨性和跳跃性。很多人可能不以为然，其实有些看似简单的问题并不一定能够快速给出答案，大脑
也是在不断的运用中变更加灵活的。不信吗?大家有兴趣可以做做下面这道题目，看看能不能在1分钟之内想到答案，这只是一道小学数学课后习题。很多人认为自
己的数学基础很好，但是据说这道题目90%以上的人不能在一个小时内给出正确答案。试试，如果你觉得我说的是错的。
<br>
<br>　　证明:AB+AC&gt;DB+DC(D为三角形ABC的一个内点)。
<br>
<br>　　最后，多学多问，多看好书，看经典。我在这里向大家推荐两部可能大家已经很熟悉的经典的计算机算法教材，它们中间很多内容其实就是数学知识的
介绍。第一部是《算法导论》，英文名称:Introduction to Algorithms，作者:Thomas H. Cormen
，Charles E. Leiserson ，Ronald L. Rivest ，Clifford
Stein。本书的主要作者来自麻省理工大学计算机，作者之一Ronald L.Rivest
由于其在公开秘钥密码算法RSA上的贡献获得了图灵奖。这本书目前是算法的标准教材，美国许多名校的计算机系都使用它，国内有些院校也将本书作为算法课程
的教材。另外许多专业人员也经常引用它。本书基本包含了所有的经典算法，程序全部由伪代码实现，这更增添了本书的通用性，使得利用各种程序设计语言进行程
序开发的程序员都可以作为参考。语言方面通俗，很适合作为算法教材和自学算法之用。另一部是很多人都应该知道的Donald.E.Knuth所著《计算机
程序设计艺术》，英文名称:The Art of Computer Programming。
Donald.E.Knuth人生最辉煌的时刻在斯坦福大学计算机系渡过，美国计算机协会图灵奖的获得者，是本领域内当之无愧的泰斗。有戏言称搞计算机程
序设计的不认识Knuth就等于搞物理的不知道爱因斯坦，搞数学的不知道欧拉，搞化学的不知道道尔顿。被简称为TAOCP的这本巨著内容博大精深，几乎涵
盖了计算机程序设计算法与理论最重要的内容。现在发行的只有三卷，分别为基础运算法则，半数值算法，以及排序和搜索(在写本文之际，第四卷已经出来了，我
也在第一时间抢购了一本)。本书结合大量数学知识，分析不同应用领域中的各种算法，研究算法的复杂性，即算法的时间、空间效率，探讨各种适用算法等，其理
论和实践价值得到了全世界计算机工作者的公认。书中引入的许多术语、得到的许多结论都变成了计算机领域的标准术语和被广泛引用的结果。另外，作者对有关领
域的科学发展史也有深入研究，因此本书介绍众多研究成果的同时，也对其历史渊源和发展过程做了很好的介绍，这种特色在全球科学著作中是不多见的。至于本书
的价值我觉得Bill
Gates先生的话足以说明问题:“如果你认为你是一名真正优秀的程序员读Knuth的《计算机程序设计艺术》，如果你能读懂整套书的话，请给我发一份你
的简历”。作者数学方面的功底造就了本书严谨的风格，虽然本书不是用当今流行的程序设计语言描述的，但这丝毫不损伤它“程序设计史诗”的地位。道理很简
单，它内涵的设计思想是永远不会过时的。除非英语实在有困难，否则建议读者选用英文版。我个人就是阅读的该书的英文版，虽然花了不少money和时间，但
是收获颇丰，值得。
<br>
<br>　　总之，要想成为一名有潜力有发展前途的程序员，或者想成为程序员中的佼佼者，你一定要培养良好的数学修养。切记:对于一名能够灵活自如编写各种程序的人，数学是程序的灵魂。 
</div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/139685482009330105236523</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/139685482009330105236523</guid>
    <pubDate>Thu, 30 Apr 2009 10:52:36 +0800</pubDate>
    <dcterms:modified>2009-04-30T10:52:36+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[常见的数学思想（转）]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200933010359944</link>
    <description><![CDATA[<div>&nbsp; 对于搞工程和技术的朋友来讲，在工作中常常遇到一些实际问题，而采用常规的思维方式无法很好的解决这些问题，那么这个时候我们就需要用数学语言和数学工具，而使用数学工具的前提却是用数学思想的方法来描述问题。。下面转帖几种常用的数学思想方法，仅供学习和参考
<br>
<br> 
<br>
<br>&nbsp; 函数思想
<br>　　把某一数学问题用函数表示出来，并且利用函数探究这个问题的一般规律。这是最基本、最常用的数学方法。
<br>
<br>&nbsp; 数形结合思想
<br>　　“数无形，少直观，形无数，难入微”，利用“数形结合”可使所要研究的问题化难为易，化繁为简。把代数和几何相结合，例如对几何问题用代数方法解答，对代数问题
<br>用几何方法解答，这种方法在解析几何里最常用。例如求根号（(a-1)^2+(b-1)^2）+根号(a^2+(b-1)^2)+根号((a-1)^2+b^2)+根号(a^2+b^2)的最小值，就可以把它放在坐标系中
<br>，把它转化成一个点到(0,1)、(1,0)、(0,0)、(1,1)四点的距离，就可以求出它的最小值。
<br>
<br>&nbsp; 分类讨论思想
<br>　　当一个问题因为某种量的情况不同而有可能引起问题的结果不同时，需要对这个量的各种情况进行分类讨论。比如解不等式|a-1|&gt;4的时候，就要讨论a的取值情况。
<br>
<br>&nbsp; 方程思想
<br>　　当一个问题可能与某个方程建立关联时，可以构造方程并对方程的性质进行研究以解决这个问题。例如证明柯西不等式的时候，就可以把柯西不等式转化成一个二次方程的判别式。
<br>
<br>&nbsp; 整体思想
<br>　　从问题的整体性质出发，突出对问题的整体结构的分析和改造，发现问题的整体结构特征，善于用“集成”的眼光，把某些式子或图形看成一个整体，把握它们之间的关联
<br>，进行有目的的、有意识的整体处理。整体思想方法在代数式的化简与求值、解方程（组）、几何解证等方面都有广泛的应用，整体代入、叠加叠乘处理、整体运算、整体设元
<br>、整体处理、几何中的补形等都是整体思想方法在解数学问题中的具体运用。
<br>
<br>(整体思想和系统论密切相关，请参看我的博文，钱学森系统方法论)
<br>
<br>&nbsp; 转化思想
<br>　　在于将未知的，陌生的，复杂的问题通过演绎归纳转化为已知的，熟悉的，简单的问题。三角函数，几何变换，因式分解，解析几何，微积分，乃至古代数学的尺规作等数
<br>学理论无不渗透着转化的思想。常见的转化方式有：一般 特殊转化，等价转化，复杂 简单转化，数形转化，构造转化，联想转化，类比转化等。
<br>
<br>&nbsp; 隐含条件思想
<br>　　没有明文表述出来，但是根据已有的明文表述可以推断出来的条件，或者是没有明文表述，但是该条件是一个常规或者真理。
<br>
<br>&nbsp; 类比思想
<br>　　把两个（或两类）不同的数学对象进行比较，如果发现它们在某些方面有相同或类似之处，那么就推断它们在其他方面也可能有相同或类似之处。
<br>
<br>&nbsp; 建模思想
<br>　　为了描述一个实际现象更具科学性，逻辑性，客观性和可重复性，人们采用一种普遍认为比较严格的语言来描述各种现象，这种语言就是数学。使用数学语言描述的事物就
<br>称为数学模型。有时候我们需要做一些实验，但这些实验往往用抽象出来了的数学模型作为实际物体的代替而进行相应的实验，实验本身也是实际操作的一种理论替代。
<br>
<br>&nbsp; 化归思想
<br>　　化归思想就是化未知为已知,化繁为简,化难为易.如将分式方程化为整式方程,将代数问题化为几何问题,将四边形问题转化为三角形问题等.实现这种转化的方法有:待定系数法,配方法,整体代人法以及化动为静,由抽象到具体等转化思想
<br>
<br>&nbsp; 归纳推理思想
<br>　　由某类事物的部分对象具有某些特征,推出该类事物的全部对象都具有这些特征的推理,或者由个别事实概括出一般结论的推理称为归纳推理(简称归纳),简言之,归纳推理是由部分到整体,由个别到一般的推理
<br>
<br>&nbsp; 概率统计思想
<br>　　另外，还有概率统计思想等数学思想，例如概率统计思想是指通过概率统计解决一些实际问题，如摸奖的中奖率、某次考试的综合分析等等。另外，还可以用概率方法解决一些面积问题。
  

  

  

  </div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200933010359944</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200933010359944</guid>
    <pubDate>Thu, 30 Apr 2009 10:35:09 +0800</pubDate>
    <dcterms:modified>2009-04-30T10:35:09+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[分类算法的思考]]></title>	
    <link>http://liufabin66688.blog.163.com/blog/static/13968548200932304318913</link>
    <description><![CDATA[<div>1 常见的多极分类和无限级的分类可以考虑用关系数据库实现<br>如设计的数据结构是<br>CREATE TABLE `category` (<br>
&nbsp;&nbsp;`categoryID` smallint(5) unsigned NOT NULL auto_increment,<br>
&nbsp;&nbsp;`categoryParentID` smallint(5) unsigned NOT NULL default '0',<br>
&nbsp;&nbsp;`categoryName` varchar(50) NOT NULL default '',<br>
&nbsp;&nbsp;PRIMARY KEY&nbsp;&nbsp;(`categoryID`)<br>
) <br>通过sql就可以做到多极分类和无限级别分类。<br>2 通过一个大数字，按照类别进行分段，如1110,1000000,000000,000000,和1110,10101001,0100010,0010001,相与，如果第一段相等则第一类相同，有点像ip的分类地址思想<br>如a类地址，b类地址，求起网络地址，和子网掩码相与的思想，这个思想也基本上满足常见的分类。<br>3 这个算法是google的数学之美的，对新闻进行自动分类，人工智能分类，用到的知识竟然是余弦定理。<br>地址是http://www.googlechinablog.com/2006/07/12.html<br><br></div>]]></description>
	    <author><![CDATA[ 小和尚]]></author>
	    <comments>http://liufabin66688.blog.163.com/blog/static/13968548200932304318913</comments>
    <slash:comments>0</slash:comments>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/blog/static/13968548200932304318913</guid>
    <pubDate>Thu, 23 Apr 2009 00:43:18 +0800</pubDate>
    <dcterms:modified>2009-04-23T00:43:18+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[web:  学习]]></title>	
    <link>http://liufabin66688.blog.163.com/prevResource.do?selectId=fks_087070086086088074092083074066087095087075081082094</link>
    <description><![CDATA[<ul>
	<li>
	<a href="http://linux0818.blogspot.com/" target="_blank">一个linux</a>
	: linux学习</li>

	<li>
	<a href="http://www.kerneltravel.net/" target="_blank">linux内核之旅</a>
	: 好的网站</li>

	<li>
	<a href="http://sourceforge.net/projects/xylftp/" target="_blank">西邮的兴趣想小组</a>
	: linux</li>

	<li>
	<a href="http://hi.baidu.com/welcomeheremyfriends/blog" target="_blank">c</a>
	: c</li>

	<li>
	<a href="http://www.php-oa.com/2008/11/08/distress.html" target="_blank">fuwuqi</a>
	: fuwuqi</li>

	<li>
	<a href="http://www.ilia.ws/" target="_blank">phpcreate</a>
	: create</li>

	<li>
	<a href="http://derickrethans.nl/talks.php" target="_blank">超级牛php好东西</a>
	</li>

	<li>
	<a href="http://hi.baidu.com/zengzhaonong/blog" target="_blank">linux</a>
	: linux</li>

	<li>
	<a href="http://blog.chinaunix.net/u/12592/article.html" target="_blank">linux</a>
	: 学习的好地方</li>

	<li>
	<a href="http://blog.chinaunix.net/u2/76292/showart_1329008.html" target="_blank">linux</a>
	: linux</li>

	<li>
	<a href="http://blog.chinaunix.net/u2/63929/article_97977.html" target="_blank">linux小程序</a>
	: 笑程序</li>

	<li>
	<a href="http://blog.chinaunix.net/u/4515/showart_1134020.html" target="_blank">linux命令</a>
	: linux命令</li>

	<li>
	<a href="http://blog.chinaunix.net/u1/53217/article_97612.html" target="_blank">小弟</a>
	: 小弟</li>

	<li>
	<a href="http://student.zjzk.cn/course_ware/data_structure/web/main.htm" target="_blank">数据结构的学习</a>
	: 数据结构的学习</li>

	<li>
	<a href="http://www.herofit.cn/tag/linux/page/3" target="_blank">xuexi</a>
	: xuex</li>

	<li>
	<a href="http://pczou.xplore.cn/index.php?go=category_1&mode=1&page=7" target="_blank">linux高人</a>
	: 高人</li>

	<li>
	<a href="http://mlsx.xplore.cn/" target="_blank">学习linux</a>
	: 学习linux</li>

	<li>
	<a href="http://hi.baidu.com/hustwk/blog/category/larbin%D3%EB%C5%C0%B3%E6" target="_blank">labin</a>
	: labin</li>

	<li>
	<a href="http://hi.baidu.com/hustwk/blog/category/larbin%D3%EB%C5%C0%B3%E6" target="_blank">牛牛草堂</a>
	: 牛牛</li>

	<li>
	<a href="http://www.koven.org/archives/ct4ct9.html" target="_blank">乌秋</a>
	: 秋</li>

	<li>
	<a href="http://oss.lzu.edu.cn/blog/blog.php?do_showone/tid_1540.html" target="_blank">西北忆痕</a>
	: 大牛</li>

	<li>
	<a href="http://blog.chinaunix.net/u/12592/index.html" target="_blank">linuxuni</a>
	: heh</li>

	<li>
	<a href="http://blog.chinaunix.net/u2/76263/article_96475.html" target="_blank">linux</a>
	: linux</li>

	<li>
	<a href="http://www.cppblog.com/sicheng/" target="_blank">cpp</a>
	: cpp</li>

	<li>
	<a href="http://www.cnblogs.com/yizhu2000/archive/2007/12/04/982142.html" target="_blank">web架构</a>
	: web架构</li>

	<li>
	<a href="http://blog.chinaunix.net/u/29134/article_0_2.html" target="_blank">mysql</a>
	: mysql</li>

	<li>
	<a href="http://www.phpobject.net/blog/index.php?mode=1&page=2" target="_blank">phpchina</a>
	: phpchina</li>

	<li>
	<a href="http://www.maycode.com/index.php/hotspot/27-clanguage/839-cache.html" target="_blank">memecached</a>
	: memcached</li>

	<li>
	<a href="http://zhiqiang.org/blog/" target="_blank">好的算法</a>
	</li>

	<li>
	<a href="http://blog.chinaunix.net/u/19185/article_0_1.html" target="_blank">linux</a>
	: cbaidushangde</li>

	<li>
	<a href="http://www.askwan.com/read.php?93" target="_blank">加速器</a>
	: 加速器</li>

	<li>
	<a href="http://www.askwan.com/read.php?11" target="_blank">xcache</a>
	: xcache</li>

	<li>
	<a href="http://www.toplee.com/blog/100.html" target="_blank">eaccletor</a>
	: 加速器</li>

	<li>
	<a href="http://www.upschool.com.cn/edu/1328/2006/624/10du134945_1.shtml" target="_blank">c实例</a>
	: 实例</li>

	<li>
	<a href="http://dodomail.javaeye.com/blog/201025" target="_blank">ip</a>
	: ip</li>

	<li>
	<a href="http://www.cnblogs.com/ewebapp/archive/2006/08/22/483050.html" target="_blank">ip</a>
	: ip</li>

	<li>
	<a href="http://blog.csdn.net/wooin/archive/2007/10/31/1858917.aspx" target="_blank">gvim</a>
	: gbim</li>

	<li>
	<a href="http://blog.chinaunix.net/u1/51562/index.html" target="_blank">linux内核</a>
	: 学习</li>

	<li>
	<a href="http://man.chinaunix.net/tech/lyceum/linuxK/tlk.html" target="_blank">linux机制</a>
	: linux机制</li>

	<li>
	<a href="http://hi.baidu.com/xproduct/blog/category/web%BF%F2%BC%DC" target="_blank">腾讯的牛人</a>
	: 牛人</li>

	<li>
	<a href="http://www.lupaworld.com/35139/viewspace_16886.html" target="_blank">sed</a>
	: http://www.lupaworld.com/35139/viewspace_16886.html</li>

	<li>
	<a href="http://blog.chinaunix.net/u1/59178/article.php?frmid=75988" target="_blank">服务器</a>
	: 服务器</li>

	<li>
	<a href="http://blog.chinaunix.net/u2/60913/showart_1162310.html" target="_blank">linxu</a>
	: linux</li>

	<li>
	<a href="http://blog.chinaunix.net/u/22935/article_36498.html" target="_blank">linux c 学习</a>
	: 学习</li>

	<li>
	<a href="http://blog.chinaunix.net/u2/72003/showart_1162522.html" target="_blank">linux c</a>
	: linux c</li>

	<li>
	<a href="http://hi.baidu.com/mgqw/blog/item/ff45563fab9ca7c77d1e71be.html" target="_blank">linux 书籍</a>
	: linux 书籍</li>

	<li>
	<a href="http://hi.baidu.com/mgqw" target="_blank">linux c</a>
	: linux c</li>

	<li>
	<a href="http://blog.chinaunix.net/u/5252/showart_1161941.html" target="_blank">linux</a>
	: linux</li>

	<li>
	<a href="http://blog.chinaunix.net/u1/53217/article_70407.html" target="_blank">linux</a>
	: linux</li>

	<li>
	<a href="http://www.libing.net.cn/index.php" target="_blank">吉大</a>
	: linux</li>

	<li>
	<a href="http://glemir.xplore.cn/?p=37" target="_blank">yahoo</a>
	: yahoo</li>

	<li>
	<a href="http://shiflett.org/articles" target="_blank">国外的</a>
	: 国外</li>

	<li>
	<a href="http://blog.chinaunix.net/u/6303/showart_432440.html" target="_blank">niuren</a>
	</li>

	<li>
	<a href="http://hi.baidu.com/yanyulou/blog/item/728ba344709aea81b3b7dc6d.html" target="_blank">vi</a>
	: vi学习</li>

	<li>
	<a href="http://www.bradfitz.com/" target="_blank">memcached</a>
	: memached到作者</li>

	<li>
	<a href="http://www.whenpenguinsattack.com/category/php-security/" target="_blank">php学习地址</a>
	: 学习</li>

	<li>
	<a href="http://www.phpbuilder.com/board/showthread.php?t=10357309" target="_blank">国外网站</a>
	: 国外</li>

	<li>
	<a href="http://weierophinney.net/matthew/archives/164-Vim-Productivity-Tips-for-PHP-Developers.html" target="_blank">php开发人员</a>
	: zendframewok</li>

	<li>
	<a href="http://www.akrabat.com" target="_blank">zendframework</a>
	: 框架开发人员</li>

	<li>
	<a href="http://www.php.net/manual/zh/types.comparisons.php" target="_blank">函数比较</a>
	</li>

	<li>
	<a href="http://www.hightman.cn/index.php?weblog" target="_blank">mylql</a>
	</li>

	<li>
	<a href="http://www.hiadmin.com/?p=188" target="_blank">高性能</a>
	</li>

	<li>
	<a href="http://www.xianguo.com/service/share/1036489/3" target="_blank">好的学习的地方</a>
	</li>

	<li>
	<a href="http://yanhuan02.blog.163.com" target="_blank">星星 的网易博客</a>
	: 星星 的网易博客</li>

	<li>
	<a href="http://www.iamdcboy.com/article.asp?id=259" target="_blank">安全</a>
	: 安全</li>

	<li>
	<a href="http://blog.s135.com/read.php/318.htm" target="_blank">新浪网张宴</a>
	</li>

	<li>
	<a href="http://www.vchelp.net/blog/wyy/" target="_blank">vc的</a>
	: vc的</li>

	<li>
	<a href="http://blog.csdn.net/shfabjc/" target="_blank">小熊的</a>
	: 可以</li>

	<li>
	<a href="http://www.cnblogs.com/mgod/" target="_blank">学习.net的</a>
	: 博客</li>
</ul>]]></description>
	    <author><![CDATA[liufabin66688]]></author>
    <guid isPermaLink="false">collection/static/fks_087070086086088074092083074066087095087075081082094</guid>
    <pubDate>Thu, 19 Jul 2007 16:07:03 +0800</pubDate>
    <dcterms:modified>2007-07-19T16:07:03+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[web:  文学]]></title>	
    <link>http://liufabin66688.blog.163.com/prevResource.do?selectId=fks_087065082081087068084083074066087095087075081082094</link>
    <description><![CDATA[<ul>
	<li>
	<a href="http://0106551513.blog.163.com" target="_blank">伤感的恋人 的网易博客</a>
	: C#网络编程概述</li>

	<li>
	<a href="http://ftw118.blog.163.com" target="_blank">ftw118 的网易博客</a>
	: ftw118 的网易博客C#网络编程</li>

	<li>
	<a href="http://kevindash.blog.163.com" target="_blank">纤尘 的网易博客</a>
	: 大量的学习c#的资料</li>

	<li>
	<a href="http://blog.163.com/tsdzqq@126" target="_blank">小郎 的网易博客</a>
	: 小郎 的网易博客 c#技巧</li>

	<li>
	<a href="http://gaomenggaici.blog.163.com" target="_blank">高猛 的网易博客</a>
	: 高猛 的网易博客</li>

	<li>
	<a href="http://maosea0125.blog.163.com" target="_blank">潇洒雨鞋 的网易博客</a>
	: 潇洒雨鞋 的网易博客</li>

	<li>
	<a href="http://blog.sina.com.cn/u/1230313060" target="_blank">化蝶的BLOG</a>
	: 一曲粱祝音,惊为天上人.</li>
</ul>]]></description>
	    <author><![CDATA[liufabin66688]]></author>
    <guid isPermaLink="false">collection/static/fks_087065082081087068084083074066087095087075081082094</guid>
    <pubDate>Fri, 18 May 2007 19:59:51 +0800</pubDate>
    <dcterms:modified>2007-05-18T19:59:51+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[web:  友情网址]]></title>	
    <link>http://liufabin66688.blog.163.com/prevResource.do?selectId=fks_087066082083088067084085074066087095087075081082094</link>
    <description><![CDATA[<ul>
	<li>
	<a href="http://hi.baidu.com/j_fo/blog/item/7412bb01bcb0ee00738da5d1.html" target="_blank">linxu学习</a>
	: 学习linux</li>

	<li>
	<a href="http://www.hiadmin.com/%E5%AF%B9%E6%AF%94-apc-vs-eaccelerator-vs-xcache-eaccelerator%E8%83%9C%E5%87%BA/" target="_blank">高手</a>
	: 网站</li>

	<li>
	<a href="http://forums.pligg.com/pligg-tutorials/8466-sidebar-friends-module-messaging-activity.html" target="_blank">slider</a>
	: h</li>

	<li>
	<a href="http://www.phpbuilder.com/board/showthread.php?t=10351826" target="_blank">国外论坛</a>
	</li>

	<li>
	<a href="http://www.programmingtalk.com/showthread.php?t=46442" target="_blank">国外的php</a>
	: bucuo</li>

	<li>
	<a href="http://www.ideagrace.com/blog/" target="_blank">好的php</a>
	: 不错的</li>

	<li>
	<a href="http://www.seoip.net/seoblog.htm" target="_blank">seo</a>
	: 学习</li>

	<li>
	<a href="http://our.uni.cc/blog/users/nana/index.php/show/one/id/10" target="_blank">zf</a>
	: zf</li>

	<li>
	<a href="http://blog.sina.com.cn/cuikai" target="_blank">web design</a>
	: ck</li>

	<li>
	<a href="http://blog.sina.com.cn/gxllingblog" target="_blank">郭小玲</a>
	: 淑女</li>

	<li>
	<a href="http://forums.devshed.com/php-development-5/" target="_blank">老外的php论坛</a>
	: 有c语言的</li>

	<li>
	<a href="http://simon.net.nz/articles/process-a-url-query-string-in-php/" target="_blank">eng</a>
	: 老外blog</li>

	<li>
	<a href="http://blog.csdn.net/baggio785/archive/2006/09/12/1215172.aspx" target="_blank">讲大型的</a>
	: 比较深</li>

	<li>
	<a href="http://www.ccvita.com/index.php/category/php" target="_blank">玉面修罗</a>
	: 村里的</li>

	<li>
	<a href="http://www.quickshare.com.cn/post/windowsXP-php-Apache-Mysql-Zend-Configuration.php" target="_blank">有空看看</a>
	: 八错</li>

	<li>
	<a href="http://www.phpobject.net/blog/read.php?118" target="_blank">牛淫</a>
	: 牛</li>

	<li>
	<a href="http://blog.csdn.net/heiyeshuwu/archive/2006/11/13/1380838.aspx" target="_blank">黑夜明灯</a>
	: memcached的解析</li>

	<li>
	<a href="http://blog.chinaunix.net/u/8780/article.html" target="_blank">比较全的网站</a>
	: 算法，安全。。。</li>

	<li>
	<a href="http://www.cnblogs.com/soplayer/" target="_blank">搞java的</a>
	: java的</li>

	<li>
	<a href="http://sunxingfang.cn/article.asp?id=160" target="_blank">孙兴芳</a>
	: 恩</li>

	<li>
	<a href="http://www.toplee.com/blog/category/%e6%8a%80%e6%9c%af/php" target="_blank">应该很牛</a>
	: 不错</li>

	<li>
	<a href="http://seaprince.cn/t/160/1/" target="_blank">群里的工程师</a>
	: 还可以了</li>

	<li>
	<a href="http://hi.baidu.com/sungoogle/blog" target="_blank">百度空间</a>
	: 还不错</li>

	<li>
	<a href="http://conanmusic.spaces.live.com/" target="_blank">我见过最牛的phper</a>
	: 真正的牛人</li>

	<li>
	<a href="http://blog.sina.com.cn/u/1418859182" target="_blank">西大浪人</a>
	: 新浪的牛人</li>

	<li>
	<a href="http://blog.csdn.net/phpme/archive/2006/06/02/769247.aspx" target="_blank">csdn上的牛人</a>
	: 高屋建瓴</li>

	<li>
	<a href="http://blog.chinaunix.net/u/12228/showart_219258.html" target="_blank">欣然随风</a>
	: 村里的牛人</li>

	<li>
	<a href="http://100000.myabc.cn/home/gbook.htm" target="_blank">火星上的来客</a>
	: 火星</li>

	<li>
	<a href="http://www.x2blog.cn/Maxwin/#sid.19729/page.1/" target="_blank">享受分享</a>
	: 享受分享xeblog</li>

	<li>
	<a href="http://www.cnblogs.com/lovecherry/archive/2005/03/26/126102.html" target="_blank">LoveCherry</a>
	: asp.net</li>

	<li>
	<a href="http://blog.csdn.net/pfworld/archive/2007/03/22/1537413.aspx" target="_blank">pfworld的专栏</a>
	: asp.net</li>

	<li>
	<a href="http://blog.chinaunix.net/u/25374/showart_192583.html" target="_blank">“开源”盛世</a>
	: “开源”盛世 javajavascript实现</li>

	<li>
	<a href="http://www.gx3.cn/" target="_blank">死神</a>
	: 东京电子学院的</li>

	<li>
	<a href="http://wulonghack.blog.163.com" target="_blank">wulonghack 的网易博客</a>
	: wulonghack 的网易博客</li>

	<li>
	<a href="http://wulonghack.blog.163.com/blog/277167992007423104944796.track" target="_blank">sql注入详解</a>
	: sql注入详解</li>

	<li>
	<a href="http://blog.csdn.net/fzm010/category/293249.aspx" target="_blank">分析diszum的牛</a>
	: 分析diszum的牛php学习</li>

	<li>
	<a href="http://www.cpcwedu.com/Document/WEBOfficial/095447158.htm" target="_blank">rss2.0标准</a>
	: rss2.0标准</li>

	<li>
	<a href="http://blog.csdn.net/wsyl_czl/archive/2005/01/11/248835.aspxhttp://blog.csdn.net/xiaoxiaohai123/archive/2007/05/11/1604928.aspx" target="_blank">得到</a>
	: 得到</li>

	<li>
	<a href="http://blog.csdn.net/xiaoxiaohai123/archive/2007/05/17/1613263.aspx" target="_blank">图片存入数据库</a>
	: 图片存入数据库</li>

	<li>
	<a href="http://www.28star.com/blog/article.asp?id=286" target="_blank">c#socket</a>
	: c#socket</li>

	<li>
	<a href="http://dotnet.chinaitlab.com/CSharp/521419.html" target="_blank">c#http</a>
	: c#http</li>

	<li>
	<a href="http://www.21ds.net/article/21/26161" target="_blank">c#文件传输</a>
	: c#文件传输</li>

	<li>
	<a href="http://www.blueidea.com/tech/program/2004/1810_3.asp" target="_blank">兰色理想</a>
	: sql注入了解</li>

	<li>
	<a href="http://blog.csdn.net/conanlwl/archive/2007/05/11/1604941.aspx" target="_blank">图asp.net</a>
	: 呵呵不错啊！</li>

	<li>
	<a href="http://blog.csdn.net/21aspnet/archive/2007/03/24/1539846.aspx" target="_blank">asp.net</a>
	: 真牛</li>

	<li>
	<a href="http://www.cnblogs.com/chorrysky/archive/2007/04/25/571305.html#726695" target="_blank">c#的博客</a>
	: c#</li>

	<li>
	<a href="www.ajaxcn.org" target="_blank">ajax实战的作者</a>
	: 李捆</li>

	<li>
	<a href="http://www.phpchina.com/8051/viewspace_3582.html" target="_blank">文件上传的详细</a>
	: 可以吧</li>

	<li>
	<a href="http://kissfishaiziji.blog.163.com" target="_blank">kissfish 的网易博客</a>
	: kissfish 的网易博客</li>

	<li>
	<a href="http://zhaojianguang811.blog.163.com" target="_blank">frozen 的网易博客</a>
	: frozen 的网易博客</li>

	<li>
	<a href="http://hoho.zs.blog.163.com" target="_blank">hoho 的网易博客</a>
	: hoho 的网易博客</li>

	<li>
	<a href="http://blog.sina.com.cn/phpyy#albumPic_4ab0d13505000k34_1" target="_blank">朱武杰的</a>
	: 牛</li>

	<li>
	<a href="http://www.phpchina.com/14397/spacelist_type_blog.html" target="_blank">辉老大的啊</a>
	: php</li>

	<li>
	<a href="http://www.phpobject.net/blog/read.php?31" target="_blank">厉害人的</a>
	: php</li>

	<li>
	<a href="http://www.phzzy.org/index.php?tag=php" target="_blank">看按</a>
	: php</li>

	<li>
	<a href="http://blog.sina.com.cn/u/1484006094#sort_2" target="_blank">ajax的</a>
	: 就这点</li>

	<li>
	<a href="http://www.dodo.hk/default.asp?cat=7" target="_blank">小牛</a>
	: javacript</li>

	<li>
	<a href="http://www.itfly.com/blog/default.asp?cat=14" target="_blank">牛人的</a>
	: php</li>

	<li>
	<a href="http://www.phpweblog.net/be-evil/archive/2007/04/09/1089.html" target="_blank">罪恶</a>
	: 博客</li>
</ul>]]></description>
	    <author><![CDATA[liufabin66688]]></author>
    <guid isPermaLink="false">collection/static/fks_087066082083088067084085074066087095087075081082094</guid>
    <pubDate>Thu, 26 Apr 2007 22:40:21 +0800</pubDate>
    <dcterms:modified>2007-04-26T22:40:21+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[music:  张学友]]></title>	
    <link>http://liufabin66688.blog.163.com/prevResource.do?selectId=fks_087066086095080074092095074066087095087075081082094</link>
    <description><![CDATA[<ul></ul>]]></description>
	    <author><![CDATA[liufabin66688]]></author>
    <guid isPermaLink="false">collection/static/fks_087066086095080074092095074066087095087075081082094</guid>
    <pubDate>Sat, 21 Apr 2007 18:00:01 +0800</pubDate>
    <dcterms:modified>2007-04-21T18:00:01+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[book:  学习]]></title>	
    <link>http://liufabin66688.blog.163.com/prevResource.do?selectId=fks_087066085095089074093083074066087095087075081082094</link>
    <description><![CDATA[<ul></ul>]]></description>
	    <author><![CDATA[liufabin66688]]></author>
    <guid isPermaLink="false">collection/static/fks_087066085095089074093083074066087095087075081082094</guid>
    <pubDate>Wed, 18 Apr 2007 22:14:32 +0800</pubDate>
    <dcterms:modified>2007-04-18T22:14:32+08:00</dcterms:modified>
  </item>    
  <item>
  	<title><![CDATA[ 小和尚关注的博友]]></title>	
    <link>http://liufabin66688.blog.163.com/friends</link>
    <description><![CDATA[<div>
			<a href="http://hoho.zs.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/1p6wJ6ob5RKwf4BdWDYGqw==/5637662308537809025.jpg" border="0" />hoho</a>
			<a href="http://maosea0125.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/Kcb8jVUbj0FGo8i__b4ODQ==/5685513054578696628.jpg" border="0" />潇洒雨鞋</a>
			<a href="http://wqq1028.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/SlakJ6NNFh-tZ4bvO9yFKw==/201536083325386947.jpg" border="0" />青青</a>
			<a href="http://blog.163.com/lijingyi_love/" target="_blank"><img src="http://ava.bimg.126.net/photo/GcOWvt3jO7OCschZXJFHhw==/218706056904793880.jpg" border="0" />柠檬</a>
			<a href="http://wulonghack.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/_uG7G9DCd9PVpjvOjONVSg==/428404914553738975.jpg" border="0" />wulonghack</a>
			<a href="http://blog.163.com/vivia0831@126/" target="_blank"><img src="http://ava.bimg.126.net/photo/aRdMQylCEikmiSg_c13qmQ==/441071288506085292.jpg" border="0" />vivi</a>
			<a href="http://runnylove.blog.163.com/" target="_blank"><img src="http://ava.bimg.126.net/photo/ra-SRXMie1QzuAUuDOvSEA==/215328357184074355.jpg" border="0" />  “ＲuＮ  ~</a>
</div>]]></description>
    <guid isPermaLink="true">http://liufabin66688.blog.163.com/friends</guid>
    <pubDate>Tue, 1 Jan 2008 00:00:00 +0800</pubDate>
    <dcterms:modified>2008-01-01T00:00:00+08:00</dcterms:modified>
  </item>    
 </channel>
</rss>