虽然名字叫《PHP最佳实践》,但是它主要谈的不是编程规则,而是PHP应用程序的合理架构。

在WEB开发世界里,PHP是最流行的语言之一,从PHP里,你能够很容易的找到你所需的脚本,遗憾的是,很少人会去用“最佳做法”去写一个PHP程序。这里我们向大家介绍PHP的5种最佳实践,当然,每一种都是经过大师们证明而得出的。

它提供了一种逻辑和数据分离的架构模式,属于MVC模式的一种实践。我觉得,这是很有参考价值的学习资料,类似的文章网上并不多,所以一边学习,一边就把它翻译了出来。

1.在合适的时候使用PHP–RasmusLerdorf

根据自己的理解,我总结了它的MVC模式的实现方式(详细解释见译文):

没有谁比PHP的创建者RasmusLerdorf明白PHP用在什么地方是更合理的,他于1995年发布了PHP这门语言,从那时起,PHP就像燎原之火,烧遍了整个开发阵营,改变了互联网的世界。可是,Rasmus并不是因此而创建PHP的。PHP是为了解决WEB开发者的实际问题而诞生的。

  * 视图层(View):前端网页;

  * 逻辑层(Controller):先是页逻辑(Page
Controller),负责处理页面请求;然后,调用业务逻辑(Business
Controller),实现具体功能;

  *
数据层(Model):数据保存在数据库之中,上面有一个数据库抽象层,再上面则是一个”数据访问对象”(DAO),它生成”值对象”(Value
Object)。业务逻辑通过DAO,操作值对象。

和许多开源项目一样,PHP变得流行,流行的动机并不能用正常的哲学来进行解释,甚至流行得有些孤芳自赏。它完全可以作为一个案例,一个解决各种Web问题的工具需求所引起的案例,因此当PHP刚出现的时候,这种工具需求全部聚焦到PHP的身上。

=======================================

但是,你不能奢望PHP可以解决所有问题。Lerdorf是第一个承认PHP只是一种工具的人,并且PHP也有很多力所不能及的情况。

PHP最佳实践

根据工作的不同来选择合适的工具。我跑了很多家公司,为了说服他们部署和使用PHP,但是这并不意味着PHP对所有问题都适用。它只是可以一个解决大部分问题的front-end脚步语言。

原载:

作为一个web开发者,尝试用PHP解决所有问题是不科学的,同时也会浪费你的时间。当PHP玩不转的时候,不要犹豫,试用一下其他的语言吧。

译者:阮一峰

2.使用多表存储提高规模伸缩性–MattMullenweg

本文给出了PHP程序设计常见问题的解决方法,同时简单描述了PHP应用程序的架构。

没有人愿意质疑MattMullenweg在PHP方面的权威性,他开发了这个星球上最流行的blog系统,(依靠一个强大的社区力量支持):WordPress.创建Wordpress以后,Matt和他的团队启动了WordPress.com平台,一个基于WordPressMU的免费blog站点。现在,Wordpress.com已经拥有大约400万用户,这些用户每天提供超过140,000篇的日志。

1. php.ini设置

金沙城中心赌场 ,如果有人知道如何让网站的规模伸缩自如,这个人一定是MattMullenweg。2006年的时候Matt对Wordpress的数据结构进行了前瞻性的改进,并且解释了为什么WordpressMU对每个blog使用独立的MYSQL表格,而不是把所有的blog数据都塞进一个巨大的表格。

php.ini控制了解释器的行为,下面的一些设置保证了你的程序有最大的可移植性。

我们测试过这个方法,但是发现如果要扩展它的伸缩性,代价太高。如果用一个整体的数据结构,在大流量面前,你将会面临服务器硬件的问题。在MU里面。用户们都被分布到独立的表格当中,并且可以轻易地组织起来。举个例子,WordPress.com把用户的数据分散存储到4096个数据库中,这些数据库可以分散大规模的数据访问,实现流量和压力分流。

i. short_open_tag

数据表的可迁移性让代码(blog)可以运行得更快,并且让系统具备更强的伸缩性。依靠强大的缓存策略和灵活的数据库运用策略,Matt向人们展示了时下最流行的Facebook和Wordpress.com都可以在PHP下稳定运行,并且处理惊人的访问量。

设为0,即永远使用PHP的长标签形式:<?php echo “hello world”;
?>,不用短标签形式<?= “hello world” ?>。

3.千万不要相信用户–DaveChild

ii. asp_tags

DaveChild是AddedBytes(previouslyilovejackdaniels.com)网站的核心人物,这个网站以他出色的《cheatsheetsformanyprogramminglanguages》而闻名。Dave为很多英国的公司服务,并且已经在编程世界里树立起相当的权威。

设为0,不使用ASP标签<% echo “hello world”; %>。

Dave为PHP开发者提供了很多深谋远虑的建议,并总结成了《writingsecurecodeinPHP》:千万不要相信你的用户,他们甚至可能会伤害你。

iii. magic_quotes_gpc

有一条web开发的基本原则,我重复多少遍都觉得不够,那就是:千万不要相信你的用户,同时要假设你网站中的每个数据单元都是从用户那里收集来的恶意代码。很多时候,你必须用JAVAscript在客户端检验表单提交过来的内容,如果你习惯了如此,那么,这是一个好习惯。如果安全性对你来说很重要,这就是最重要最需要学习的原则。

建议在脚本中包含一个全局文件,负责在读取$_GET、$_POST、$_COOKIE变量之前,首先检查这个设置是否打开,如果打开了,这对这些变量应用stripslashes函数。(注:该设置已经在PHP
5.3中被废除。)

Dave目前正致力于为它的《WritingSecurePHP》系列书籍整理实例,书的最后他说:

iv. register_globals

最后,变得偏执一点吧。除非你认为你的站点永远不会受到攻击,否则就正视所有的问题,当问题真正发生的时候,你的情况会变得很糟。你需要把每个用户都看成会带来一场攻防站的黑客,想尽一切办法来保护站点的安全,同时想好相应问题的解决方案。

不要依赖这个设置,永远通过全局变量$_GET、$_POST、$_COOKIE去读取GET、POST和COOKIE的值。为了方便起见,建议声明$PHP_SELF
= $_SERVER[‘PHP_SELF’]。

4.多使用PHP缓存–BenBalbo

v. file_uploads

BenBalbo开发了SitePoint,一个为developers和designers提供指导的网站。他是墨尔本PHP开发和开源俱乐部的成员,因此他对PHP有一定的了解,同时对PHPcaching有一定的想法和经验。

上传文件的最大大小,由下面的设置决定:

如果你拥有一个访问量很大,但更新并不频繁的站点(比如blog,基于某种CMS),或许它需要进行一些改造,这些改造不会花费太多的时间,但是对性能有突出的贡献。如果要为一个复杂/更新频率很快的站点建立缓存机制,过程可能会很曲折,但是好处也是显而易见的。

  * file_uploads必须设为1(默认值),表示允许上传。

  * memory_limit必须略大于post_max_size和upload_max_filesize。

  *
post_max_size和upload_max_filesize要足够大,能满足上传的需要。

PHP缓存技术有很多种,Ben为我们推荐了如下一些:

2. 配置文件(configuration file)

缓存函数的运行结果

你应该把与应用程序相关的所有配置,写在一个文件里。这样你就能很方便地适应开发环境的变化。配置文件通常包含以下信息:数据库参数、email地址、各类选项、debug和logging输出开关、应用程序常数。

设置过期时间

3. 名称空间(namespace)

缓存IE下载的文件

选择类和函数名的时候,必须很小心,避免出现重名。尽可能不要在类以外,放置全局性函数,类对内部的属性和方法,相当于有一层名称空间保护。如果你确实有必要声明全局性函数,那么使用一个前缀,比如dao_factory()、
db_getConnection()、text_parseDate()等等。

模板缓存技术

4. 数据库抽象层

Cache_Lite

PHP不提供数据库操作的通用函数,每种数据库都有一套自己的函数。你不应该直接使用这些函数,否则一旦改用其他数据库(比如从MySQL
转为Oracle),你就有大麻烦了。而且,数据库抽象层通常比系统本身的数据库函数,更易用一些。

由于PHP作为动态语言的特性,缓存机制对于更新频率并不快的站点来说非常重要。

5. “值对象”(Value Object, VO)

5.使用IDE,Templates和Snippets加速PHP开发–ChadKieffer

值对象(VO)在形式上,就像C语言的struct结构。它是一个只包含属性、不包含任何方法(或只包含很少方法)的类。一个值对象,就对应一个实体。它的属性,通常应该与数据库的字段名保持相同。此外,还应该有一个ID属性。

当ChadKieffer从UI设计和数据库优化的工作中抽身出来的时候,他会在他的博客2tablespoons上分享很多技术经验。由于Chad多方面的全面发展,他经常可以发现其他程序员不能发现的问题,并形成相关经验,尤其是他开发网站的方法。他参与了网站开发的各个环节,因此他的建议对于提高网站开发的大局观非常有用。

  class Person {

    var $id, $first_name, $last_name, $email;

  }

Chad认为使用EclipsePDT(Eclipse’sPHPdevelopmentpackage)这样的IDE,同时使用一些模板技术和开源项目可以有效地提高PHP的开发速度。

6. 数据访问对象(Data Access Object, DAO)

紧凑的计划,长长的todolists以及deadlines让开发人员非常苦闷。不过有些功能,比如EclipseTemplates,可以有效减少编码的时间和出错的几率。

数据访问对象(DAO)的作用,主要是将数据库访问与其他代码相隔离。DAO应该是可以叠加(stacked)的,这样就有利于将来你再添加数据库缓存。每一个值对象的类,都应该有自己的DAO。

通常来说,任何项目都可以自动化,自动化程度越高,你完成项目的时间就越短。花时间来开发使用频率很高的框架和模板,将会节省你以后更多时间。同时,使用像EclipseandthePDTpackage这样的IDE,你会发现效率得到明显提高,IDE可以自动闭合,补全分号并且可以在本地debug。

  class PersonDAO {
    var $conn;

    function PersonDAO(&$conn) {
      $this->conn =& $conn;
    }

    function save(&$vo) {
      if ($v->id == 0) {
        $this->insert($vo);
      } else {
        $this->update($vo);
      }
    }

    function get($id) {
      #execute select statement
      #create new vo and call getFromResult
      #return vo
    }

    function delete(&$vo) {
      #execute delete statement
      #set id on vo to 0
    }

    #– private functions

    function getFromResult(&vo, $result) {
      #fill vo from the database result set
    }

    function update(&$vo) {
      #execute update statement here
    }

    function insert(&$vo) {
      #generate id (from Oracle sequence or automatically)
      #insert record into db
      #set id on vo
    }
  }

如果你已经决定要学好PHP,找一家靠谱的培训机构,将会让你的学习过程事半功倍。

DAO通常应该部署以下方法:

“年度最受信赖职业教育品牌”千锋教育,一直秉承“用良心做教育”的理念,同期在校学员5000余人,合作院校超500所,合作企业超10000家。全国有十三个校区。数十位总监级专家讲师全职授课,200余位业内强师全程面授。

  * save:插入或更新一条记录
  * get:取出一条记录
  * delete:删除一条记录

“中国教育集团领先品牌”千锋教育,关注学员和企业的双向需求,每年为企业输出20000+计算机精英,毕业学员占据全国移动互联网培训人才一半以上的份额。毕业学员平均薪资也是全行业最高。

你可以根据自己的需要,添加其他DAO方法,常见的例子有isUsed()、getTop($n)、find($criteria)。

“年度最具影响力IT教育机构”千锋教育PHP课程的教学老师,全部来自央企及上市公司,平均从业经验5年以上。而且千锋教育的老师实行淘汰制,学生进行匿名投票。留下来的都是经过学生投票检验过的名师;

但是,所有的DAO方法都应该与数据库操作有关,不应该执行其他操作。DAO只应该对一张表进行基本的select
/ insert /
update,不应该包含业务逻辑。举例来说,PersonDAO就不应该包含向某人发送Email的代码。

千锋教育的PHP课程采用实战教学和分阶教学模式。课程内容紧贴名企需求,以实战传授理论,不谈虚的,只教真的。千锋教育力求将学员打造成具备完美职场竞争力的精英。千锋教育也是学员项目敢上线的唯一机构。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图