重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
三层架构就是一种软件设计模式和完善的软件体系结构,它将整个业务应用划分为三层分别是表示层,业务逻辑层以及数据访问层
创新互联是一家朝气蓬勃的网站建设公司。公司专注于为企业提供信息化建设解决方案。从事网站开发,网站制作,网站设计,网站模板,微信公众号开发,软件开发,微信平台小程序开发,10余年建站对混凝土搅拌站等多个领域,拥有丰富的网站建设经验。
三层架构就是一种客户端-服务器体系结构,它将整个业务逻辑划分为三层,接下来在文章中将为大家具体介绍三层架构的相关知识,具有一定的参考作用。希望对大家有所帮助。
三层架构的含义:
三层体系结构是一种软件设计模式和完善的软件体系结构,其中功能过程逻辑,数据访问,计算机数据存储和用户界面在不同平台上可作为独立模块进行开发和维护。
三层体系结构将整个业务应用划分为表示层,业务逻辑层以及数据访问层。以下是他们的具体作用:
表示层:作用是占据顶层并显示与网站上可用服务相关的信息,这一层通过将结果发送到浏览器和网络中的其他层来与其他层通信
业务逻辑层:也称为中间层,该层从表示层中提取,它通过执行详细处理来控制应用程序功能
数据访问层:作用是安装存储和检索信息的数据库服务器,此层中的数据与应用程序服务器或业务逻辑无关
在三层体系结构中允许三层中的任何一层独立升级或替换。用户界面在台式PC上实现,并使用标准图形用户界面,在应用程序服务器上运行不同的模块。数据库服务器上的关系数据库管理系统包含计算机数据存储逻辑。且中间层通常是多层的
三层架构的优缺点
优点
(1)开发人员可以只关注整个结构中的某一层
(2)结构清晰,耦合度低,而且有利于标准化
(3)可以很容易的用新的实现来替换原有层次的实现;
(4)结构更加明确,在后期维护时极大的降低了维护成本和维护时间
缺点
(1)降低了系统的性能
(2)有可能会导致级联的修改
(3)增加了开发成本
什么是三层架构
假定MySQL服务器和PHP服务器都已经按照最适合的方式来配置,那么系统的可伸缩性(Scalability)和用户感知性能(User-perceived
Performance)是我们追求的主要目标。在实际运行中,MYSQL
中数据往往以
HASH
tables、BTREE
等方式存贮于内存,操作速度很快;同时INDEX
已经进行了一些预排序;很多应用中,MySQL
排序是首选。
PHP与MySQL相比具有如下优势:
1、考虑整个网站的可伸缩性和整体性能,在应用层(PHP)中排序明显会降低数据库的负载,从而提升整个网站的扩展能力。而数据库的排序,实际上成本是非常高的,消耗内存、CPU,如果并发的排序很多,DB
很容易到瓶颈。
2、如果在应用层(PHP)和MYSQL之间还存在数据中间层,合理利用,PHP会有更好的收益。
3、PHP在内存中的数据结构专门针对具体应用来设计,比数据库更为简洁、高效;
4、PHP不用考虑数据灾难恢复问题,可以减少这部分的操作损耗;
5、PHP不存在表的锁定问题;
6、MySQL中排序,请求和结果返回还需要通过网络连接来进行,而PHP中排序之后就可以直接返回了,减少了网络IO。
至于执行速度,差异应该不会很大,除非应用设计有问题,造成大量不必要的网络IO。另外,应用层要注意PHP
的
Cache
设置,如果超出会报告内部错误;此时要根据应用做好评估,或者调整Cache。具体选择,将取决于具体的应用。
列出一些PHP中执行排序更优的情况:
1、数据源不在MySQL
中,存在硬盘、内存或者来自网络的请求等;
2、数据存在
MySQL
中,量不大,而且没有相应的索引,此时把数据取出来用PHP排序更快;
3、数据源来自于多个MySQL
服务器,此时从多个
MySQL
中取出数据,然后在PHP中排序更快;
4、除了MySQL
之外,存在其他数据源,比如硬盘、内存或者来自网络的请求等,此时不适合把这些数据存入MySQL
后再排序;
列出一些必须在MySQL中排序的实例:
1、MySQL中已经存在这个排序的索引;
2、MySQL中数据量较大,而结果集需要其中很小的一个子集;比如
1000000
行数据,取TOP
10;
3、对于一次排序、多次调用的情况,比如统计聚合的情形,可以提供给不同的服务使用,那么在MySQL
中排序是首选的。另外,对于数据深度挖掘,通常做法是在应用层做完排序等复杂操作,把结果存入MySQL即可,便于多次使用。
4、不论数据源来自哪里,当数据量大到一定的规模后,由于占用内存/Cache
的关系,不再适合PHP中排序了;此时把数据复制、导入或者存在MySQL
,并用INDEX
优化,是优于PHP
的。不过,用
Java,甚至
C++
来处理这类操作会更好。
有些类似大数据集聚合或者汇总的数据,在客户端排序得不偿失。当然,也有用类似搜索引擎的思路来解决类似应用的情况。
从网站整体考虑,就必须加入人力和成本的考虑。假如网站规模和负载较小,而人力有限(人数和能力都可能有限),此时在应用层(PHP)做排序要做不少开发和调试工作,耗费时间,得不偿失;不如在DB
中处理,简单快速。对于大规模的网站,电力、服务器的费用很高,在系统架构上精打细算,可以节约大量的费用,是公司持续发展之必要;此时如果能在应用层(PHP)
进行排序并满足业务需求,尽量在应用层进行。
关于PHP中执行排序与MySQL中执行排序的相关知识就介绍到这里了,希望本次的介绍能够对您有所收获!
从PHP诞生之日起,PHP就开始在Web应用方面为广大的程序员服务。同时,作为针对Web开发量身定制的脚本语言,PHP一直秉承简单、开源的思想,这也使得PHP得以快速的发展,并且大力地推动Web2.0的出现与发展。但是,长期以来,PHPer(PHP Programmers)被认为是处于草根阶层的程序员,被认为是技术含量少,层次低的程序员。这点在国内尤其突出。
记得一个技术主管说过这样一个事情。他给一个程序员分配了PHP的开发任务,没想到那个程序员居然说:“我是学Java出身的,你让我去写 PHP,你这不是在贬低我吗?”。这件事情给我印象很深、触动也很大。虽然这不能代表大部分程序员的看法,但是这么认为的人应该不少。还有人说,现在如果是大型的政府项目,PHP是肯定不会被列入考虑的范围之内的。
那么为什么PHPer会被认为是草根阶层,是因为它很简单,人人都可以学会,所以没什么难度吗?我以前也是这么认为。PHP入门很快,处理文件,数据,远程连接,网络编程都非常方便,官方也有这样的说法:PHP学习的成本很低,所以你容易去使用它。这个想法也是普遍的,甚至大部分的PHPer 自己都这样认为。
说到这里,我想大家就会想到我为什么要写这些文字。因为一年多的PHP推广工作让我了解到许许多多的使用PHP的公司的大概情况。在这些过程中我慢慢体会到其中的根本原因。这里我说是根本原因虽然是个人的看法,但是我觉得事实就是如此。
那么为什么PHPer会被看成草根阶层,根本原因是PHPer所作的事情(通过代码实现)的绝大部分都是表现层的东西,这个熟悉PHP的人都知道。当然也会有PHP会说他用MVC结构编写的某某框架具备的如何如何的功能。但是这些还是表现层。所以只会处理表现层的程序员就被看成草根阶层了。事实上也是如此,因为这种情况下PHP确实很难构造大型的应用。
这就找到原因了,不是的。为什么PHPer总是在负责表现层的东西呢。答案是底层的数据处理(Web应用就是数据存储和查找)我们一般不去触及。好,那么说到这里有些人可能已经想到了,那不就是数据库吗?对,就是数据库。让PHPer一直当草根的元凶就是数据库。为什么?
PHPer对MySQL的依赖过大
因为目前流行的web架构中,前端是负载均衡系统,中间是web服务器,后面是数据库服务器。所以,大部分PHPer工作在Web服务器层面。因为数据库已经很好地为我们组织数据了。所以PHP中没有太多的算法,而且大家潜意识下也觉得不需要,更何况会影响性能。
这种情况下,PHPer就成为了数据库使用者,他总是在操作数据库。而不是在做程序。一个最简单的PHP脚本就是,连接数据库,把数据取出来,然后用命令输出到浏览器。整个过程不超过10行代码。给人的感觉就是太简单了。没有任何技术含量。为什么了,因为数据处理部分都已经被数据库做完了。尤其是MySQL的使用。MySQL是免费的,所以大多数程序员可以自由地使用它,另外MySQL的速度够快了,所以做个PHP应用程序非常的简单。这就相当于给你枪以后你觉得没有必要学习武功一样。当然,我不是说枪没有武功好。而是说,枪的出现,小孩都可以轻松便捷地杀人了。
我们再详细说说为什么是数据库。这里我说一个例子。我去过北京一家非常著名的网站,当时我们还有一个比较资深的PHP程序员在那说些系统架构的事情。我记得当时那个程序员问大家一个数据结构中的算法问题的时候,全场没有一个人能答得出来(包括我)。然后那个程序员就开始给大家讲些很基础的数据结构的东西了。让我一下子回想到大学时候学的数据结构课。而这些基础的数据排序、查找、传递的问题在其他高级语言(比如C)是非常普遍的。但是在PHP没有。PHPchina.com的论坛也有个板块叫PHP的数据结构和算法。这个板块的帖子也是寥寥无几。
说到这里,大家明白了吧?大部分PHPer仅仅处理表现层的东西,而在MySQL的便捷使用下,PHPer几乎不用触及任何数据结构与算法的情况下完成大部分开发任务,所以一个才有上面的,没有一个PHP程序员能够回答出那道数据结构的问题,换成是C等语言,情况可能就大不相同了。是PHPer草根,才让PHP显得草根。
仔细回想下,目前网络上大家讨论的最多的是两个方面的问题。一个是PHP的类的使用(处理过程的封装),还有一个是开发框架问题。但是我们仔细分析的话,发现这些所谓的PHP中比较复杂的概念里面没有数据处理。为什么,有数据库。用一个Adodb或者PHP5的PDO就可以搞定了。真的搞定了吗?不是,这些无非是在连接数据库,没有数据处理。所以PHPer似乎就没有什么可以拿出台面上的东西。
再说一个具体的代码问题,无级分类。这个概念我想大家都不会陌生了吧。我见过两种处理方式。第一个是地道的PHPer的处理方式,也是目前比较流行的。就是用数据库来处理。而且字段很少,只需要加个父类的字段并加以判断就行了。而且这个方法很实用。效率也高。但是这个不是数据处理的范畴了,而是数据库的查找。
第二个是C程序员用PHP写出来的,他把所有的分类信息都从数据库取出来,然后用数据结构算法进行排列分布,然后输出。
这里我们不对这两种方式的效率进行对比,我想大家都有各自的想法。但是我想说明一个问题,就是这两种做法的本质的区别。PHPer习惯性地用数据库来处理,而且有很巧的处理方式,效率也很高。这种方式就是数据库查询。而第二种方法是比较有特点的。他认为数据库就是存放数据的地方,具体的逻辑处理还要靠自己的逻辑。
因此,结论是第二种方法的使用者觉得自己强些,因为数据的逻辑是他组织的。并且觉得PHPer的那种做法无非就是会查询数据库罢了。所以他认为PHPer是草根级的,只懂得操作数据库和排列页面(smarty搞搞那种)。
让数据库回归本职工作
说到这里,我想大家都已经回忆了不少自己平时用PHP做开发的经历了吧,是否发现大家确实都在操作数据库呢。
那么我们来讨论下这个问题。数据库不好吗?为什么我一直用数据库处理数据都没有问题。我要说的是数据库是有问题的,而且有很大的问题。当然这里我并不是说不能用数据库,也不是在贬低数据库的性能。而是,我们没有充分认识到数据库所起到的作用。
我的想法源起于这样一个事情,有一次一个网站的技术总监问我,为什么他们的网站那么慢,要怎么办。当时,我的MSN里Zend总部的工程师正好在线,我就问他PHP响应比较慢了,怎么办?他当时直接告诉我,是数据库问题。肯定是数据库没有优化设计好。所以,我没有给那个技术总监确切的答案了,因为他们的数据库设计我们是不能涉及的。所以就给了大概的数据库优化的建议。这样的事情屡次发生,我就开始怀疑,为什么Zend总部的工程师每次都跟我说是数据库的问题呢,难道我们不能从PHP层面来解决这个问题吗?答案是不能。因为PHP目前的运行速度已经是很快了,通过Zend的性能分析也能看到一个用户的点击,PHP的运行时间只有10%不到,那PHP在干吗?它在等。等数据库的查询结果。这个方面在目前的PHP产品中有了很大的提高,那就是 Caching和网页静态化两个方案。
Caching可能大家会比较陌生,但是网页静态化现在连PHP产品的用户都非常清楚了。速度快、容易被搜索到等等,好处不言而喻。开玩笑地说,现在网站的主页实现网页静态化只需要硬盘足够大。J至于Caching就比较复杂些,也是大多数PHPer感到头疼的地方。甚至于有些人会用C来实现。因为Caching中的数据有效期验证、查找、提取、更新等等都是比较难处理。当然,也有人会用数据库来处理 Caching问题。
所以,当访问量激增的时候,PHP架构的网站会出现的很多问题都因数据库而起。数据库的同步问题还不算什么。关键是数据库的响应速度会有指数级的降低。这个问题我在10月23号LAMP发布会的时候问过MySQL的副总裁。他当时也没有给我比较完美的答案(这也我的意料之中),因为数据库总会有瓶颈的,除非是神仙数据库,哈哈!
这里有个题外话,LAMP大会的时候我跟Yahoo的一个技术高管聊的时候,我问他Yahoo在选择MySQL还是Oracle的时候是怎么考虑,他的答案令我非常惊讶。他说大部分的时候我们是会用MySQL的,因为它的性能已经达到我们的要求。但是什么时候我们会选用Oracle呢,就是当我们需要存储收费用户的数据的时候。我就问为什么,难道Oracle比MySQL稳定吗?他说,这个倒没有特别考虑。关键是如果使用Oracle的话,当出现问题的时候我们可以找到负责人,Oracle会负责事故的处理,但是如果用MySQL的话,我们找谁去?
所以,我们对数据库的看法应该纠正过来,就是说数据库不是万能的。如果有实力的话自己开发数据库。听说Google就是那样的。
那么我们怎么看待数据库呢?我个人的理解是数据库只是用来降低开发成本的手段。因为采用数据库以后我们不需要考虑数据的存储,尤其是排序和查找。但是这会带来什么问题呢?就是当业务膨胀的时候,数据库就成为瓶颈了。这个时候问题就会非常棘手。因为这个是底层的数据处理。牵一发而动全身。
所以我认为正确的观点是,数据库是一个数据备份机。怎么理解,我们只需要保证数据的存储有效性就行了。而这本来就是数据库的核心功能,只不过因为数据库的方便的排序等功能让大家把过多的处理都交给数据库来操作了。一个用户的点击PHP就把一大堆的任务交给数据库,然后把结果排列下给用户就完事了。这对数据库是不公平的。也是因此大家开始抱怨数据库的性能了。
针对这个观点,我们再举个例子,有一次我去拜访一个大型的网络公司(基本上国内只要上过互联网的都知道),他们使用PHP很少,但是我了解到他们其它业务是怎么使用数据库。他们自豪地跟我介绍说他们在数据库的外围有个第二数据库(我这里起名叫第二数据库)。为什么叫第二数据库呢,原来它是一个缓存系统。那么开发工程师怎么去这个缓存系统获取数据呢?那个技术总监自豪地说,他们这个缓存系统有SQL查询语句。我当时很惊讶,但是后来想想确实需要这个。因为当你的缓存系统达到一定量级的时候从缓存获取数据都非常复杂,干脆写个SQL查询语句让缓存系统分析、处理并返回数据。而且他们告诉我,在他们那里,就算是用PHP的话也是让PHP去那个缓存系统读取数据。
所以说,如果你能处理好这样的问题的话,把数据存放在数据库,然后数据库只起到备份的作用。然后你用自己的中间层来处理分析数据,效果是90% 以上的用户不访问数据库。有人就会说了,这不就类似连接池的东西吗?是的,因为数据库的瓶颈是无法解决的,我们只能在Web服务器和数据库中间加个中间层来做缓冲。
可能大家会说了,切,这个我们早就知道了。那好,这里我要说的是它引发的两点思考:
第一,有些语言已经有连接池技术的基础上,那些程序员可以方便地使用连接池而构建大型应用。那么如果他们认为 PHPer只会是用数据库,那么我们是不是可以说他们只会是用连接池呢?连接池和数据库在这个概念上有何区别?
第二,当PHPer开始构建自己的缓存系统的时候,他是不是突破了PHPer只会是用数据库的层次?因为他参与了数据逻辑的处理工作。那么他还是草根吗?
最后,懂得独立思考的PHPer不是草根,什么事情都丢给数据库去做的才是。
这么说吧,php就是实现用户和服务器交流的语言。前台就是你看到的那些东西,有些事不会变的,但有些东西是会变的,你告诉服务器你想要什么,服务器就给你显示什么,这个过程就需要用到php来实现,也就是后台的数据调用。
就拿这个百度知道的页面说吧,你每个问题看到的东西都不一样,但是结构都是一样的,这个结构就是前台设计好的,而这些内容就是根据你点的问题,通过php(也可能是其他服务端脚本语言)来获取相应的数据,然后在相应的位置显示相应的内容;你填写好提问或回答,点提交,然后又是通过php把你的提交的数据保存起来,以便以后或其他人查看。
-