PHP的DB类设计.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
PHP的DB类设计

PHP的多路DB类设计Home, Beijing Langwan /January 2011前言DB类是PHP程序中最基本的类,而且分量还不小,因此我们今天讲述PHP中DB类的设计,有些DB类是ORM的底层,我们今天不涉及任何ORM的问题,至于什么是ORM大家可以参考。我们今天提到的DB类设计是这一种多路设计,一般PHP中自带的DB类都是单路的,多路的后端是一个数据库群,某些SQL需要走A数据库,某些SQL需要走B数据库,现在规模稍大一些的应用数据都不是完整的,可能会存放在多个数据库当中,或者多复制出几个数据副本,制作副本的原因是方便大量读访问的均衡,另一方面满足高可用的特性,当某个数据库出现问题可以有当前数据的副本马上提供访问和服务。本文提供的所有例程代码都可以看做伪代码,需要读者自行按照思路实际实现,但这种方法已经在作者多个项目及产品中使用过。典型场景下图是一个典型的多路查询环境,A图:我们针对用户的数据按照每1万用户进行了分表,每个数据库实例中存放两张表,这样不同的表会存储在不同的数据库实例当中,例如TB4实际上是在第二个数据库实例上,Request进行了四次查询,针对不同的数据库实例Request维护了两个数据库连接。这是另外一种典型的多路环境,B图:在这个设计中,写操作都直接走主服务器,读操作会从多台从服务器中选择出来一个进行服务,这种构架适合写少读多的情况,大多数公司的应用都属于这类服务,在我们的设计中这两种构架都会考虑进去。关键概念Request每次PHP请求称为一个Request,除了Resource资源以外,内部的变量或对象在Request结束的时候就会被释放,如果MySQL采用短连接,那么也会随着Request的结束而释放。数据库实例一台服务器大多数情况下只会跑一个MySQL,如果有两台服务器就可以称为两个MySQL数据库实例,如果一台服务器上跑了两个MySQL,也可以被称为两个数据库实例,一个数据库实例下可以有多个数据实例,例如DatabaseA或DatabaseB。DB类实例每一个PHP脚本在一个Request执行周期内会至少创建一个DB类实例,有些情况下会创建多个DB类实例,最终这些DB类实例会被PHP释放掉。连接描述PHP进程与数据库实例之间的连接,一般的设计当中一个DB实例拥有一个连接,多数程序在一个Request请求当中只初始化一个DB类实例,因此这种设计称为单连接设计,也就是说一个Request拥有一个DB实例,DB实例创建一个数据库的连接,如果在连接MySQL的时候我们使用的是mysql_connect()非持久连接,那么每个Request请求都需要重新建立一个连接。查询在与数据库进行的一次连接内,可以执行多次查询也就是Query,如果针对的是同一个数据库实例那么只需要维持一个连接,当需要在不同数据库实例之间进行查询的时候,就需要创建或切换到其它连接中进行,这也是DB类设计中容易出错的地方。持久链接连接数据库实例有两种方式一种是非持久性连接,一种是持久连接,非持久性连接的意思是客户端进行完所有的Query以后主动的关闭连接,持久性连接一般客户端会保持连接而不主动进行关闭,一直保持与数据库实例的连接关系,持续不断的进行查询。主动关闭当采用持久连接的时候客户端不会主动关闭连接,有些情况下可能是客户端出现故障而不去关闭连接,为了保证数据库的可用,服务器端会主动关闭不活跃的连接,这就是MySQL的wait_timeout设置,当不活跃的连接超过这个设置时间,就会被服务器主动关闭,这时候客户端在进行Query的时候就会失败。多数据库实例数据库的承载能力有一定的上限,如果单表超过千万行内容,索引就会变慢,因此通常在设计的时候我们需要对数据库进行横向或纵向的切割,把数据打散到不同的数据库当中,这时候一个Request需要维持与几个不同数据库实例之间的连接关系,这就会产生数据库的路由设计。查询路由当我们发起一个查询请求的时候,调用一个已存在的算法来获取当前查询需要使用哪一个数据库实例的连接,从而可以正确的查询出内容,这个算法被称为查询理由算法。多路DB类设计设计的方式多路设计可以有两种方式,一种方式是创建多个DB类实例,每个实例当中存放一个Connection,另外一种设计是在一个DB类实例中创建多个Connection,第一种在查询的时候需要选择一个DB类实例,后一种需要在查询的时候选择一条连接,如图:配置文件?phpreturn array(master = array(host = ...,user = ...,dbname = ...,),slave = arr

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档