多数大学生出来选择的工作和专业无关
首页 > 专业知识

10位顶级PHP大师的开发原则(1)

时间:2018-02-10 16:23:46 [来源]:郑州PHP培训学校

   10位顶级PHP大师的开发原则(1)

  在我们的一款WebGame的生产环境中,一次无意的strace抓包时,发现了php与mysql大量通讯的数据。这种情况,在游戏服务器刚启动时,是正常的,但如果是运行一段时间之后,出现大量SELECT的SQL查询,绝对是有问题的,而且,所操作的数据库并不是配置库,那意味着,我们程序员的程序出现了违规的操作。
  跟着这里的SELECT的sql语句,我定位到了相应的程序段:
  /*
  **  业务逻辑的代码
  */
  public function SItem($roleId,$baseId) {
  //...
  // ############写出下面这种代码的人都得死.##################$this->dbrRole->select('*');
  $this->dbrRole->from('role_items');
  $this->dbrRole->where('role_id',$roleId);$this->dbrRole->where('baseId',$baseId);
  $result = $this->dbrRole->get()->row(); //看上去,这里好像正常,我们都以为框架会给我们只取一条。
  //...
  }
  我们从代码上来看,好像明白程序员想根据对应的role_id到role_items表里取一条想符合的数据,所以,他调用了row方法,来取一条。看上去,这里好像正常,我们都以为框架会给我们只取一条。但实际上,框架是如何处理的呢?
  我们来看下框架的对应row方法的实现过程。对了,我们是CodeIgniter框架的一个较老的版本。
  /*
  **  框架中,DB drive中,row相关方法的代码**
  */
  public function row($n = 0,$type = 'array'){if(!is_numeric($n)){
  if(! is_array($this->_rowData)){
  $this->_rowData = $this->rowArray(0);
  }
  if(isset($this->_rowData[$n])){
  return $this->_rowData[$n];
  }
  $n = 0;
  }
  return ($type == 'object') ? $this->rowObject($n) : $this->rowArray($n);}
  //继续跟进rowArray方法
  public function rowArray($n = 0){
  $result = $this->resultArray();
  if(count($result) == 0){
  return $result;
  }
  if($n != $this->_current && isset($result[$n])){$this->_current = $n;
  }
  return $result[$this->_current];
  }
  }
  我们可以看到CodeIgniter框架的resultArray方法使用mysql(我们的php调用mysql的api用的是mysql函数,有点绕,后面解释)的mysql_fetch_assoc函数对缓冲区的数据进行遍历转换。将所有缓冲区的数据全部复制给$this->resultArray属性,再判断row方法中所需要的key的结果是否存在,再与返回的。
  也就是说,框架层并没有只从mysql server(潜意识上的mysql server)那边取一条给我们调用者,而是取了所有结果,再返回一条。(先别喷,后面解释) 当然,CI这种做法,也不是错。但我觉得有更好的改进方法。
  这个问题,我们组的dietoad (征婚) 发现了这个问题,并给了修复方案。有些同学认为,这是程序员的错,程序员的SELECT语句没有加limit来限制条数。这我绝对赞同,而且,觉得写出这种代码的人都得死。
  业务层:为这种业务需求的SQL语句加上limit限制框架层:框架对于这种需求,自动控制,发现这种情况,直接返回1条对于解决方案1,我写了一个正则,匹配select()方法被调用之后,row()方法被调用之前,中间没有使用limit()方法的所有代码,结果,发现量并不小。后来,我们决定两种方案同时实施,防止第二种出现漏掉的情况。
  10位顶级PHP大师的开发原则
  在WEB开发世界里,PHP是最流行的语言之一,从PHP里,你能够很容易的找到你所需的脚本,遗憾的是,很少人会去用“最佳做法”去写一个PHP程序。
  在WEB开发世界里,PHP是最流行的语言之一,从PHP里,你能够很容易的找到你所需的脚本,遗憾的是,很少人会去用“最佳做法”去写一个PHP程序。这里,我们向大家介绍PHP的10种最佳实践,当然,每一种都是经过大师们证明而得出的。
  1. 在合适的时候使用PHP – Rasmus Lerdorf
  没有谁比PHP的创建者Rasmus Lerdorf明白PHP用在什么地方是更合理的,他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变了互联网的世界。可是,Rasmus并不是因此而创建PHP的。PHP是为了解决WEB开发者的实际问题而诞生的。
  2. 使用多表存储提高规模伸缩性 – Matt Mullenweg没有人愿意质疑Matt Mullenweg在PHP方面的权威性,他开发了这个星球上最流行的blog系统,(依靠一个强大的社区力量支持): WordPress. 创建Wordpress以后,Matt和他的团队启动了WordPress.com平台,一个基于WordPress MU的免费blog站点。现在,Wordpress.com已经拥有大约400万用户, 这些用户每天提供超过 140,000篇的日志。 (要查看更多Wordpress.com的统计情况,请点击这里.)3. 千万不要相信用户 – Dave Child
  Dave Child是Added Bytes (previously ilovejackdaniels.com) 网站的核心人物,这个网站以他出色的《cheat sheets for many programming languages》而闻名。 Dave为很多英国的公司服务,并且已经在编程世界里树立起相当的权威。
  Dave为PHP开发者提供了很多深谋远虑的建议,并总结成了《writing secure code in PHP》:千万不要相信你的用户,他们甚至可能会伤害你。
  4. 多使用PHP缓存 – Ben Balbo
  Ben Balbo开发了Site Point,一个为developers和designers提供指导的网站。他是墨尔本PHP开发和开源俱乐部的成员, 因此他对PHP有一定的了解,同时对PHP caching有一定的想法和经验。
  如果你拥有一个访问量很大,但更新并不频繁的站点(比如blog,基于某种CMS),或许它需要进行一些改造,这些改造不会花费太多的时间,但是对性能有突出的贡献。 如果要为一个复杂/更新频率很快的站点建立缓存机制,过程可能会很曲折,但是好处也是显而易见的。
  5. 使用IDE, Templates和Snippets加速PHP开发 – Chad Kieffer当Chad Kieffer从UI设计和数据库优化的工作中抽身出来的时候,他会在他的博客2 tablespoons上分享很多技术经验。由于Chad多方面的全面发展,他经常可以发现其他程序员不能发现的问题,并形成相关经验,尤其是他开发网站的方法。他参与了网站开发的各个环节,因此他的建议对于提高网站开发的大局观非常有用。
  6. 利用好PHP的过滤函数 – Joey Sochacki
  或许Joey Sochacki并不像Matt Mullenweg那样有名 ,但他也是一个经验丰富的开发者,并且通过他的博客Devolio分享了很多技术经验7. 使用PHP框架 – Josh Sharp
  对于是否应该使用Zend, CakePHP, Code Igniter, 或者 其他PHP框架,一直存在着很多争议,但是在web开发者的心中,他们有自己衡量的标准。
  8. 不要使用PHP框架 – Rasmus Lerdorf
  与Josh的观点恰恰相反,PHP的鼻祖Rasmus Lerdorf却认为最好不要使用PHP框架,为什么?因为不基于框架的PHP性能更好。Rasmus在Drupalcon 2008的演讲上,用“Hello World”的例子来对比了一些框架PHP和简单PHP之间的性能,结果显示框架PHP的性能要远远落后。
  9. 使用批处理 – Jack D. Herrington
  Jack Herrington对PHP世界并不陌生, 并且为大名鼎鼎的IBM developerWorks贡献过超过30篇的专搞, 同时出版过《PHP Hacks》的书,因此他是一个真正的专家。
  Herrington推荐使用批处理和Cron来代替那些可以运行在后台的程序脚步,Web用户并不愿意在线等待你的处理过程,所以有些事情更适合放到后台来处理。
  10. 及时启用错误报告 – David Cummings
  David Cummings有一个专门提供CMS软件服务的公司 ,并且获得过几次奖 ,他有非常丰富的PHP开发经验。David曾经写过《two PHP tips he wished he’d learned in the beginning》,其中一点就是:及时启用错误报告,这会节省大量的时间。
  20 你应该知道的PHP库
  下面是一些非常有用的PHP类库,相信一定可以为你的WEB开发提供更好和更为快速的方法。
  下面是一些非常有用的PHP类库,相信一定可以为你的WEB开发提供更好和更为快速的方法。
  图表库
  021151lephpant-e_png
  下面的类库可以让你很简的创建复杂的图表和图片。当然,它们需要GD库的支持。
  pChart – 一个可以创建统计图的库。
  Libchart – 这也是一个简单的统计图库。
  JpGraph – 一个面向对象的图片创建类。
  Open Flash Chart – 这是一个基于Flash的统计图。
  RSS 解析
  解释RSS并是一件很单调的事情,不过幸好你有下面的类库可以帮助你方便地读取RSS的Feed。
  MagpieRSS – 开源的PHP版RSS解析器,据说功能强大,未验证。
  SimplePie – 这是一个非常快速,而且易用的RSS和Atom 解析库。
  缩略图生成
  phpThumb – 功能很强大,如何强大还是自己去体会吧。
  支付
  你的网站需要处理支付方面的事情?需要一个和支付网关的程序?下面这个程序可以帮到你。
  PHP Payment Library – 支持Paypal, Authorize.net 和2Checkout (2CO)OpenID
  PHP-OpenID – 支持OpenID的一个PHP库。OpenID是帮助你使用相同的用户名和口令登录不同的网站的一种解决方案。如果你对OpenID不熟悉的话,你可以到这里看看:http://openid.net.cn/数据为抽象/对象关系映射ORM
  ADOdb – 数据库抽象
  Doctrine – 对象关系映射Object relational mapper (ORM) ,需要 PHP 5.2.3+ 版本,一个非常强大的database abstraction layer (DBAL).
  Propel – 对象关系映射框架- PHP5
  Outlet – 也是关于对象关系映射的一个工具。
  注:对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。 这也同时暗示者额外的执行开销;然而,如果ORM作为一种中间件实现,则会有很多机会做优化,而这些在手写的持久层并不存在。 更重要的是用于控制转换的元数据需要提供和管理;但是同样,这些花费要比维护手写的方案要少;而且就算是遵守ODMG规范的对象数据库依然需要类级别的元数据。
  PDF 生成器
  FPDF – 这量一个可以让你生成PDF的纯PHP类库。
  Excel 相关
  你的站点需要生成Excel?没有问题,下面这两个类库可以让你轻松做到这一点。
  php-excel – 这是一个非常简单的Excel文件生成类。
  PHP Excel Reader – 可以解析并读取XLS文件中的数据。
  E-Mail 相关
  不喜欢PHP的mail函数?觉得不够强大?下面的PHP邮件相关的库绝对不会让你失望。
  Swift Mailer – 免费的超多功能的PHP邮件库。
  PHPMailer - 超强大的邮件发送类。
  单元测试
  如果你在使用测试驱动的方法开发你的程序,下面的类库和框架绝你能帮助你的开发。
  SimpleTest – 一个PHP的单元测试和网页测试的框架。
  PHPUnit – 来自xUnit 家族,提供一个框架可以让你方便地进行单元测试的案例开发。并可非常容易地分析其测试结果。
 

上一篇:PHP比你想象的好得多的方面有哪些

下一篇:PHP初学者头疼问题总结