<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.wkeke.cn/styles/feedsky2.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.wkeke.cn" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/lanqi" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 11 Oct 2011 15:31:12 GMT</lastBuildDate><title>蓝色骑兵-web技术|网络生活</title><description>追逐和分享web技术资讯，沉浸并热爱互联网虚拟生活，高擎蓝色大旗，像亚瑟王一样战斗……</description><image><url>http://creativecommons.org/images/public/somerights20.png</url><title>蓝色骑兵-web技术|网络生活</title><link>http://www.wkeke.cn</link></image><link>http://www.wkeke.cn</link><language>en</language><pubDate>Tue, 11 Oct 2011 15:31:12 GMT</pubDate><item><title>用screen管理远程会话</title><link>http://www.wkeke.cn/archives/linux-screen/</link><content:encoded>&lt;p&gt;在公司经常一进电梯，wifi被屏蔽，准入断掉，ssh终端也断开连接，代码没有及时保存，已经追悔莫及。重新登录之后，原来的状态也已经无法恢复，一堆窗口又要一个个打开，坑爹啊，有木有！！！&lt;br /&gt;
其实不用这么烦，有screen命令啊。screen工具是一个终端多路转接器，在本质上，这意味着你能够使用一个单一的终端窗口运行多终端的应用。screen中有会话的概念，用户可以在一个screen会话中创建多个screen窗口，在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式：&lt;br /&gt;
&lt;span id=&quot;more-312&quot;&gt;&lt;/span&gt;&lt;br /&gt;
1．直接在命令行键入screen命令&lt;/p&gt;
&lt;p&gt;[root@tivf06 ~]# screen&lt;/p&gt;
&lt;p&gt;Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序，就像在ssh窗口中那样。在该窗口中键入exit退出该窗口，如果这是该screen会话的唯一窗口，该screen会话退出，否则screen自动切换到前一个窗口。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
2．Screen命令后跟你要执行的程序。&lt;/p&gt;
&lt;p&gt;[root@tivf06 ~]# screen vi test.c&lt;/p&gt;
&lt;p&gt;Screen创建一个执行vi test.c的单窗口会话，退出vi将退出该窗口/会话。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
3．以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c，即Ctrl键+a键，之后再按下c键，screen 在该会话内生成一个新的窗口并切换到该窗口。&lt;/p&gt;
&lt;p&gt;screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开（detach）screen会话，并在随后时间重新连接（attach）该会话，重新控制各窗口中运行的程序。例如，我们打开一个screen窗口编辑/tmp/abc文件：&lt;/p&gt;
&lt;p&gt;&lt;br/&gt;&lt;br /&gt;
&lt;strong&gt;参　　数：&lt;/strong&gt;&lt;br /&gt;
-A 　将所有的视窗都调整为目前终端机的大小。&lt;br /&gt;
-d &lt;作业名称&gt; 　将指定的screen作业离线。&lt;br /&gt;
-h &lt;行数&gt; 　指定视窗的缓冲区行数。&lt;br /&gt;
-m 　即使目前已在作业中的screen作业，仍强制建立新的screen作业。&lt;br /&gt;
-r &lt;作业名称&gt; 　恢复离线的screen作业。&lt;br /&gt;
-R 　先试图恢复离线的作业。若找不到离线的作业，即建立新的screen作业。&lt;br /&gt;
-s 　指定建立新视窗时，所要执行的shell。&lt;br /&gt;
-S &lt;作业名称&gt; 　指定screen作业的名称。&lt;br /&gt;
-v 　显示版本信息。&lt;br /&gt;
-x 　恢复之前离线的screen作业。&lt;br /&gt;
-ls或&amp;#8211;list 　显示目前所有的screen作业。&lt;br /&gt;
-wipe 　检查目前所有的screen作业，并删除已经无法使用的screen作业。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;strong&gt;常用screen参数：&lt;/strong&gt;&lt;br /&gt;
screen -S yourname -&gt; 新建一个叫yourname的session&lt;br /&gt;
screen -ls -&gt; 列出当前所有的session&lt;br /&gt;
screen -r yourname -&gt; 回到yourname这个session&lt;br /&gt;
screen -d yourname -&gt; 远程detach某个session&lt;br /&gt;
screen -d -r yourname -&gt; 结束当前session并回到yourname这个session&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;strong&gt;在每个screen session 下，所有命令都以 ctrl+a(C-a) 开始。&lt;/strong&gt;&lt;br /&gt;
C-a ? -&gt; Help，显示简单说明&lt;br /&gt;
C-a c -&gt; Create，开启新的 window&lt;br /&gt;
C-a n -&gt; Next，切换到下个 window&lt;br /&gt;
C-a p -&gt; Previous，前一个 window&lt;br /&gt;
C-a 0..9 -&gt; 切换到第 0..9 个window&lt;br /&gt;
Ctrl+a [Space] -&gt; 由視窗0循序換到視窗9&lt;br /&gt;
C-a C-a -&gt; 在两个最近使用的 window 间切换&lt;br /&gt;
C-a x -&gt; 锁住当前的 window，需用用户密码解锁&lt;br /&gt;
C-a d -&gt; detach，暂时离开当前session，将目前的 screen session (可能含有多个 windows) 丢到后台执行，并会回到还没进 screen 时的状态，此时在 screen session 里    每个 window 内运行的 process (无论是前台/后台)都在继续执行，即使 logout 也不影响。&lt;br /&gt;
C-a z -&gt; 把当前session放到后台执行，用 shell 的 fg 命令則可回去。&lt;br /&gt;
C-a w -&gt; Windows，列出已开启的 windows 有那些&lt;br /&gt;
C-a t -&gt; Time，显示当前时间，和系统的 load&lt;br /&gt;
C-a K -&gt; kill window，强行关闭当前的 window&lt;br /&gt;
C-a [ -&gt; 进入 copy mode，在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样&lt;br /&gt;
    C-b Backward，PageUp&lt;br /&gt;
    C-f Forward，PageDown&lt;br /&gt;
    H(大写) High，将光标移至左上角&lt;br /&gt;
    L Low，将光标移至左下角&lt;br /&gt;
    0 移到行首&lt;br /&gt;
    $ 行末&lt;br /&gt;
    w forward one word，以字为单位往前移&lt;br /&gt;
    b backward one word，以字为单位往后移&lt;br /&gt;
    Space 第一次按为标记区起点，第二次按为终点&lt;br /&gt;
    Esc 结束 copy mode&lt;br /&gt;
C-a ] -&gt; Paste，把刚刚在 copy mode 选定的内容贴上&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2009-03-03 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/10-major-in-web-history/&quot; title=&quot;Web发展历程中的十件大事&quot;&gt;Web发展历程中的十件大事&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908956/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/linux-screen/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/linux-screen/feed/</wfw:commentRss><description>在公司经常一进电梯，wifi被屏蔽，准入断掉，ssh终端也断开连接，代码没有及时保存，已经追悔莫及。重新登录之后，原来的状态也已经无法恢复，一堆窗口又要一个个打开，坑爹啊，有木有！！！
其实不用这么烦，有screen命令啊。screen工具是一个终端多路转接器，在本质上，这意味着你能够使用一个单一的终端窗口运行多终端的应用。screen中有会话的概念，用户可以在一个screen会话中创建多个screen窗口，在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式：

1．直接在命令行键入screen命令
[root@tivf06 ~]# screen
Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序，就像在ssh窗口中那样。在该窗口中键入exit退出该窗口，如果这是该screen会话的唯一窗口，该screen会话退出，否则screen自动切换到前一个窗口。

2．Screen命令后跟你要执行的程序。
[root@tivf06 ~]# screen vi test.c
Screen创建一个执行vi test.c的单窗口会话，退出vi将退出该窗口/会话。

3．以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c，即Ctrl键+a键，之后再按下c键，screen 在该会话内生成一个新的窗口并切换到该窗口。
screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开（detach）screen会话，并在随后时间重新连接（attach）该会话，重新控制各窗口中运行的程序。例如，我们打开一个screen窗口编辑/tmp/abc文件：

参　　数：
-A 　将所有的视窗都调整为目前终端机的大小。
-d  　将指定的screen作业离线。
-h  　指定视窗的缓冲区行数。
-m 　即使目前已在作业中的screen作业，仍强制建立新的screen作业。
-r  　恢复离线的screen作业。
-R 　先试图恢复离线的作业。若找不到离线的作业，即建立新的screen作业。
-s 　指定建立新视窗时，所要执行的shell。
-S  　指定screen作业的名称。
-v 　显示版本信息。
-x 　恢复之前离线的screen作业。
-ls或&amp;#8211;list 　显示目前所有的screen作业。
-wipe 　检查目前所有的screen作业，并删除已经无法使用的screen作业。

常用screen参数：
screen -S yourname -&gt; 新建一个叫yourname的session
screen -ls -&gt; 列出当前所有的session
screen -r yourname -&gt; 回到yourname这个session
screen -d yourname -&gt; 远程detach某个session
screen -d -r yourname -&gt; 结束当前session并回到yourname这个session

在每个screen session 下，所有命令都以 ctrl+a(C-a) 开始。
C-a ? -&gt; Help，显示简单说明
C-a c -&gt; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/564908956/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/linux-screen/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>linux</category><category>shell</category><pubDate>Tue, 11 Oct 2011 23:31:12 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/linux-screen/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=312</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/linux-screen/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908956/5405152</fs:itemid></item><item><title>我们的世界需要更多”地球一小时”</title><link>http://www.wkeke.cn/archives/earth-hour-2011/</link><content:encoded>&lt;p&gt;又到了“地球一小时”的时间，活动的原生意义在于唤起人们的环保意识，让更多的人能投入环保。但绿色生活在我们的社会大都流于形式，更是成为许多商家坑蒙拐骗的广告语。以破坏环境、竭泽而渔来换取经济回报的现象，在我国遍地都是，我觉得观念以及全民素质在这里起了很大的作用。&lt;/p&gt;
&lt;p&gt;希望我们的社会能有更多的“地球一小时”，&lt;/p&gt;
&lt;p&gt;希望环保、绿色概念能真正走入寻常百姓家，&lt;/p&gt;
&lt;p&gt;希望我们的城市上空不再阴霾，&lt;/p&gt;
&lt;p&gt;希望每个人都能呼吸到真正新鲜的空气。&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2010-03-24 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/earth-hour-2010/&quot; title=&quot;爱护环境从你我做起&quot;&gt;爱护环境从你我做起&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-03-29 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/earth-hour/&quot; title=&quot;你“地球一小时”了吗？&quot;&gt;你“地球一小时”了吗？&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908957/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/earth-hour-2011/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/earth-hour-2011/feed/</wfw:commentRss><description>又到了“地球一小时”的时间，活动的原生意义在于唤起人们的环保意识，让更多的人能投入环保。但绿色生活在我们的社会大都流于形式，更是成为许多商家坑蒙拐骗的广告语。以破坏环境、竭泽而渔来换取经济回报的现象，在我国遍地都是，我觉得观念以及全民素质在这里起了很大的作用。
希望我们的社会能有更多的“地球一小时”，
希望环保、绿色概念能真正走入寻常百姓家，
希望我们的城市上空不再阴霾，
希望每个人都能呼吸到真正新鲜的空气。
相关文章

2010-03-24 &amp;#8212; 爱护环境从你我做起
2009-03-29 &amp;#8212; 你“地球一小时”了吗？&lt;img src=&quot;http://www1.feedsky.com/t1/564908957/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/earth-hour-2011/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>social</category><category>Focus</category><pubDate>Sat, 26 Mar 2011 18:18:36 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/earth-hour-2011/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=311</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/earth-hour-2011/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908957/5405152</fs:itemid></item><item><title>Web开发人员感兴趣的15个开源项目[转载]</title><link>http://www.wkeke.cn/archives/15-web-open-source-project/</link><content:encoded>&lt;p&gt;如今，构建网站和开发Web应用程序已经不仅要求开发人员是一名优秀的程序员，更需要聪明的程序员。这也就是说，在可能的情况下，重复使用已有的代码和应用程序，而不是自己重头开始。&lt;/p&gt;
&lt;p&gt;开源由来已久，并且很多网站的构建也使用了开源。开发人员都知道Linux、Apache、MySQL及 PHP （LAMP）。&lt;/p&gt;
&lt;p&gt;但是除那些之外的其他开源项目呢？作为一名Web开发人员，你可以借助诸多可用的项目，以节省开发时间，或提高程序性能。&lt;/p&gt;
&lt;p&gt;下面让我们看一下哪些开源项目可供大家免费使用。&lt;span id=&quot;more-310&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【可供使用的新型数据库】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;传统上讲，你可能习惯使用MySQL。尽管MySQL是一个非常棒的数据库，但诸多试图解决MySQL存在的问题的新型数据库已经问世。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. MongoDB&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MongoDB就是的“非关系型”数据库之一。它扩展性强、性能高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Apache Cassandra&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;与MongoDB相似，Apache Cassandra也是一种“非关系型”数据库，它亦扩展性强、性能高。并且能够很好地处理庞大而活跃的数据集。（编注：Facebook用Cassandra来做邮箱搜索。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更多&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据需要，你还有更多的选择。&lt;a rel=&quot;nofollow&quot; href=&quot;http://en.wikipedia.org/wiki/Category:Open_source_database_management_systems&quot; target=&quot;_blank&quot;&gt;请参阅维基百科的这个列表&lt;/a&gt;。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【缓存数据】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;因为需要频繁使用一些数据，所以相比每次去数据库中查询，把这些数据存放在内存中更加合理。这能够大大提高Web应用程序的运行速度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Memcached&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Memcached是一种在内存中缓存小型数据块的简单但强大的解决方法。（编注： Facebook运行着成千上万的Memcached服务器，借以及时处理TB级的缓存数据。）&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Redis&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Redis的作用与Memcached相同，但包含更多的特性。例如，它也可以存储本应当永久性保存在磁盘上的数据。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【加快网络请求的速度】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;大多数网站使用Apache的网络服务器来提供服务。它能够很好地服务于大多数网站，但是一旦网站的访问量增大，就需要做进一步优化。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Nginx&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Nginx是一种与Apache非常相像的网络服务器，但它的速度相当快。作为负载平衡器，它常用于处理静态内容，如图像文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Varnish&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Varnish是位于常规网络服务器之前的高速缓存器。它将所有热门内容放入内存，直接对其处理，无须将所有内容都传给网络服务器。（编注： Facebook用Varnish 处理图片和用户照片，每天都要处理十亿级的请求。Facebook所用到的其他开源项目，请参阅《&lt;a href=&quot;http://www.jobbole.com/entry.php/73&quot; target=&quot;_blank&quot;&gt;揭秘Facebook背后的那些软件&lt;/a&gt;》一文。）&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【轻松管理内容】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如果你在构建一个允许用户添加及编辑内容的网站，那么你可能需要一个内容管理系统（CMS）。CMS能够帮助开发人员轻松地管理博客及网站，并且提供大量的能够扩展网站功能的插件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7. WordPress&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;虽然WordPress是个博客平台，但它也能用于管理大大小小的网站。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8. Drupal&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Drupal是一个可用于构建强扩展性、高灵活性网站的完整平台。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更多&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还有很多可用的内容管理系统。&lt;a rel=&quot;nofollow&quot; href=&quot;http://en.wikipedia.org/wiki/List_of_content_management_systems&quot; target=&quot;_blank&quot;&gt;请参阅维基百科的这个大型列表&lt;/a&gt;。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【交互式的网络UI】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;如今，你可以使用JavaScript和AJAX技术，开发一个类似桌面应用程序那样的以多种方式运行的网络应用。使用JavaScript框架，能够轻松地开发大型的网络应用程序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9. JQuery&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;JQuery是一个带插件的框架，这些插件有主构建包含AJAX交互及动画的动态网站。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10. MooTools&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;MooTools就和jQuery一样，是一个使用JavaScript构建强大网络应用程序的框架。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更多&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你想尝试一下其他选择，&lt;a rel=&quot;nofollow&quot; href=&quot;http://en.wikipedia.org/wiki/Comparison_of_JavaScript_frameworks&quot; target=&quot;_blank&quot;&gt;请参考维基百科的这个列表&lt;/a&gt;。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【其他比较炫的资源】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;当你开始开发一个复杂的网络应用程序时，很多软件、库及模型能够帮你解决难题，如果不参考这些资源，你可能会花费大量的时间。以下是两个入门的例子。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11.  Node.js&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Node.js是一个事件驱动的输入/输出框架，支持用JavaScript编写应用程序，并在V8 JavaScript引擎上运行。这是一种开发快速、可扩展网络程序的很棒的方式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12. RabbitMQ&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;RabbitMQ是一种可靠的、可扩展的信息传送系统，它能够处理高吞吐量。如果需要在系统之间或应用程序之间交换数据，比起传统的解决方案或直接将数据存储在数据库中，信息传送系统的更能胜任这一工作。&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【使用框架来加速开发进程】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;不管你是使用PHP还是其他的编程语言，有很多不同的可用框架能够帮助你加速开发进程，并能够更加轻松地管理代码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13. Symfony&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Symfony是一个PHP框架，它包含很多能够加速开发复杂网络应用程序的组件及工具。同时它包含社区提供的1000多个插件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14. Ruby on Rails&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对Ruby语言而言，Ruby on Rails是最流行的可用框架。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;15. Django&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Django是一个Python网络框架，它用来帮助快速开发高性能、优秀的网络应用程序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;更多&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;维基百科上有一份更完整的列表，&lt;a rel=&quot;nofollow&quot; href=&quot;http://en.wikipedia.org/wiki/Comparison_of_web_application_frameworks&quot; target=&quot;_blank&quot;&gt;这个列表包含不同语言的可用网络应用框架。&lt;/a&gt;&lt;br /&gt;
&lt;br/&gt;&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;strong&gt;【后话 - 合理利用时间】&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;开发人员有必要花费时间不断了解哪些新软件是可用的，这样对轻松地解决复杂的任务大有裨益。&lt;/p&gt;
&lt;p&gt;而且在项目开发之初，花费一些时间做计划和调查也是非常有必要的，因为这样可以明确即将面临的问题，并确定其最佳解决方案。&lt;/p&gt;
&lt;p&gt;自己编程来解决每个问题的时代已经结束，如今更多的是灵活使用现有技术来解决问题。&lt;/p&gt;
&lt;p&gt;不知正在看本文的Web开发人员，在上述这些开源项目中，你用到了哪些？欢迎你在评论中分享你的使用经验和心得。&lt;/p&gt;
&lt;p&gt;原文地址：http://www.javaeye.com/news/20144&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2010-12-15 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/oreilly-velocity-china-2010/&quot; title=&quot;O&amp;#8217;Reilly Velocity China 2010&quot;&gt;O&amp;#8217;Reilly Velocity China 2010&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-07-05 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/web-cheep-sheet-2/&quot; title=&quot;Web开发与设计师速查手册汇集(二)&quot;&gt;Web开发与设计师速查手册汇集(二)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-07-05 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/web-cheet-sheet/&quot; title=&quot;Web开发与设计师速查手册汇集(一)&quot;&gt;Web开发与设计师速查手册汇集(一)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-06-05 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/some-tips-about-web-test/&quot; title=&quot;关于Web测试的一些Tips&quot;&gt;关于Web测试的一些Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-04-18 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/web-architecture-design/&quot; title=&quot;web架构设计&quot;&gt;web架构设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-04-04 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/flash3d-engine/&quot; title=&quot;主流的开源Flash3D框架&quot;&gt;主流的开源Flash3D框架&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908958/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/15-web-open-source-project/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/15-web-open-source-project/feed/</wfw:commentRss><description>如今，构建网站和开发Web应用程序已经不仅要求开发人员是一名优秀的程序员，更需要聪明的程序员。这也就是说，在可能的情况下，重复使用已有的代码和应用程序，而不是自己重头开始。
开源由来已久，并且很多网站的构建也使用了开源。开发人员都知道Linux、Apache、MySQL及 PHP （LAMP）。
但是除那些之外的其他开源项目呢？作为一名Web开发人员，你可以借助诸多可用的项目，以节省开发时间，或提高程序性能。
下面让我们看一下哪些开源项目可供大家免费使用。

【可供使用的新型数据库】
传统上讲，你可能习惯使用MySQL。尽管MySQL是一个非常棒的数据库，但诸多试图解决MySQL存在的问题的新型数据库已经问世。
1. MongoDB
MongoDB就是的“非关系型”数据库之一。它扩展性强、性能高。
2. Apache Cassandra
与MongoDB相似，Apache Cassandra也是一种“非关系型”数据库，它亦扩展性强、性能高。并且能够很好地处理庞大而活跃的数据集。（编注：Facebook用Cassandra来做邮箱搜索。）
更多
根据需要，你还有更多的选择。请参阅维基百科的这个列表。

【缓存数据】
因为需要频繁使用一些数据，所以相比每次去数据库中查询，把这些数据存放在内存中更加合理。这能够大大提高Web应用程序的运行速度。
3. Memcached
Memcached是一种在内存中缓存小型数据块的简单但强大的解决方法。（编注： Facebook运行着成千上万的Memcached服务器，借以及时处理TB级的缓存数据。）
4. Redis
Redis的作用与Memcached相同，但包含更多的特性。例如，它也可以存储本应当永久性保存在磁盘上的数据。

【加快网络请求的速度】
大多数网站使用Apache的网络服务器来提供服务。它能够很好地服务于大多数网站，但是一旦网站的访问量增大，就需要做进一步优化。
5. Nginx
Nginx是一种与Apache非常相像的网络服务器，但它的速度相当快。作为负载平衡器，它常用于处理静态内容，如图像文件。
6. Varnish
Varnish是位于常规网络服务器之前的高速缓存器。它将所有热门内容放入内存，直接对其处理，无须将所有内容都传给网络服务器。（编注： Facebook用Varnish 处理图片和用户照片，每天都要处理十亿级的请求。Facebook所用到的其他开源项目，请参阅《揭秘Facebook背后的那些软件》一文。）

【轻松管理内容】
如果你在构建一个允许用户添加及编辑内容的网站，那么你可能需要一个内容管理系统（CMS）。CMS能够帮助开发人员轻松地管理博客及网站，并且提供大量的能够扩展网站功能的插件。
7. WordPress
虽然WordPress是个博客平台，但它也能用于管理大大小小的网站。
8. Drupal
Drupal是一个可用于构建强扩展性、高灵活性网站的完整平台。
更多
还有很多可用的内容管理系统。请参阅维基百科的这个大型列表。

【交互式的网络UI】
如今，你可以使用JavaScript和AJAX技术，开发一个类似桌面应用程序那样的以多种方式运行的网络应用。使用JavaScript框架，能够轻松地开发大型的网络应用程序。
9. JQuery
JQuery是一个带插件的框架，这些插件有主构建包含AJAX交互及动画的动态网站。
10. MooTools
MooTools就和jQuery一样，是一个使用JavaScript构建强大网络应用程序的框架。
更多
如果你想尝试一下其他选择，请参考维基百科的这个列表。

【其他比较炫的资源】
当你开始开发一个复杂的网络应用程序时，很多软件、库及模型能够帮你解决难题，如果不参考这些资源，你可能会花费大量的时间。以下是两个入门的例子。
11.  Node.js
Node.js是一个事件驱动的输入/输出框架，支持用JavaScript编写应用程序，并在V8 JavaScript引擎上运行。这是一种开发快速、可扩展网络程序的很棒的方式。
12. RabbitMQ
RabbitMQ是一种可靠的、可扩展的信息传送系统，它能够处理高吞吐量。如果需要在系统之间或应用程序之间交换数据，比起传统的解决方案或直接将数据存储在数据库中，信息传送系统的更能胜任这一工作。

【使用框架来加速开发进程】
不管你是使用PHP还是其他的编程语言，有很多不同的可用框架能够帮助你加速开发进程，并能够更加轻松地管理代码。
13. Symfony
Symfony是一个PHP框架，它包含很多能够加速开发复杂网络应用程序的组件及工具。同时它包含社区提供的1000多个插件。
14. Ruby on Rails
对Ruby语言而言，Ruby on Rails是最流行的可用框架。
15. Django
Django是一个Python网络框架，它用来帮助快速开发高性能、优秀的网络应用程序。
更多
维基百科上有一份更完整的列表，这个列表包含不同语言的可用网络应用框架。

【后话 - 合理利用时间】
开发人员有必要花费时间不断了解哪些新软件是可用的，这样对轻松地解决复杂的任务大有裨益。
而且在项目开发之初，花费一些时间做计划和调查也是非常有必要的，因为这样可以明确即将面临的问题，并确定其最佳解决方案。
自己编程来解决每个问题的时代已经结束，如今更多的是灵活使用现有技术来解决问题。
不知正在看本文的Web开发人员，在上述这些开源项目中，你用到了哪些？欢迎你在评论中分享你的使用经验和心得。
原文地址：http://www.javaeye.com/news/20144
相关文章

2010-12-15 &amp;#8212; O&amp;#8217;Reilly Velocity China 2010
2009-07-05 &amp;#8212; Web开发与设计师速查手册汇集(二)
2009-07-05 &amp;#8212; Web开发与设计师速查手册汇集(一)
2009-06-05 &amp;#8212; 关于Web测试的一些Tips
2009-04-18 &amp;#8212; web架构设计
2009-04-04 &amp;#8212; 主流的开源Flash3D框架&lt;img src=&quot;http://www1.feedsky.com/t1/564908958/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/15-web-open-source-project/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>web</category><category>Open Source</category><category>Web Development</category><pubDate>Sun, 27 Feb 2011 12:44:40 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/15-web-open-source-project/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=310</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/15-web-open-source-project/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908958/5405152</fs:itemid></item><item><title>利用GAE搭建blog程序</title><link>http://www.wkeke.cn/archives/google-gae-micolog/</link><content:encoded>&lt;p&gt;GAE真的是个非常好的平台，能用来做很多事情。我平时就用它搭的代理来翻墙。今天准备在GAE上搭个blog玩玩，好像Micolog口碑很好，就使用了这款程序，在本地安装调试时出现了如下错误：&lt;/p&gt;
&lt;pre&gt;import _multiprocessing

ImportError: No module named _multiprocessing&lt;/pre&gt;
&lt;p&gt;但发布到GAE上是没有问题的。在网上发现很多人也遇到这个问题，应该是python版本的问题，我本地的python版本是2.6.2，官方的python版本是2.5，GAE还不能很好地支持python2.6.2。&lt;/p&gt;
&lt;p&gt;对于本地调试出现的上面这个问题，也是有解决之道的：&lt;/p&gt;
&lt;p&gt;在根目录下新建一个名为_multiprocessing.py的文件，写入一行代码即可：import multiprocessing&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2009-04-08 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/google-appengine-proxy-gapproxy/&quot; title=&quot;利用Google Appengine 架设自己的专属proxy服务器&quot;&gt;利用Google Appengine 架设自己的专属proxy服务器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2010-09-27 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/google-happy-birthday/&quot; title=&quot;Google生日快乐&quot;&gt;Google生日快乐&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2010-03-23 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/bye-google/&quot; title=&quot;我们离世界有多远-再别google&quot;&gt;我们离世界有多远-再别google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2010-01-16 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/baidu-google/&quot; title=&quot;杯具洗具餐具&quot;&gt;杯具洗具餐具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-09-26 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/challenges-adobe-flash-facing/&quot; title=&quot;Adobe Flash 面对的挑战&quot;&gt;Adobe Flash 面对的挑战&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-07-28 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/10-battlefield-of-google-vs-microsoft/&quot; title=&quot;谷歌对决微软的10大战场&quot;&gt;谷歌对决微软的10大战场&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908959/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/google-gae-micolog/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/google-gae-micolog/feed/</wfw:commentRss><description>GAE真的是个非常好的平台，能用来做很多事情。我平时就用它搭的代理来翻墙。今天准备在GAE上搭个blog玩玩，好像Micolog口碑很好，就使用了这款程序，在本地安装调试时出现了如下错误：
import _multiprocessing

ImportError: No module named _multiprocessing
但发布到GAE上是没有问题的。在网上发现很多人也遇到这个问题，应该是python版本的问题，我本地的python版本是2.6.2，官方的python版本是2.5，GAE还不能很好地支持python2.6.2。
对于本地调试出现的上面这个问题，也是有解决之道的：
在根目录下新建一个名为_multiprocessing.py的文件，写入一行代码即可：import multiprocessing
相关文章

2009-04-08 &amp;#8212; 利用Google Appengine 架设自己的专属proxy服务器
2010-09-27 &amp;#8212; Google生日快乐
2010-03-23 &amp;#8212; 我们离世界有多远-再别google
2010-01-16 &amp;#8212; 杯具洗具餐具
2009-09-26 &amp;#8212; Adobe Flash 面对的挑战
2009-07-28 &amp;#8212; 谷歌对决微软的10大战场&lt;img src=&quot;http://www1.feedsky.com/t1/564908959/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/google-gae-micolog/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>appengine</category><category>Focus</category><category>google</category><pubDate>Thu, 24 Feb 2011 01:07:32 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/google-gae-micolog/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=309</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/google-gae-micolog/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908959/5405152</fs:itemid></item><item><title>新年快乐</title><link>http://www.wkeke.cn/archives/happy-new-year-201/</link><content:encoded>&lt;p&gt;农历新年马上就要到了，现在还在公司，傍晚就要开始赶赴老家的旅程，预祝家人们身体倍棒，吃嘛嘛香，预祝各位 2011神马困难都是浮云，神马表现都要给力，神马梦想都能实现！&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2010-02-11 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/happy-new-year/&quot; title=&quot;新年快乐&quot;&gt;新年快乐&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908960/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/happy-new-year-201/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/happy-new-year-201/feed/</wfw:commentRss><description>农历新年马上就要到了，现在还在公司，傍晚就要开始赶赴老家的旅程，预祝家人们身体倍棒，吃嘛嘛香，预祝各位 2011神马困难都是浮云，神马表现都要给力，神马梦想都能实现！
相关文章

2010-02-11 &amp;#8212; 新年快乐&lt;img src=&quot;http://www1.feedsky.com/t1/564908960/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/happy-new-year-201/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>NewYear</category><category>Lanqi's Life</category><pubDate>Fri, 28 Jan 2011 15:41:51 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/happy-new-year-201/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=308</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/happy-new-year-201/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908960/5405152</fs:itemid></item><item><title>preg_replace_callback()调用类中的回调函数</title><link>http://www.wkeke.cn/archives/preg_replace_callback_in_php/</link><content:encoded>&lt;p&gt;最近项目中使用preg_replace_callback，需要使用它执行正则匹配时回调类中的方法，需要有一些注意的地方，做个记录。PHP文档中这样介绍 preg_replace_callback：(PHP 4 &gt;= 4.0.5, PHP 5中可以使用)，该方法用回调函数执行正则表达式的搜索和替换，本函数的行为几乎和 preg_replace() 一样，除了不是提供一个 replacement 参数，而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数，并返回用于替换的字符串。&lt;span id=&quot;more-307&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;所以，我们可以这样使用这个函数，下面是PHP手册中的例子：&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;
  // 此文本是用于 2002 年的，
  // 现在想使其能用于 2003 年
  $text = &quot;April fools day is 04/01/2002\n&quot;;
  $text.= &quot;Last christmas was 12/24/2001\n&quot;;

  // 回调函数
  function next_year($matches) {
    // 通常：$matches[0] 是完整的匹配项
    // $matches[1] 是第一个括号中的子模式的匹配项
    // 以此类推
    return $matches[1].($matches[2]+1);
  }

  echo preg_replace_callback(
              &quot;|(\d{2}/\d{2}/)(\d{4})|&quot;,
              &quot;next_year&quot;,
              $text);

  // 结果为：
  // April fools day is 04/01/2003
  // Last christmas was 12/24/2002
&lt;/pre&gt;
&lt;p&gt;这么使用的确没有问题。&lt;/p&gt;
&lt;p&gt;但是如果像下面那样在类中调用，就会报错。&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;
//此文本是用于 2002 年的，
//现在想使其能用于 2003 年
$text = &quot;April fools day is 04/01/2002n&quot;;
$text.= &quot;Last christmas was 12/24/2001n&quot;;

class ParseDate {
	// 回调函数
	function next_year($matches) {
		// 通常：$matches[0] 是完整的匹配项
		// $matches[1] 是第一个括号中的子模式的匹配项
		// 以此类推
		return $matches[1].($matches[2]+1);
	}

	function displayText($text) {
		echo preg_replace_callback(
			&quot;|(d{2}/d{2}/)(d{4})|&quot;,
			&quot;$this-&gt;next_year&quot;,
			$text);
	}
}

$pt = new ParseText();
$pt-&gt;displayText($text);
&lt;/pre&gt;
&lt;p&gt;上 面的程序执行的结果会是 preg_replace_callback() requires argument 2, [&amp;#8230;],to be a valid callback 。为什么会这样？让我们再看一次PHP文档对于preg_replace_callback()函数的定义：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;仔细看第二个参数callback，并不是字符串类型，而是callback这个伪类型！看看PHP的文档是怎么定义callback这个伪类型的：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;callback:&lt;/strong&gt;&lt;br /&gt;
有些诸如 call_user_function() 或 usort() 的函数接受用户自定义的函数作为一个参数。Callback 函数不仅可以是一个简单的函数，它还可以是一个对象的方法，包括静态类的方法。&lt;/p&gt;
&lt;p&gt;一个 PHP 函数用函数名字符串来传递。可以传递任何内置的或者用户自定义的函数，除了 array()，echo()，empty()，eval()，exit()，isset()，list()，print() 和 unset()。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个对象的方法以数组的形式来传递，数组的下标 0 指明对象名，下标 1 指明方法名。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对于没有实例化为对象的静态类，要传递其方法，将数组 0 下标指明的对象名换成该类的名称即可。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果是要调用对象的方法函数，那么就要用数组的形式来传递。在上面的程序段中，我们错误的想当然的使用了字符串的形式，所以导致PHP无法找到我们想要使用的回调函数。&lt;/p&gt;
&lt;p&gt;知道了原因，就好办了，只要简单的把代码改成&lt;br /&gt;
preg_replace_callback(&amp;#8221;|(d{2}/d{2}/)(d{4})|&amp;#8221;,array( &amp;#038;$this, &amp;#8216;next_year&amp;#8217;), $text);&lt;br /&gt;
就应该可以正常运行了。下面是完整的代码。&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;
// 此文本是用于 2002 年的，
// 现在想使其能用于 2003 年
$text = &quot;April fools day is 04/01/2002n&quot;;
$text.= &quot;Last christmas was 12/24/2001n&quot;;

class ParseDate {
	// 回调函数
	function next_year($matches) {
		// 通常：$matches[0] 是完整的匹配项
		// $matches[1] 是第一个括号中的子模式的匹配项
		// 以此类推
		return $matches[1].($matches[2]+1);
	}

	function displayText($text) {
		echo preg_replace_callback(
			&quot;|(d{2}/d{2}/)(d{4})|&quot;,
			array( &amp;#038;$this, 'next_year'),
			$text);
	}
}

$pt = new ParseText();
$pt-&gt;displayText($text);
&lt;/pre&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2010-10-16 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/some-php-tips/&quot; title=&quot;收集：一些PHP常用技巧&quot;&gt;收集：一些PHP常用技巧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-10-31 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/php-javascript-escape/&quot; title=&quot;PHP如何读取Javascript escape后的字符串&quot;&gt;PHP如何读取Javascript escape后的字符串&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-07-20 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/php-ini-chinese/&quot; title=&quot;PHP.INI配置文件中文版说明&quot;&gt;PHP.INI配置文件中文版说明&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-06-09 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/about-front-controller/&quot; title=&quot;前端控制器FrontController利弊&quot;&gt;前端控制器FrontController利弊&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-05-25 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/what-are-the-signs-that-you-are-php-rookie/&quot; title=&quot;哪些迹象证明你还是PHP菜鸟？&quot;&gt;哪些迹象证明你还是PHP菜鸟？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-05-14 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/how-to-use-php-to-get-all-http-request-header/&quot; title=&quot;如何用PHP取得所有HTTP请求头&quot;&gt;如何用PHP取得所有HTTP请求头&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908961/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/preg_replace_callback_in_php/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/preg_replace_callback_in_php/feed/</wfw:commentRss><description>最近项目中使用preg_replace_callback，需要使用它执行正则匹配时回调类中的方法，需要有一些注意的地方，做个记录。PHP文档中这样介绍 preg_replace_callback：(PHP 4 &gt;= 4.0.5, PHP 5中可以使用)，该方法用回调函数执行正则表达式的搜索和替换，本函数的行为几乎和 preg_replace() 一样，除了不是提供一个 replacement 参数，而是指定一个 callback 函数。该函数将以目标字符串中的匹配数组作为输入参数，并返回用于替换的字符串。
所以，我们可以这样使用这个函数，下面是PHP手册中的例子：

  // 此文本是用于 2002 年的，
  // 现在想使其能用于 2003 年
  $text = &quot;April fools day is 04/01/2002\n&quot;;
  $text.= &quot;Last christmas was 12/24/2001\n&quot;;

  // 回调函数
  function next_year($matches) {
    // 通常：$matches[0] 是完整的匹配项
    // $matches[1] [...]&lt;img src=&quot;http://www1.feedsky.com/t1/564908961/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/preg_replace_callback_in_php/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>PHP</category><category>Web Development</category><pubDate>Mon, 17 Jan 2011 21:44:06 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/preg_replace_callback_in_php/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=307</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/preg_replace_callback_in_php/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908961/5405152</fs:itemid></item><item><title>折腾VMware与Ubuntu</title><link>http://www.wkeke.cn/archives/vmware7-ubuntu10/</link><content:encoded>&lt;p&gt;这两天在虚拟机上折腾Ubuntu，期间有一些细节真是大费周章。最先是在xp上装上了VMware 6.5 ACE版，装Ubuntu10.10，死活装不上，在文件读取界面过后即进入命令行状态。然后重新装了一个VMware 6.5，这回顺利安装了Ubuntu10.10，然后装Vmware tools，但安装到vmmemctl模块时，读取文件失败，路径不对，应该是Ubuntu版本太高，而VMware版本较低。遂换一个较低版本的Ubuntu，安装Ubuntu10.04，这次成功走完了VMware tools的安装过程，之后准备在host系统和guest系统间共享文件，在VMware的share folder设置好共享之后，在Ubuntu的/mnt/hgfs下却找不到共享的文件夹，检查发现vmhgfs没有安装成功，再次安装VMware tools，一路回车的同时，仔细查看输出，发现基本所有的模块都安装失败，然后查找资料，试了很多方法，包括修改VMware tools安装包中vmhgfs.tar中的源文件，但无济于事，想想应该还是VMware版本的问题，遂重新安装最新VMware 7.X，然后依托其安装Ubuntu10.10，终于一路顺水顺风了。&lt;/p&gt;
&lt;p&gt;BTW:Ubuntu10.10中自带的Ubuntu字体确实很漂漂~&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2009-04-24 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/ubuntu-904/&quot; title=&quot;Ubuntu9.04正式版发布&quot;&gt;Ubuntu9.04正式版发布&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-02-27 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/ubuntu-904-alpha-5-release/&quot; title=&quot;Ubuntu 9.04  Alpha 5 发布&quot;&gt;Ubuntu 9.04  Alpha 5 发布&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908962/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/vmware7-ubuntu10/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/vmware7-ubuntu10/feed/</wfw:commentRss><description>这两天在虚拟机上折腾Ubuntu，期间有一些细节真是大费周章。最先是在xp上装上了VMware 6.5 ACE版，装Ubuntu10.10，死活装不上，在文件读取界面过后即进入命令行状态。然后重新装了一个VMware 6.5，这回顺利安装了Ubuntu10.10，然后装Vmware tools，但安装到vmmemctl模块时，读取文件失败，路径不对，应该是Ubuntu版本太高，而VMware版本较低。遂换一个较低版本的Ubuntu，安装Ubuntu10.04，这次成功走完了VMware tools的安装过程，之后准备在host系统和guest系统间共享文件，在VMware的share folder设置好共享之后，在Ubuntu的/mnt/hgfs下却找不到共享的文件夹，检查发现vmhgfs没有安装成功，再次安装VMware tools，一路回车的同时，仔细查看输出，发现基本所有的模块都安装失败，然后查找资料，试了很多方法，包括修改VMware tools安装包中vmhgfs.tar中的源文件，但无济于事，想想应该还是VMware版本的问题，遂重新安装最新VMware 7.X，然后依托其安装Ubuntu10.10，终于一路顺水顺风了。
BTW:Ubuntu10.10中自带的Ubuntu字体确实很漂漂~
相关文章

2009-04-24 &amp;#8212; Ubuntu9.04正式版发布
2009-02-27 &amp;#8212; Ubuntu 9.04  Alpha 5 发布&lt;img src=&quot;http://www1.feedsky.com/t1/564908962/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/vmware7-ubuntu10/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>ubuntu</category><category>Lanqi's Life</category><pubDate>Thu, 30 Dec 2010 19:26:02 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/vmware7-ubuntu10/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=306</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/vmware7-ubuntu10/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908962/5405152</fs:itemid></item><item><title>O’Reilly Velocity China 2010</title><link>http://www.wkeke.cn/archives/oreilly-velocity-china-2010/</link><content:encoded>&lt;p&gt;&lt;a title=&quot;O'Reilly Velocity China 2010&quot; href=&quot;http://velocity.oreilly.com.cn/&quot; target=&quot;_blank&quot;&gt;O&amp;#8217;Reilly Velocity China 2010&lt;/a&gt; Web 性能和运维大会于12月7日在北京召开，致力于Web应用性能的提升和同时更加稳定的表现。大会云集众多专家，值得一看。&lt;/p&gt;
&lt;p&gt;“5年前只有开发人员关心网站的性能。而今天认识到快速网站重要性的群体已经扩展至更广泛的范围，包括销售团队、市场部门、商业开发人员以及更高的管理层。 这就导致一个新产业的出现──WPO（Web Performance Optimization  ，网站性能优化）。现有的厂商在增加网站性能服务。创业公司则提供提高用户体验的新技术。主流网站在购买这些服务的同时自己也开发更多的服务和技术。采用 WPO技术的网站能吸引更多的用户，提供更好的用户体验，增加收入，并且降低成本。5年来我们走了很长的一段路，让我们共同回顾一下在让网站变得更快的道 路上的一些成就。”&lt;/p&gt;
&lt;p&gt;官网上总结的 &lt;a title=&quot;O'Reilly Velocity China 2010&quot; href=&quot;http://velocity.oreilly.com.cn/index.php?func=slidesvideos&quot; target=&quot;_blank&quot;&gt;发言幻灯片及视频&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2011-02-27 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/15-web-open-source-project/&quot; title=&quot;Web开发人员感兴趣的15个开源项目[转载]&quot;&gt;Web开发人员感兴趣的15个开源项目[转载]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-07-05 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/web-cheep-sheet-2/&quot; title=&quot;Web开发与设计师速查手册汇集(二)&quot;&gt;Web开发与设计师速查手册汇集(二)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-07-05 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/web-cheet-sheet/&quot; title=&quot;Web开发与设计师速查手册汇集(一)&quot;&gt;Web开发与设计师速查手册汇集(一)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-06-05 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/some-tips-about-web-test/&quot; title=&quot;关于Web测试的一些Tips&quot;&gt;关于Web测试的一些Tips&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-04-18 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/web-architecture-design/&quot; title=&quot;web架构设计&quot;&gt;web架构设计&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-04-01 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/minimalisn-in-web-design/&quot; title=&quot;Web设计中的“极简主义”&quot;&gt;Web设计中的“极简主义”&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908963/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/oreilly-velocity-china-2010/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/oreilly-velocity-china-2010/feed/</wfw:commentRss><description>O&amp;#8217;Reilly Velocity China 2010 Web 性能和运维大会于12月7日在北京召开，致力于Web应用性能的提升和同时更加稳定的表现。大会云集众多专家，值得一看。
“5年前只有开发人员关心网站的性能。而今天认识到快速网站重要性的群体已经扩展至更广泛的范围，包括销售团队、市场部门、商业开发人员以及更高的管理层。 这就导致一个新产业的出现──WPO（Web Performance Optimization  ，网站性能优化）。现有的厂商在增加网站性能服务。创业公司则提供提高用户体验的新技术。主流网站在购买这些服务的同时自己也开发更多的服务和技术。采用 WPO技术的网站能吸引更多的用户，提供更好的用户体验，增加收入，并且降低成本。5年来我们走了很长的一段路，让我们共同回顾一下在让网站变得更快的道 路上的一些成就。”
官网上总结的 发言幻灯片及视频
相关文章

2011-02-27 &amp;#8212; Web开发人员感兴趣的15个开源项目[转载]
2009-07-05 &amp;#8212; Web开发与设计师速查手册汇集(二)
2009-07-05 &amp;#8212; Web开发与设计师速查手册汇集(一)
2009-06-05 &amp;#8212; 关于Web测试的一些Tips
2009-04-18 &amp;#8212; web架构设计
2009-04-01 &amp;#8212; Web设计中的“极简主义”&lt;img src=&quot;http://www1.feedsky.com/t1/564908963/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/oreilly-velocity-china-2010/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>velocity</category><category>web</category><category>Focus</category><pubDate>Wed, 15 Dec 2010 10:52:38 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/oreilly-velocity-china-2010/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=305</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/oreilly-velocity-china-2010/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908963/5405152</fs:itemid></item><item><title>一个CN域名带来的苦恼</title><link>http://www.wkeke.cn/archives/troubled-cn-domain-bring-to-me/</link><content:encoded>&lt;p&gt;曾几何时，申请了一堆cn域名，包括本站的&lt;a title=&quot;蓝色骑兵&quot; href=&quot;http://www.wkeke.cn&quot; target=&quot;_blank&quot;&gt;wkeke.cn&lt;/a&gt;，源于cn域名火爆的那段岁月。到现在，手里的域名也仅有这一个是cn域名了，因为和我名字的契合，国籍的契合，呵呵，并且涨到了PR5，也不容易，一直没有放弃。但就是这一个cn域名，真的给我带来了无尽的苦恼。&lt;/p&gt;
&lt;p&gt;记得在08年艰难备案成功，在09年被撤销备案，遂重新备案，10年又撤销备案，遂再次重新提交，7月份，主机商通知我需要邮寄域名所有人照片、身份证复印件等各种备案材料，一阵周折之后，维持了此站在网路上正常运行。10月末，遭域名商停止解析，原因是没有在顶级域名注册商处提交所有人资料……&lt;/p&gt;
&lt;p&gt;其实这个站是一个再普通不过的个站。哦了，已经习惯了，虽然朋友劝我放弃这个cn米，但是既然已经为它付出这么多，权当活该吧！&lt;br /&gt;
&lt;h3&gt;相关文章&lt;/h3&gt;
&lt;ul class=&quot;related_post&quot;&gt;
&lt;li&gt;2010-04-25 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/strip-some-friend-link/&quot; title=&quot;处理了一批链接&quot;&gt;处理了一批链接&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2010-04-22 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/wkeke-cn-miibeian-gov-cn/&quot; title=&quot;再次备案成功 重新开张&quot;&gt;再次备案成功 重新开张&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-05-28 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/09-pr-update-again/&quot; title=&quot;PR又更新了？&quot;&gt;PR又更新了？&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2009-04-02 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/google-pr-update/&quot; title=&quot;PR更新了&quot;&gt;PR更新了&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2008-04-18 &amp;#8212; &lt;a href=&quot;http://www.wkeke.cn/archives/wkeke-cn-begin-with-noting/&quot; title=&quot;一切的都是新的，从0开始……&quot;&gt;一切的都是新的，从0开始……&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/564908964/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/troubled-cn-domain-bring-to-me/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://www.wkeke.cn/archives/troubled-cn-domain-bring-to-me/feed/</wfw:commentRss><description>曾几何时，申请了一堆cn域名，包括本站的wkeke.cn，源于cn域名火爆的那段岁月。到现在，手里的域名也仅有这一个是cn域名了，因为和我名字的契合，国籍的契合，呵呵，并且涨到了PR5，也不容易，一直没有放弃。但就是这一个cn域名，真的给我带来了无尽的苦恼。
记得在08年艰难备案成功，在09年被撤销备案，遂重新备案，10年又撤销备案，遂再次重新提交，7月份，主机商通知我需要邮寄域名所有人照片、身份证复印件等各种备案材料，一阵周折之后，维持了此站在网路上正常运行。10月末，遭域名商停止解析，原因是没有在顶级域名注册商处提交所有人资料……
其实这个站是一个再普通不过的个站。哦了，已经习惯了，虽然朋友劝我放弃这个cn米，但是既然已经为它付出这么多，权当活该吧！
相关文章

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

1、如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。
2、$row[’id’]  的速度是$row[id]的7倍。
3、echo 比 print  快，并且使用echo的多重参数（译注：指用逗号而不是句点）代替字符串连接，比如echo $str1,$str2。
4、在执行for循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。
5、注销那些不用的变量尤其是大数组，以便释放内存。
6、尽量避免使用__get，__set，__autoload。
7、require_once()代价昂贵。
8、  include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。
9、如果你想知道脚本开始执行（译注：即服务器端收到客户端请求）的时刻，使用$_SERVER[‘REQUEST_TIME’]要好于time()。
10、函数代替正则表达式完成相同功能。
11、str_replace函数比preg_replace函数快，但strtr函数的效率是  str_replace函数的四倍。
12、如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只 写一行代码接受数组作为查询和替换的参数。
13、使用选择分支语句（译注：即 switch case）好于使用多个if，else if语句。
14、用@屏蔽错误消息的做法非常低效，极其低效。
15、打开apache的mod_deflate模块，可以提高网页的浏览速度。
16、数据库连接当使用完毕时应关掉，不要用长连接。
17、错误消息代价昂贵。
18、在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。
19、递增一个全局变量要比递增一个局部变量慢2倍。
20、递增一个对象属性（如：$this-&amp;#62;prop++）要比递增一个局部变量慢3倍。
21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
22、仅定义一个局部变量而没在函数中调用它，同样会减慢速度（其程度相当于递增一个局部变量）。PHP大概会检查看是否存在全局变量。
23、方法调用看来与类中定义的方法的数量无关，因为我（在测试方法之前和之后都）添加了10个方法，但性能上没有变化。
24、派生类中的方法运行起来要快于在基类中定义的同样的方法。
25、调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
26、 Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。
27、除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。
28、尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运 算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。
29、当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用  strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval  结构（C的内置数据结构，用于存储PHP变量）中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步 骤，如字母小写化（译注：指函数名小写化，PHP不区分函数名大小写）、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset()  技巧加速执行你的代码。  （举例如下）  if (strlen($foo) &amp;#60; 5) { echo “Foo is too  short”$$ }  （与下面的技巧做比较）  if (!isset($foo{5})) { echo “Foo is too [...]&lt;img src=&quot;http://www1.feedsky.com/t1/564908965/lanqi/feedsky/s.gif?r=http://www.wkeke.cn/archives/some-php-tips/&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>PHP</category><pubDate>Sat, 16 Oct 2010 16:50:40 +0800</pubDate><author>cocoa</author><comments>http://www.wkeke.cn/archives/some-php-tips/#comments</comments><guid isPermaLink="false">http://www.wkeke.cn/?p=303</guid><dc:creator>cocoa</dc:creator><fs:srclink>http://www.wkeke.cn/archives/some-php-tips/</fs:srclink><fs:srcfeed>http://wkeke.cn/feed</fs:srcfeed><fs:itemid>feedsky/lanqi/~7295673/564908965/5405152</fs:itemid></item></channel></rss>
