<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
   <channel>
      <title><![CDATA[嗨网博客]]></title>
      <link>https://higrid.net</link>
      <description>这是我的博客</description>
      <lastBuildDate>Mon, 07 Jul 2014 00:00:00 +0800</lastBuildDate>
      <language>en-gb</language>
      <webMaster>higrid@qq.com</webMaster>
      <copyright>Copyright 2026</copyright>


               <item>
         <title><![CDATA[科学家找到细胞"开关" 揭示细胞能量代谢机制]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/a-test-technical-report</link>
         <guid>https://higrid.net/blog/a-test-technical-report</guid>
         <category>article</category>
         <pubDate>Mon, 07 Jul 2014 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>厦门大学生命科学学院林圣彩教授课题组近期的一项研究，找到了体内细胞调控代谢的一个“开关”，由它可以“下达”细胞合成代谢或分解代谢“命令”，从而解开了细胞能量代谢研究领域的一个谜底。</p>

<p>能量代谢是细胞中最基本、最重要的活动之一。当能量水平下降时，细胞能通过其感应因子加快能量产生；当能量充裕时，细胞则通过另一感应因子加快耗能的活动，从而维持总体能量平衡。</p>

<p>林圣彩介绍，近年来的研究已经发现，能量代谢平衡调控是由多个与之相关的信号通路所介导，其中最为重要也最被广泛研究的有两条：AMPK信号通路和mTOR信号通路。简单说来，AMPK信号通路开启的是分解代谢通路，mTOR信号通路开启的则是合成代谢通路。</p>

<p>随之而来的问题是，下达合成代谢和分解代谢“命令”的“指挥官”是谁，又何时下达？林圣彩课题组破解了这个谜底。7月3日，这一研究成果在国际顶尖学术杂志《细胞》子刊《细胞·代谢》在线发表。他们发现了控制这两个截然相反的代谢路径的“开关”。让人诧异的是，它还竟然是同一个“开关”。这是一种分布在细胞内膜的名为“v-ATPase-Ragulator”的蛋白质复合体。通俗点儿说，当细胞内能量水平降低时，这个蛋白质的形状会发生变化从而让能激活AMPK的复合体与其相互作用，使之被激活。激活后的AMPK最终下达分解代谢“命令”。反之，当细胞内能量水平较高时，mTOR将与“v-ATPase-Ragulator”的蛋白质复合体相结合并被激活，开启合成代谢通路。</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[85后售楼小姐1年卖房近两亿元 年薪近30万元]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/rich-real-estate-salesgirl</link>
         <guid>https://higrid.net/blog/rich-real-estate-salesgirl</guid>
         <category>article</category>
         <pubDate>Thu, 03 Oct 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>编者按：</p>

<p>十一长假，有人开始一场说走就走的旅行，有人投入一次奋不顾身的血拼，外出消闲的人潮，纷纷大把大把钱往外掏。</p>

<p>不过，有这么一群人，他们的钱包非但没有缩水，反而广进财源。他们可能是全年无休的售楼小姐，可能是一丝不苟的金店柜员，他们出售豪车的风驰电掣，他们贩卖桌游的智力按摩，在这个长假里，他们比往日更加辛苦忙碌，却把黄金周变成了真正的“淘金周”。</p>

<p>本报今起推出系列报道，走进那些用时间和汗水换取财富的“黄金周淘金族”。</p>

<p>每天拿着激光笔对着沙盘指点江山，不厌其烦地介绍样板间的每一个细节，统计每个客户的信息，追踪回访，他们正是高端楼盘销售员。</p>

<p>优良的业绩可以给售楼员带来数十万的年薪，但全年节假日无休，每天站七八个小时，接待数十名客户，光鲜背后掩盖不住售楼员的辛酸。</p>

<h2>最牛销售员今年不到25岁</h2>

<p>前日中午12点30分，记者在中北路一个高端楼盘售楼处见到了吴思思。彼时，她正在陪同一对中年夫妇看房。比较了多个楼盘模型后，夫妇俩选中了三处比较满意的户型，吴思思随即带他们去看样板房，这已是她当天接待的第三拨客户。这个长假，因为新盘密集加推，又正是金九银十的传统旺季，客户比平时多了两三倍，吴思思一天也不能休息。</p>

<p>直到下午四点，吴思思才稍微得了点空闲。身高1.65米，身着得体的职业装，吴思思谈吐间流露的成熟气度，很难让人将她和一个还不到25岁的女孩联系在一起。</p>

<p>“我大学学的是房地产造价专业，之前在一家银行做房地产信贷，后来对销售感兴趣，就果断转行了。”2011年，吴思思开始售楼小姐生涯。没想到，她只花了一年就实现了1.3亿元销售额，去年还一举拿下公司“销售冠军”的称号。今年前9个月，吴思思再次创下1.5亿元的销量记录，她信心满满地表示，今年冲刺2亿元目标应该问题不大。</p>

<h2>提成千分之一年薪近30万</h2>

<p>在常人印象中，售楼小姐衣着光鲜，分分钟就能卖出房子拿到大把佣金，事实真是这样吗？</p>

<p>吴思思诉苦说，“这绝对是误区”。据她介绍，新人的基本工资一般只有1500元，就算做到销售主管也才2500元，“提成虽然有千分之一，但是因为售楼小姐流动率高，实际上有20%的提成要预留到年底发，还有10%被暂时扣下，等客户付款后，我们能拿到手的提成只有万分之七。”</p>

<p>按照吴思思所说的标准，成交一套100万元的房子，售楼员能拿到700元提成，如果把年终奖包含在内，一个年销售额2亿元的售楼小姐，年薪近30万元。“业绩好的售楼小姐收入确实不错，但都是用辛劳和汗水换来的。”吴思思说。</p>

<h2>楼市“红娘”卖房促成好姻缘</h2>

<p>每天上午9点上班，下班后还要进行签约统计和客户回访，晚上9点回家是常态；节假日从不休息，每周只能在周一到周五选择一天轮休，这便是售楼小姐每天的工作状态。</p>

<p>吴思思的父母和男友都不太理解，“女孩子干嘛把自己搞得那么辛苦？”父母一直希望她在光谷开一家店，自己做老板，吴思思却说，，“做销售比开店更锻炼人。”</p>

<p>让吴思思有成就感的还有她在工作中促成的一段姻缘。有一次，一对情侣前来买房，刚好遇到限购，男方是外地人，看好了房子却没有购买资格。吴思思得知女方是武汉本地人后，就产生了做红娘的想法。几经撮合外加单独约见双方父母，“小情侣很快就把证给领了，后来还请我去喝喜酒呢。”忆及此事，吴思思难掩兴奋和自豪。</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[2013上半年来华外籍游客数量创近年新低]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/foreign-guest-to-china</link>
         <guid>https://higrid.net/blog/foreign-guest-to-china</guid>
         <category>article</category>
         <pubDate>Wed, 02 Oct 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<h2>统计数据</h2>

<p>根据国家旅游局的最新统计，2013年1至6月份，来华观光休闲的外籍游客数量仅为493.98万人，此前三年的同期数据分别为，574.04万人（2012年）、576.5万人（2011年）和589.08万人（2010年）。统计资料显示，上半年赴华“观光休闲”的外籍游客人数已经连续3年下滑，2013年人数相比2008年同期的614.58万人更是缩减了1/6以上。</p>

<p>此前，世界经济论坛发布了一项《2013旅游业竞争力报告》，分析总结了全球140个国家的相关数据。结果显示，中国旅游业总体竞争力位列亚太地区第10，世界总排名较前一年下滑6位，位列45名。报告共对75项与旅游业有关的指标进行了调研，其中包括一项世界对外友好度调查，调查者向不同国家的民众提出同样的问题：“在你的国家，外国游客有多受欢迎？”各国民众就此对本国现状评价打分。</p>

<p><a class="gallery" href="http://img1.cache.netease.com/cnews/2013/9/30/20130930000447087af.png"><img alt="2013上半年来华外籍游客数量创近年新低" src="http://img2.cache.netease.com/cnews/2013/9/30/20130930000520e8ee8.jpg" /></a></p>

<h2>评论</h2>

<p>令人惊讶的是，“热情好客”的中国人民在此项调查中的排名却将近垫底，仅排在第130位，位列倒数第11，综合得分为5.5分，低于世界平均分6.1分。而北欧国家冰岛，以6.8分摘得全球对外最友好国家桂冠。</p>

<p>当然，“不受欢迎”并不能合理解释外国人开始不爱造访中国，从上述报告来看，世界旅游业受经济、政治形式等因素影响巨大。另一方，近几年，“外国人逃离中国”已频频成为国内外媒体言及的话题，从诸多报道中，或许也能得到相关的一些启示。著名杂志《经济学人》在一篇分析文章中指出，恶劣的城市环境、糟糕空气和食品质量、行政机构腐败水平、不健全的法律体系以及不科学的教育体系，都成为外国人逃离中国的理由。一位名为 Charlie Custer的美国制片人表示，由于不同的社会、法律制度，自己在中国的生活不仅有过沮丧、震惊，也有偶尔的恐惧。但他更强调空气污染和食品安全带来的问题，他最终离开中国的原因很简短：“我爱大口呼吸，同时也是个吃货。”</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[南京美龄宫修缮后开放 还原"第一夫人"生活细节]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/open-meiling-villa</link>
         <guid>https://higrid.net/blog/open-meiling-villa</guid>
         <category>article</category>
         <pubDate>Thu, 12 Sep 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>经历建成82年来头一回、长达9个月的大修，南京美龄宫外观修缮一新，房间陈设几乎恢复到民国“第一夫人”居于其中时的样子，而拥有复杂系统的地下室也首次向游客开放，加上宋美龄复制手稿等展品，在这座结构精妙的“宫殿”里，蒋宋夫妇的家庭生活向世人重现。</p>

<h2>住</h2>

<h3>蒋宋夫妇有主、次两间卧室</h3>

<p>美龄宫整体建筑分为地下一层，地上三层。蒋宋夫妇二人的卧房就位于三楼，两人的卧室分为主卧、次卧，主卧在内，次卧在外。由于蒋介石、宋美龄生活习惯的不同，卧室分为主卧与次卧。“主要是出身行伍的蒋介石早睡早起，而宋美龄像现在年轻人一样晚睡晚起，所以为了互不影响休息，准备了两个卧室。”中山陵园管理局副局长廖锦汉说。</p>

<p>记者看到次卧房间右边是一典型的西方取暖壁炉，是冬季取暖用的。天花顶部挂着一个美国产的“华生”牌四叶吊扇，虽已时隔80年，但现在仍能正常运转。布置上突出蒋介石的军人生活习惯，依据侍卫官所著的回忆录，次卧只有一套普通的西式家具，被褥平铺，留声机里放出轻音乐，布置上相对主卧更为简洁、沉稳。</p>

<p>而在主卧室，陈设一下就多了起来。东、南面各有三扇近4米高的钢窗，采光、通风极好。东面有一宽敞的阳台。清晨，站在阳台，就能看到太阳升起，享受到第一缕阳光。家具为全套红木家具，做工精湛而考究，外观华丽而精美，并雕有精美的花饰，衣橱外红木内樟木，时隔80年仍不失做工的精湛和外观的精美。</p>

<h2>食</h2>

<h3>地下室厨房做好菜，电梯送上3楼</h3>

<p>美龄宫里蒋宋夫妇等人用餐的地方主要有两处。在二楼大厅，是举行国宴的地方。依据2010年团结出版社《蒋介石私人医生回忆录》上的文字描述，采用长桌、西式礼节，桌面摆放欧式餐具，精致、典雅。现在陈设全部复原，主人宴请宾客的景象似乎就在眼间，觥筹交错、谈笑风生。</p>

<p>三楼的私人餐厅是宋美龄、蒋介石私人用餐地。厅内主要是一张两人坐的小桌，双方面对落座。由于是私人餐厅，为了避免服务人员打扰，餐厅右边是服务人员所在的小房间，左边是服务配餐间，这里与地下室配膳间、厨房相连，用一小电梯相接，食品、菜肴加工好后，通过升降电梯由厨房传送上来。现在，小电梯还没有复原打通，而是计划做一个场景再现。</p>

<p>工作人员介绍说，生活、谈吐西化的宋美龄常在此与她的“达令”品尝西餐。同时，蒋介石也在此宴请高级军、政要员，以示亲近。</p>

<h2>行</h2>

<h3>宋美龄座驾为美国政府所赠</h3>

<p>美龄宫主楼的大门口停放着一辆黑色轿车。据介绍，这是一辆仿制的轿车，原车是美国通用汽车公司三十年代生产的“别克”牌轿车，由美国政府赠送给宋美龄的。“这种车高贵、华丽，款式新颖。车内宽敞明亮，外观呈黑色，特制弹簧，避震性能好，乘坐极为舒适。”车牌号“军00385”为当年宋美龄专用。据介绍，原车已经在解放前运往台湾，现在这辆车是管理局找专业的汽车生产厂仿制而成了。车内的陈设配件都根据当年蒋宋夫妇身边人的回忆录，进行配置的。</p>

<p>去美龄宫也别忘了走上南阳台，这里是整个建筑最具艺术精华的部分之一，此次大修也全部焕然一新。阳台为“品”字形，栏杆采用优质汉白玉雕刻而成。34根立柱上均雕有一只形态各异的凤凰。抬头仰望，别墅上端两侧和每层屋顶、瓦檐、瓦当均有一只展翅欲飞的凤凰。在以龙为主，龙凤呈祥的历代皇家建筑背景下，突出凤凰不见龙影是别开生面的创新，也更加突出了别墅主人的韵味和高贵。</p>

<p>值得一提的是，阳台总共34根立柱，宋美龄自1898年出生，到1931年开始建造这幢别墅，正是34周岁，34根立柱，34只凤凰，是否寓此意？宋美龄出生于1898年3月4日，是否34根立柱34只凤凰寓意宋美龄的生日？这两种说法至今仍未明确，给人们留下一个未解之谜。</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[持续写作的重要性]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/the-importent-of-writing</link>
         <guid>https://higrid.net/blog/the-importent-of-writing</guid>
         <category>article</category>
         <pubDate>Thu, 01 Aug 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>最近都没有怎么上微博，昨天上去看到这样一句话，让我挺有感触
我自己写的东西大部分都是一些遇到问题记录和总结，很少能有一些“创造性”的东西。</p>

<p>记得Fenng在一篇文章里讲到现在的社交网站中，98%的人在消费信息，只有2%的人在产生信息。</p>

<p>我一直属于这98%的人，没有办法，在大学之前从来没有觉得写作的重要性，写出来的东西也是为了完成作文800字的限制。现在想象一下，感觉自己真是太文盲了，自己能写的好像也只有议论文了。提一个议论点，然后摆一些论据，最后总结一下，800字搞定收工。甚至在写一些个人技术学习总结的时候都没有很好的利用好议论文方法，仅仅是一个流水陈述，想到哪里写到哪里。</p>

<h2>为什么要建立一个博客</h2>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse fermentum lobortis porta. Mauris faucibus hendrerit pulvinar. Pellentesque sagittis, enim eu ornare dapibus, ligula nibh fermentum mauris, nec interdum lorem ante vel nunc. Nam vestibulum eleifend lorem, ullamcorper fermentum nulla ultrices in. Vivamus luctus iaculis quam. Nulla arcu eros, iaculis at elementum dignissim, rhoncus rutrum felis. Etiam convallis felis at dui laoreet malesuada. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec et nunc erat. In hac habitasse platea dictumst. Suspendisse et ante eget arcu pellentesque fermentum nec eu est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sit amet risus sed magna varius commodo ac eget sapien. In lectus ante, pretium sed ultrices ut, bibendum nec eros.</p>

<p>曾经也想过提高一下个人写作水平，想过的一个方式是翻译外文，把今天的hacker news上或者techmeme上感兴趣的一篇文章翻译下来。尝试过一次太受打击，就放弃了。虽然看这些文章基本上没有什么问题，但是要翻译的时候就英语水平捉急了，翻译一篇可能要耗费好多小时的时间。以前翻译过一篇因为没有找到译文，自己又比较需要这方面的信息，所以尝试了一下，结果发现就这样一个自己比较了解的东西，都翻译的惨不忍睹。</p>

<p>现在每天除了学习英语，其余时间最多的就是看看微信上的公众帐号，小道消息、道哥黑板报、Mac Talk都是我比较喜欢的公众帐号。虽然我没有他们那样深的积累和话题，或许我能从个人理解上写一些容易上手的话题。</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[篮球才-测试]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/a-test-for-u</link>
         <guid>https://higrid.net/blog/a-test-for-u</guid>
         <category>article</category>
         <pubDate>Thu, 11 Jul 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>强大的 @vim@ 拥有大量的语法文件，这当中当然包括了 @md@ 的语法高亮文件。但是，随着时间的推移，</p>

<p>基本的markdown语法高亮已经不太适合，因为 @md@ 的语法进行了扩充，有用很多其他的特性(包括支持Latex、输入表格等)。
其实 Vim语法检测很好使用在开始写语法文件之前，有必要先了解一下vim是如何对文件类型进行识别的，</p>

<p>有助于更好的理解vim的启动过程，本文是一个初级使用。分析了<strong>Vim语法高亮</strong>的原理，</p>

<p>阐述了如何定制一个自己的文件类型，并进行语法高亮</p>

<h2>为什么要建立一个博客</h2>

<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse fermentum lobortis porta. Mauris faucibus hendrerit pulvinar. Pellentesque sagittis, enim eu ornare dapibus, ligula nibh fermentum mauris, nec interdum lorem ante vel nunc. Nam vestibulum eleifend lorem, ullamcorper fermentum nulla ultrices in. Vivamus luctus iaculis quam. Nulla arcu eros, iaculis at elementum dignissim, rhoncus rutrum felis. Etiam convallis felis at dui laoreet malesuada. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec et nunc erat. In hac habitasse platea dictumst. Suspendisse et ante eget arcu pellentesque fermentum nec eu est. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Curabitur sit amet risus sed magna varius commodo ac eget sapien. In lectus ante, pretium sed ultrices ut, bibendum nec eros.</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[本科生涯结束了]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/the-end-of-regular-college-course</link>
         <guid>https://higrid.net/blog/the-end-of-regular-college-course</guid>
         <category>article</category>
         <pubDate>Mon, 17 Jun 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>今天上午答辩完了，准备了几个月的毕业设计，也算是给了自己一个交代。</p>

<p>回想自己本科四年，有过得失，有过起伏。自己在学校做了很多自己大学之前敢，也没有机会做的事情。</p>

<p>这四年每天都有新鲜事情发生，现在却一件都想不起来了，唯一的感觉就是自己淡然了很多。</p>

<p>每天混迹在V2EX、微博还有微信中，这些都是我的消息来源，我奋力搜集着自己感兴趣的内容，漫无目的。</p>

<p>出去实习过，也有过干一番事情的冲动，但最后还是选择了安稳读研。曾经一边努力获得保研名额，却又暗暗希望保研失败，这样我就可以有别的选择，不是这样漫无目的走下去。</p>

<p>除了人，这个学校没有什么让我值得留恋的地方，但我却选择继续留在这里。可我决的我天性应该适合陌生的环境，在陌生环境中我有极强的求生欲，内心的斗志会被激发出来，就像我刚来大学时候的状态。</p>

<p>唯一让我难以忘怀的是我在大学遇到的几个人，他们是我这辈子可能都不会忘掉的。另外更值得一提的是大二追到的女友，我们一直走了三年，再过13天就是我们三周年纪念日，她是我大学最大的收获。</p>

<p>在我看来，一段理想的生活即将结束，未来的路谁都没法预测，坚持做自己认为对的事情，就够了。</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[Vim正则表达式技巧]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/vim_special</link>
         <guid>https://higrid.net/blog/vim_special</guid>
         <category>article</category>
         <pubDate>Wed, 08 May 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>Vim，即Vi IMproved，是一个Vi的增强版，Linux下最为常用的编辑器之一。然而，它强大的功能是它不仅仅是一个编辑器。
花点时间学习一下Vim的使用，可以事半功倍。随着使用，就会发现Vim的强大。
Vim高级编辑要用到正则表达式的各种技巧，先简单介绍基本的原字符集及其含义：</p>

<ul>
<li><code>^</code> &#8212;只匹配行首</li>
<li><code>$</code> &#8212;只匹配行尾</li>
<li><code>*</code> &#8212;匹配0个或多个单字符</li>
<li>[]  &#8212;匹配[]内字符，可以是一个单字符，也可以是字符序列，可是用-表示[]内字符序列范围，如用[1-5]表示[12345]。</li>
<li><code>.</code> &#8212;匹配任意单字符</li>
<li><code>^$</code> &#8212;匹配空行
在vi中也可以使用这些正则表达式。它也有它自己的语法格式，不过匹配方式类似，比较一下很容易看出。下面给出几个常用的操作：</li>
</ul>

<p>HIGRID_ART_ADS</p>

<ol>
<li>把文件内容反转，第一行成为最后一行，第二行成为倒数第二行，以此类推 <code>:g/^/m0</code></li>
<li>在整个文件中替换特定字符串 <code>:%s/原文件的内容/替换成的内容/g</code></li>
<li>例如：去掉文件中的<code>^M</code> 等控制符 <code>:1,$s/^M//g (或者:%s/^M//g)</code></li>
<li>在每一行文本前加同样的字符 <code>:%s/^/要加的内容/g</code></li>
<li>在每一行文本后加同样的字符 <code>:%s/$/要加的内容/g</code></li>
<li>在第2行行首加入内容 <code>:2s/^/要加的内容/g</code></li>
<li>在第1，2行行首加入内容 <code>:1,2s/^/要加的内容/g</code></li>
<li>删除第1，2行行首的内容 <code>:1,2s/^要删除的内容/g</code></li>
<li>删除第2行行尾的内容 <code>:2s/要删除的内容$/g</code></li>
<li>删除第5行包含的字符串 <code>:5s/要删除的字符串/g</code></li>
<li>删除从当前行开始到最后一行的所有内容 <code>:[dot][comma]$d</code></li>
</ol>

<p>注意，冒号后面紧跟“点”（表示当前行），然后跟一个“逗号”，加“$”（表示最后一行），d表示删除。】</p>

<p>这些技巧要总结规律性，而且要在每天操作时使用，熟悉得成为手指的本能。只是看是不可能学会的。正如林锐博士所言，学了不一定懂了，懂了不一定会用。勤加练习！其他使用vi进行文本操作的技巧</p>

<h2>基本操作</h2>

<pre><code>dd  删除当前行
ndd 删除当前行以下n行（包括当前行在内）
p   粘贴
yy  复制当前行
nyy 复制当前行以下n行（包括当前行在内）
dd和ndd也可以认为是“剪切”。
</code></pre>

<h2>技巧</h2>

<pre><code>:n,m co k  复制n到m行，粘贴到k行处（从下一行开始）
:n,m m k   剪切n到m行，粘贴到k行处（从下一行开始）
:n,m d     删除n到m行
</code></pre>

<p>注意的是，m必须大于n，而且m、n、k都在正文行号之内。比如说，如果文件有10行，而你的操作中出现了11，就会出现错误。m可以用特殊符号$，代表到结尾处。</p>

<p>如果要处理的文本比较多，那么可以采用标号的方法。具体如下：</p>

<ul>
<li>光标移到起始行，输入ma</li>
<li>光标移到结束行，输入mb</li>
<li>光标移到粘贴行，输入mc</li>
<li>然后 :<code>'a,'b co 'c</code>，就实现了复制粘贴。如果把co改为m，就实现了剪切粘贴。</li>
</ul>
]]></description>
         </item>
               <item>
         <title><![CDATA[掌握实用php技巧事半功倍进行PHP开发]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/php_develop_skills</link>
         <guid>https://higrid.net/blog/php_develop_skills</guid>
         <category>article</category>
         <pubDate>Tue, 07 May 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>@hi@ 中的 @php@ 系列文章主要服务于PHP使用者(能够更好的理解 <strong>PHP使用技巧</strong>，并且举一反三，触类旁通)和PHP研究者（希望深入研究PHP源码的朋友，希望能够成为PHP源码入门的引导并 <strong>掌握实用php技巧事半功倍进行PHP开发</strong>。</p>

<h2>php技巧-定义一个ROOT路径而不要总是用相对路径</h2>

<p>下面的代码很常见：</p>

<pre><code>require_once('../../lib/some_class.php');
</code></pre>

<p>这个方法在 <strong>php开发</strong> 中有诸多缺陷：</p>

<ul>
<li>它会先在PHP的include路径中查找，接着在当前目录中查找，因此会检查许多目录。</li>
<li>如果脚本由其他目录中的脚本所引用，目录的调整会引发问题。</li>
<li>当以计划任务运行脚本时，以相对路径形式可能无法找到父目录</li>
</ul>

<p>比较好的 <strong>php技巧</strong>是采用绝对路径进行 <strong>php开发</strong>：</p>

<pre><code>define('ROOT' , '/var/www/project/');
require_once(ROOT . '../../lib/some_class.php');
</code></pre>

<p>当然， 这里有绝对路径和常量。可以再来改进一下。考虑使用魔术常量，比如 <code>__FILE__</code>,看看这样如何：</p>

<pre><code>define('ROOT' , pathinfo(__FILE__, PATHINFO_DIRNAME));
require_once(ROOT . '../../lib/some_class.php');
</code></pre>

<p>好了，现在可以迁移你的项目到不同的目录了，比如迁移到在线服务器，无需做任何改动。</p>

<h2>php helper函数技巧而不使用require进行php开发</h2>

<p>很多朋友在 <strong>php开发</strong> 代码顶部会引用很多，比如类库、文件、小工具以及其他helper函数，在<strong>php开发</strong>过程中使用了很多require, include, require_once, include_once 等， 比如这样：</p>

<pre><code>require_once('lib/Database.php');
require_once('lib/Mail.php');
require_once('helpers/utitlity_functions.php');
</code></pre>

<p>这样有些原始了。代码需要有弹性。动手写个能更容易引用的helper函数吧。看这个例子：</p>

<pre><code>function load_class($class_name)
{
    //path to the class file
    $path = ROOT . '/lib/' . $class_name . '.php');

    if(file_exists($path))
    {
        require_once( $path );
    }
}
</code></pre>

<p>它可以完成以下工作：</p>

<ul>
<li>在多目录中搜索相同的类文件</li>
<li>当改变引用库目录时会非常容易，而不用到处去修改代码</li>
<li>如果需要引用html内容，稍加修改就成了load-htm</li>
</ul>

<h2>php开发技巧之建立应用程序中的调试环境</h2>

<p>php开发过程中遇到问题时，我们可能会输出DB查询、dump变量……，问题解决后我们会注释掉或者删除。其实一个很有用的php技巧是应该留着它们。</p>

<pre><code>define('ENVIRONMENT' , 'development');
if(! $db-&amp;gt;query( $query )
{
    if(ENVIRONMENT == 'development')
    {
        echo "$query failed";
    }
    else
    {
        echo "Database error. Please contact administrator";
    }
}
</code></pre>

<h2>用Session传送状态消息</h2>

<p>在完成一些任务后，系统/应用程序会进行一些消息提示</p>

<pre><code>&amp;lt;?php
if($wrong_username || $wrong_password)
{
    $msg = 'Invalid username or password';
}
?&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;?php echo $msg; ?&amp;gt;
&amp;lt;form&amp;gt;
...
&amp;lt;/form&amp;gt;
</code></pre>

<p>这些代码很常见。但这种方法存在局限性：</p>

<ul>
<li>不能传递跳转地址（打算用GET参数传递？亲，该吃药……）</li>
<li>消息过多时管理困难</li>
</ul>

<p>最好的办法是用Session传递，当然，请记得session_start。</p>

<pre><code>function set_flash($msg)
{
    $_SESSION['message'] = $msg;
}

function get_flash()
{
    $msg = $_SESSION['message'];
    unset($_SESSION['message']);
    return $msg;
}
&amp;lt;?php
if($wrong_username || $wrong_password)
{
    set_flash('Invalid username or password');
}
?&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;body&amp;gt;
Status is : &amp;lt;?php echo get_flash(); ?&amp;gt;
&amp;lt;form&amp;gt;
...
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
</code></pre>

<h2>弹性化你的函数</h2>

<pre><code>function add_to_cart($item_id , $qty)
{
    $_SESSION['cart'][$item_id] = $qty;
}
add_to_cart( 'IPHONE3' , 2 );
</code></pre>

<p>用上面的函数可以添加一个商品。如果需要添加多件，我们又要新建一个函数么？NO。 只需“弹性化”即可，看这个：</p>

<pre><code>function add_to_cart($item_id , $qty)
{
    if(!is_array($item_id))
    {
        $_SESSION['cart'][$item_id] = $qty;
    }
    else
    {
        foreach($item_id as $i_id =&amp;gt; $qty)
        {
            $_SESSION['cart'][$i_id] = $qty;
        }
    }
}
add_to_cart( 'IPHONE3' , 2 );
add_to_cart( array('IPHONE3' =&amp;gt; 2 , 'IPAD' =&amp;gt; 5) );
</code></pre>

<p>现在，一个函数可以接受多种类型，此方法在很多地方都可应用。</p>

<h2>忽略php的收尾标记</h2>

<p>当收尾标记<strong>?&gt;</strong>之后有额外的字符（比如空格），你此刻需要echo 一个image或pdf，或者玩cookies/sessions， 你会看到”headers already send” error。原因在于额外的字符被显示出来了，你可能需要浪费数小时去寻找这些“额外字符”。</p>

<p>避免此问题的方法就是，请忽略收尾标记<strong>?&gt;</strong>，好多了吧？</p>

<h2>收集所有输出， 再一次输出给浏览器</h2>

<p>这玩意是输出缓冲。比如你需要用多个函数输出内容：</p>

<pre><code>function print_header()
{
    echo "&amp;lt;div id='header'&amp;gt;Site Log and Login links&amp;lt;/div&amp;gt;";
}
function print_footer()
{
    echo "&amp;lt;div id='footer'&amp;gt;Site was made by me&amp;lt;/div&amp;gt;";
}
print_header();
for($i = 0 ; $i &amp;lt; 100; $i++)
{
    echo "I is : $i &amp;lt;br /&amp;gt;';
}
print_footer();
</code></pre>

<p>考虑这么做：首先收集所有输出到一个地方。可以存在变量里，也可以用ob_start/ob_end_clean. 改改看：</p>

<pre><code>function print_header()
{
    $o = "&amp;lt;div id='header'&amp;gt;Site Log and Login links&amp;lt;/div&amp;gt;";
    return $o;
}
function print_footer()
{
    $o = "&amp;lt;div id='footer'&amp;gt;Site was made by me&amp;lt;/div&amp;gt;";
    return $o;
}
echo print_header();
for($i = 0 ; $i &amp;lt; 100; $i++)
{
    echo "I is : $i &amp;lt;br /&amp;gt;';
}
echo print_footer();
</code></pre>

<p>为何需要输出缓冲？</p>

<ul>
<li>发送给浏览器之前可以改动输出。 比如文本/正则替换，或者加一些额外的html代码，比如 profiler/debugger</li>
<li>同时进行php处理与输出是个坏习惯。</li>
</ul>

<h2>输出非html内容时，通过header发送正确的mime类型</h2>

<p>xml：</p>

<pre><code>header("content-type: text/xml");
echo $xml;
</code></pre>

<p>Javascript:</p>

<pre><code>header("content-type: application/x-javascript");
echo "var a = 10";
</code></pre>

<p>CSS:</p>

<pre><code>header("content-type: text/css");
echo "#div id { background:#000; }";
</code></pre>

<h2>mysql连接时设置正确的字符编码</h2>

<p>如果mysql表以unicode/utf-8正确存储，phpmyadmin中也可正确显示，但读取数据显示在页面时乱码出现，问题则出在mysql连接整理上：</p>

<pre><code>$c = mysqli_connect($host , $username, $password);
mysqli_set_charset ( $c , 'UTF8' );
</code></pre>

<p>当连接到数据库时，设置整理字符集是一个好习惯，在开发多语言的项目中尤为重要。</p>

<h2>使用htmlentitis设置正确的字符集选项</h2>

<p>PHP 5.4之前的默认字符编码是ISO-8859-1，无法显示诸如À â等字符。</p>

<pre><code>$value = htmlentities($this-&amp;gt;value , ENT_QUOTES , 'UTF-8');
</code></pre>

<p>PHP 5.4起，默认编码是UTF-8，这将解决大部分问题。如果你的应用程序为多语种，请注意这里</p>

<h2>不要使用gzip输出，让apache去做这个</h2>

<p>考虑用ob_gzhandler? 别这么做，这样没什么意义。不要担心在php上如何优化服务器和浏览器之间的数据传输。在Apache中启用mod_gzip或者mod_deflate来压缩吧。</p>

<h2>使用json_encode 在PHP中打印javascript代码</h2>

<p>有时需要在PHP中动态生成一些javascript代码：</p>

<pre><code>foreach($images as $image)
{
    $js_code .= "'$image' ,";
}
$js_code = 'var images = [' . $js_code . ']; ';
echo $js_code;
//Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,];
</code></pre>

<p>试试json_encode吧：</p>

<pre><code>$images = array(
'myself.png' , 'friends.png' , 'colleagues.png'
);
$js_code = 'var images = ' . json_encode($images);
echo $js_code;
//Output is : var images = ["myself.png","friends.png","colleagues.png"]
</code></pre>

<h2>在写文件之前请先检查目录是否可写入</h2>

<p>写入任何文件之前，请确认该文件所在目录是否可写，如不可写，提示错误信息。这会帮你节省无数“调试”时间。当你在linux下干活时，目录不能被写入、不能读取文件时要首先考虑目录权限问题。</p>

<p>确保你的程序在最短时间内，可以尽量智能化地报告出最重要的错误信息。</p>

<pre><code>$contents = "All the content";
$file_path = "/var/www/project/content.txt";
file_put_contents($file_path , $contents);
</code></pre>

<p>代码没问题， 但可能会有些间接问题产生。File_put_contents失败的可能原因如下：</p>

<ul>
<li>父目录不存在</li>
<li>目录存在，但不可写</li>
<li>文件被锁定</li>
</ul>

<p>因此，最好在写入文件之前先进行检测。</p>

<pre><code>$contents = "All the content";
$dir = '/var/www/project';
$file_path = $dir . "/content.txt";
if(is_writable($dir))
{
    file_put_contents($file_path , $contents);
}
else
{
    die("Directory $dir is not writable, or does not exist. Please check");
}
</code></pre>

<p>这样做的话，当文件写入失败时你会知道准确的信息。</p>

<h2>更改您的应用程序创建的文件权限</h2>

<p>当你在linux环境下工作时，权限处理会浪费很多时间。因此，当你的应用程序创建文件后，进行chmod以确保外部可以访问。否则会带来很多麻烦。例如，生成的文件由“PHP”用户所创建，而您开发时是另一个用户，系统会禁止您访问或打开文件，之后你可能需要取得root权限再变更文件权限……</p>

<pre><code>// Read and write for owner, read for everybody else
chmod("/somedir/somefile", 0644);
// Everything for owner, read and execute for others
chmod("/somedir/somefile", 0755);
</code></pre>

<h2>不要通过检查提交按钮的值来判断表单提交</h2>

<pre><code>if($_POST['submit'] == 'Save')
{
    //Save the things
}
</code></pre>

<p>上面的代码看起来的确没什么错。但，当你的程序是多语言时，就不一定叫Save了，这时怎么判断？所以，不要依赖提交按钮的值了，这么做吧：</p>

<pre><code>if( $_SERVER['REQUEST_METHOD'] == 'POST' and isset($_POST['submit']) )
{
    //Save the things
}
</code></pre>

<h2>考虑在函数中使用静态变量</h2>

<pre><code>//Delay for some time
function delay()
{
    $sync_delay = get_option('sync_delay');
    echo "&amp;lt;br /&amp;gt;Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done &amp;lt;br /&amp;gt;";
}
</code></pre>

<p>使用静态变量之后：</p>

<pre><code>//Delay for some time
function delay()
{
    static $sync_delay = null;
    if($sync_delay == null)
    {
        $sync_delay = get_option('sync_delay');
    }
    echo "&amp;lt;br /&amp;gt;Delaying for $sync_delay seconds...";
    sleep($sync_delay);
    echo "Done &amp;lt;br /&amp;gt;";
}
</code></pre>

<h2>不要直接使用$_SESSION变量</h2>

<pre><code>$_SESSION['username'] = $username;
$username = $_SESSION['username'];
</code></pre>

<p>熟悉吧？但这么做有问题。</p>

<p>如果在相同域下运行多个程序，session变量可能会冲突， 2个不同的应用程序可能设置了相同key的session变量。</p>

<p>因此，用wrapper函数指定一下key吧：</p>

<pre><code>define('APP_ID' , 'cichui.com');
//Function to get a session variable
function session_get($key)
{
    $k = APP_ID . '.' . $key;
    if(isset($_SESSION[$k]))
    {
        return $_SESSION[$k];
    }
    return false;
}
//Function set the session variable
function session_set($key , $value)
{
    $k = APP_ID . '.' . $key;
    $_SESSION[$k] = $value;
    return true;
}
</code></pre>

<h2>18. 将辅助函数(utility helper functions)封装成一个类</h2>

<p>你可能有很多像这样的辅助函数：</p>

<pre><code>function utility_a()
{
//This function does a utility thing like string processing
}
function utility_b()
{
//This function does nother utility thing like database processing
}
function utility_c()
{
//This function is ...
}
</code></pre>

<p>你可以考虑把他们封装成类的静态方法：</p>

<pre><code>class Utility
{
    public static function utility_a()
    {
    }
    public static function utility_b()
    {
    }
    public static function utility_c()
    {
    }
}
//and call them as
$a = Utility::utility_a();
$b = Utility::utility_b();
</code></pre>

<p>这有一个明显的好处是，不会和PHP自带函数命名冲突。另一个角度看，你可以在同一个应用程序内建立多个版本，不会有任何冲突。只是最基本的封装， 没别的。</p>

<h2>一些愚蠢的小技巧</h2>

<ul>
<li>用echo代替print</li>
<li>除非绝对必要，请用str_replace代替preg_replace</li>
<li>不要使用短标记(&lt;?=)[瓷锤注：PHP 5.4已经默认开启短标记了^_^]</li>
<li>简单字符串使用单引号</li>
<li>永远记得在header跳转后exit</li>
<li>永远不要在for循环控制行里调用函数</li>
<li>isset比strlen快</li>
<li>在循环或if-else代码块中请坚持使用大括号{} （即使一行）。不要尝试通过“吃掉语法”而让你的代码变短，请让你的逻辑更短一些。</li>
<li>使用语法高亮的编辑器，代码高亮有助于帮你减少错误</li>
</ul>

<h2>使用array_map快速处理数组</h2>

<p>想清理(trim)一个数组中的所有元素？新手一般会这样：</p>

<pre><code>foreach($arr as $c =&amp;gt; $v)
{
    $arr[$c] = trim($v);
}
</code></pre>

<p>更清爽的做法是：</p>

<pre><code>$arr = array_map('trim' , $arr);
</code></pre>

<p>此函数会将trim应用于所有$arr数组中的元素。另一个类似的函数是array_walk，具体请参见PHP帮助文档。</p>

<h2>使用PHP filters扩展验证数据</h2>

<p>你用正则做过数据校验吧？比如email, ip地址等等……是得，每个人都做过这些。 现在试试这个——PHP的<a href="http://cn.php.net/filter">filters</a>扩展。</p>

<pre><code>if (filter_var($email_a, FILTER_VALIDATE_EMAIL)) {
//…
}
if (filter_var($ip_a, FILTER_VALIDATE_IP)) {
//…
}
</code></pre>

<p>除此以外，还有：FILTER_VALIDATE_URL，FILTER_VALIDATE_REGEXP………</p>

<h2>强制类型转换</h2>

<pre><code>$amount = intval( $_GET['amount'] );
$rate = (int) $_GET['rate'];
</code></pre>

<p>强类型转换是个好习惯。</p>

<h2>使用set_error_handler() 将PHP错误日志写入文件</h2>

<p>set_error_handler()可以用来设置自定义错误。用它把错误日志写入日志文件也是个不错的主意。</p>

<h2>小心处理大数组</h2>

<p>如果一个变量存有大型数组或者字符串，请小心处理。通常的错误是创建副本然后内存耗尽，得到一个内存超出的致命错误。</p>

<pre><code>$db_records_in_array_format; //1000行＊20列，每行至少100 字节 , so total 1000 * 20 * 100 = 2MB
$cc = $db_records_in_array_format; //用掉2MB
some_function($cc); //擦，还要再用2MB ?
</code></pre>

<p>上面的代码是普通的CSV文件导入（或导出）。这么干脚本可能会超出内存限值。小规模的当然没有问题，大数组时还是要提防的。</p>

<p>考虑引用传参(by reference)吧， 或者存储到类变量里。</p>

<pre><code>$a = get_large_array();
pass_to_function(&amp;amp;$a);
class A
{
    function first()
    {
        $this-&amp;gt;a = get_large_array();
        $this-&amp;gt;pass_to_function();
    }
    function pass_to_function()
    {
    //process $this-&amp;gt;a
    }
}
</code></pre>

<p>大数组变量用毕记得尽快注销掉(unset)。</p>

<h2>整个脚本中使用一个数据库连接</h2>

<p>连接数据库时，请确保您使用一个连接。开始打开连接并开始使用，直到结束，并在结束时关闭连接。</p>

<p>请不要这么做：</p>

<pre><code>function add_to_cart()
{
    $db = new Database();
    $db-&amp;gt;query("INSERT INTO cart .....");
}
function empty_cart()
{
    $db = new Database();
    $db-&amp;gt;query("DELETE FROM cart .....");
}
</code></pre>

<p>多次数据库连接很糟糕，由于每次连接都需要消耗时间和更多内存，它们会让执行时间变得更慢。 可以考虑使用单件模式(Singleton pattern)进行数据库连接。</p>
]]></description>
         </item>
               <item>
         <title><![CDATA[php性能优化的几个方法]]></title>
         <author>higrid@qq.com</author>
         <link>https://higrid.net/blog/website_performance_for_php</link>
         <guid>https://higrid.net/blog/website_performance_for_php</guid>
         <category>article</category>
         <pubDate>Sun, 05 May 2013 00:00:00 +0800</pubDate>
         <description><![CDATA[<p>网上有无数关于 @php@ 性能的优化技巧，有必要列出一张可供参考使用的清单。@hi@ 收集的这些技巧来源较广，完整性不能保证。 由于数量较多，这些优化技巧没有经过测试。请各位看官在使用之前自行测试，毕竟这些技巧是否能派上用场，还是需要由PHP所在的独特环境所决定的。</p>

<h2>找到瓶颈（Finding the Bottleneck）</h2>

<p>面对一个性能问题是，第一步永远是找到问题产生的原因，而不是去看技巧列表。搞明白产生瓶颈的原因，找到目标并且实施修复，然后再重新测试。查找瓶颈只是万里长征的第一步，这里有些常用技巧，希望对最重要的第一步找到瓶颈能有所帮助。</p>

<ul>
<li>使用监控方法（比如监控宝），进行benchmark和监控，网络，特别是网络状况瞬息万变，做得好的话5分钟就可以找到瓶颈。</li>
<li>剖析代码。必须了解那部分代码耗时最多，在这些地方多多关注。</li>
<li>想找到瓶颈，请检查每个资源请求（比如，网络、CPU、内存、共享内存、文件系统、进程管理、网络连接等等……）</li>
<li>先对迭代结构和复杂的代码进行benchmark</li>
<li>在在真实负载下用真实数据进行真实测试，当然，如果可以最好用产品服务器。</li>
</ul>

<h2>缓存 （Caching）</h2>

<p>有些人认为缓存是解决性能问题最有效的办法之一，试试这些：</p>

<ul>
<li>使用OPCODE（操作码）缓存，这样脚本就不会在每次访问时重新编译一次。比如：启用Windows平台上的windows缓存扩展。可以缓存opcode，文件，相对路径，session数据和用户数据。</li>
<li>考虑在多服务器环境下使用分布式缓存</li>
<li>在调用imap_header()之前先调用imap_headers()</li>
</ul>

<h2>编译 vs. 解释（Compiling vs. Interpreting）</h2>

<p>将PHP源码编译成机器码。动态解释执行同样的编译，但它是按行执行的。编译为opcode是折中选择，它可以将PHP源码翻译为opcode，之后opcode再转为机器码。以下为关于编译与解释的相关技巧：</p>

<ul>
<li>上线之前将PHP代码编译为机器码。opcode缓存尽管并不是最好的选择，但依旧比解释型来得强。或者，考虑将PHP代码编译成一个C扩展。</li>
<li>PHP的opcode编译器（bcompiler)还不能在产品环境中使用，但是开发者应该关注<a href="http://php.net/manual/en/book.bcompiler.php">http://php.net/manual/en/book.bcompiler.php</a>.</li>
</ul>

<h2>代码减肥 （Content Reduction）</h2>

<p>越少越块。 这些技巧可以帮助减少代码：</p>

<ul>
<li>每页提供更少的功能</li>
<li>清理网页内容</li>
<li>如果解释型执行，请清理注释和其他空白</li>
<li>减少数据库查询</li>
</ul>

<h2>多线程与多进程（Multithreading &amp; Multiprocessing）</h2>

<p>由快到慢依次为：</p>

<ol>
<li>多线程（单一进程中）</li>
<li>多进程（比如，pcntl_fork，计划任务）</li>
<li>单进程（一行又一行）</li>
</ol>

<p>PHP不支持多线程，但是可以用C写多线程的PHP扩展。有一些办法可以使用多进程或模拟多进程，但支持的并不是很好，没准儿比单进程还慢。</p>

<h2>字符串（Strings）</h2>

<p>字符串处理，是大多数编程语言中最常用的操作之一。这里有些技巧可以帮我们让字符串处理速度更快一些：</p>

<ul>
<li>PHP的连接运算（点运算），是最快的链接方式</li>
<li>避免在print中链接字符串，用逗号分割后用ECHO</li>
<li>尽可能使用str_前缀的字符串函数替代正则表达式</li>
<li>pos()比preg_mach()和ereg()都快</li>
<li>有人说单引号包裹字符串比双引号更快，有人说没有区别。当然，如果想在字符串中引用变量，单引号没戏。</li>
<li>如果想判断字符串长度是否小于某值（比如5）,请使用isset($s[4])&lt;5。</li>
<li>如需将多个小字符串连接成一个大字符串，试着先开启ob_start输出缓存，再用echo输出到缓冲区，完成后使用ob_get_contents读取字符串</li>
</ul>

<h2>正则表达式（Regular Expressions）</h2>

<p>正则表达式为们带来了灵活多样的比较与查找字符串的方法，单他的性能开销却着实不低</p>

<ul>
<li>尽可能使用STR_前缀的字符串处理函数代替正则表达式</li>
<li>使用[aeiou]的不是(a|e|i|o|u)</li>
<li>正则表达式越简单速度越快</li>
<li>尽可能不要设置PCRE_DOTALL修饰符</li>
<li>用 <code>^.*</code> 代替 <code>.*</code></li>
<li>简化正则表达式。（比如使用<code>a*</code> 代替 <code>(a+)*</code></li>
</ul>

<h2>迭代结构 （Iteration Constructs (for, while)）</h2>

<p>迭代（重复，循环）是最基本的结构化编程方法，很难想像有不使用它的程序。这里有些技巧，帮助我们改进迭代结构的性能：</p>

<ul>
<li>尽可能讲代码移出到循环外（函数调用、SQL查询等等……）</li>
<li>使用i=maxval;while(i&#8211;)代替for(i=0;i&lt;maxval;i++），这样可以减少一个操作，如果maxval是一个函数调用就更明显了。</li>
<li>使用foreach迭代集合与数组</li>
</ul>

<h2>选择结构 （Selection Constructs (if, switch)）</h2>

<p>与迭代结构相同，选择结构也是最基本的结构化变成方法。以下技巧或许能改善性能：</p>

<ul>
<li>switches和else-if中，应该将最近常出现true的列在前面，较少出现true的请靠后</li>
<li>有人说if-else比swtich/case快，当然，有人反对。</li>
<li>用elseif替代else if.</li>
</ul>

<h2>函数与参数 （Functions &amp; Parameters）</h2>

<p>将函数的代码分解成小函数代码可以消除冗余，让代码具有可读性，但代价是什么？这里有些技巧，以帮助更好的使用函数：</p>

<ul>
<li>引用传递出对象和数组，而不是传值</li>
<li>如果只在一个地方使用，使用内联。如果在多个地方调用，考虑内联，但请注意可维护性</li>
<li>了解你所用函数的复杂度。比如similar_text()为O(N^3)，这意味着字符串长度增加一倍，处理时间将增加8倍</li>
<li>不要通过“返回引用”来提升性能，引擎会自动优化它。</li>
<li>以常规方式调用函数，而不是使用call_user_func_array()或eval()</li>
</ul>

<h2>面向对象结构 （Object-Oriented Constructs）</h2>

<p>PHP的面向对象特性，可能会影响到性能。以下提示可以帮助我们尽量减少这种影响：</p>

<ul>
<li>不是一切都需要面向对象， 性能的损失可能会超过其优点本身</li>
<li>创建对象比较慢</li>
<li>如果可以，尽可能时候用数组而不是对象</li>
<li>如果一个方法可以静态化，请静态声明</li>
<li>函数调用比派生类方法调用要快，派生类方法调用比基类调用要快</li>
<li>考虑将基类中最常用的代码复制到派生类中，但要注意维护性隐患</li>
<li>避免使用原生的getters与setters。如果不需要他们，请删除并且属性公开</li>
<li>创建复杂的PHP类时，考虑使用单件模式</li>
</ul>

<h2>Session处理 （Session Handling）</h2>

<p>创建sessions有很多好处，但有时会产生没必要的性能开支。以下技巧可以帮助我们最大限度减少性能开支：</p>

<ul>
<li>不要使用auto_start</li>
<li>不要启用use_trans_sid</li>
<li>将session_cache_limited设置为private_no_expire</li>
<li>为虚拟主机(vhost)中的每个用户分配自己的目录</li>
<li>使用基于内存的session处理，而不是基于文件的session处理</li>
</ul>

<h2>类型转换 （Type Casting）</h2>

<p>从一种类型转换为另一种类型需要成本</p>

<h2>压缩（Compression）</h2>

<p>在传输前，压缩文本和数据：</p>

<ul>
<li>使用ob_start()在代码起始处</li>
<li>使用ob_gzhandler()可以下载提速，但是注意CPU开支</li>
<li>Apache的mod_gzip模块可以即使压缩</li>
</ul>

<h2>错误处理（Error Handling）</h2>

<p>错误处理影响性能。我们能做的是：</p>

<ul>
<li>记录错误日志，别再使用“@”抑制错误报告，抑制对性能一样有影响</li>
<li>不要只检查错误日志，警告日志一样需要处理</li>
</ul>

<h2>声明、定义与范围（Declarations, Definitions, &amp; Scope）</h2>

<p>创建一个变量、数组或者对象，对性能都有影响：</p>

<ul>
<li>有人说，声明和使用全局变量/对象，比局部变量/对象要快，有人反对。请测试再决定。</li>
<li>在使用变量前声明所有变量，不要声明不使用的变量</li>
<li>在循环中尽可能使用$a[]，避免使用$a=array(&#8230;)</li>
</ul>

<h2>内存泄漏（Memory Leaks）</h2>

<p>如果内存分配后不释放，这绝对是个问题：</p>

<ul>
<li>坚持释放资源，不要指望自带/自动的垃圾回收</li>
<li>使用完后尽量注销(unset)变量，尤其是资源类和大数组类型的</li>
<li>使用完毕就关闭数据库连接</li>
<li>每次使用ob_start()，记得ob_end_flush()或者ob_end_clean()</li>
</ul>

<h2>不要重复发明轮子（Don’t Reinvent the Wheel）</h2>

<p>为什么要花费时间去解决别人已经解决的问题？</p>

<ul>
<li>了解PHP，了解它的功能和扩展。如果你不知道，可能会无法利用一些现成的功能</li>
<li>使用自带的数组和字符串函数，它们绝对是性能最好的。</li>
<li>前人发明的轮子，并不意味着在你的环境下吸能是最好的，多多测试</li>
</ul>

<h2>代码优化（Code Optimization）</h2>

<ul>
<li>使用一个opcode optimizer</li>
<li>如果将被解释运行，请精简源码</li>
</ul>

<h2>使用RAM（Using RAM Instead of DASD）</h2>

<p>RAM比磁盘快很多很多，使用RAM可以提升一些性能：</p>

<ul>
<li>移动文件到Ramdisk</li>
<li>使用基于内存的session处理，而不是基于文件的session处理</li>
</ul>

<h2>使用服务（Using Services (e.g., SQL)）</h2>

<p>SQL经常被用来访问关系型数据库，但我们的PHP代码可以访问许多不同的服务。下面是一些访问服务是需要牢记的：</p>

<ul>
<li>不要一遍又一遍地问服务器向东的事情。使用memoization缓存第一次的结果，以后访问直奔缓存；</li>
<li>在SQL中，使用mysql_fetch_assoc()代替mysql_fetch_array()，可以减少结果集中的整数索引。以字段名访问结果集，而不用索引数字。</li>
<li>对于Oracle数据库，如果没有足够的可用内存，增加oci8.default_prefetch。将oci8.statement_cache_size设置为应用中的语句数</li>
<li>请使用mysqli_fetch_array()替换mysqli_fetch_all()， 除非结果集将发送到其他层进行处理。</li>
</ul>

<h2>安装与配置（Installation &amp; Configuration）</h2>

<p>安装与配置PHP时，请考虑性能：</p>

<ul>
<li>添加更多内存</li>
<li>删除竞争性的应用与服务</li>
<li>只编译所需要用的扩展</li>
<li>将PHP静态编译进APACHE</li>
<li>使用-O3 CFLAGS开启所有编译器优化</li>
<li>只安装所需使用的模块</li>
<li>升级到最新版本的次要版本。主板本升级，等到第一次bug修复后再进行，当然，也别等太久</li>
<li>为多CPU环境进行配置</li>
<li>使用 -enable-inline-optimization</li>
<li>设置session.save_handler=mm ，以 -with-mmto编译，使用共享内存</li>
<li>使用RAM disk</li>
<li>关闭resister_global和magic_quotes_*</li>
<li>关闭expose_php</li>
<li>关闭 always_populate_raw_post_data 除非你必须使用它</li>
<li>非命令行模式下请关闭register_argc_argv</li>
<li>只在.php文件中使用PHP</li>
<li>优化max_execution_time, max_input_time, memory_limit与output_buffering的参数</li>
<li>将Apache配置文件中allowoverride设置为none提升文件/目录的访问速度</li>
<li>使用-march, -mcpu, -msse, -mmmx, and -mfpmath=sseto使CPU最优化</li>
<li>使用MySQL原生驱动（mysqlnd)替换libmysql、mysqli扩展以及PDO MYSQL驱动</li>
<li>关闭 register_globals、register_long_arrays以及register_argc_argv. 开启auto_globals_jit.</li>
</ul>

<h2>其他（Other）</h2>

<p>还有些技巧比较难归类：</p>

<ul>
<li>使用include()、require()，避免使用include_once()和require_once()</li>
<li>在include()/require()中使用绝对路径</li>
<li>静态HTML被PHP生成的HTML要快</li>
<li>使用ctype_alnum、ctype_alpha以及ctype_digit代替正则表达式</li>
<li>使用简单的servlets或CGI</li>
<li>代码在产品环境中使用时，尽可能写日志</li>
<li>使用输出缓冲</li>
<li>请使用isset($a)代替比较$a==null；请使用$a===null代替is_nul($a)</li>
<li>需要脚本开始执行时间，请直接读取$_SERVER[’REQUEST_TIME’]，而不是使用time()</li>
<li>使用echo替代print</li>
<li>使用前自增(++i)代替后自增(i++)，大多数编译器现在都会优化，但是他们不优化时，请保持这样的写法。</li>
<li>处理XML，使用正则表达式代替DOM或者SAX</li>
<li>HASH算法：md4, md5, crc32, crc32b, sha1比其他的散列速度都要快</li>
<li>使用spl_autoload_extensions时，文件扩展名请按最常用&#8211;&gt;最不常用的顺序，尽量排除掉压根不用的。</li>
<li>使用fsockopen或fopen时，使用IP地址代替域名；如果只有一个域名，使用gethostbyname()可以获取IP地址。使用cURL速度会更快。</li>
<li>但凡可能，用静态内容代替动态内容。</li>
</ul>
]]></description>
         </item>
      
   </channel>
</rss>