转载链接:http://www.jb51.net/article/14202.htmphp
作WEB好几年了,各类语言和技术都稍有涉猎。今天心血来潮,忽然想总结一下。其实不论什么技术,什么需求,一般WEB开发就是经过WEB前端管理一个或大或小或独立或分布式的关系型数据库,不少东西都是相通的。这里说的WEB架构,是指WEB应用开发中每种技术独有的资源组织形式(包括文件,数据库,HTTP请求处理等。注意并不是OO的开发方式才有架构一说),也许说开发方式更容易让人理解一些。 - 如下想法主要以PHP实现为示例,但不少体会我想Java,.NET,Ruby开发者应该也很容易理解。最后是我对于刚面世就引发无数人关注的Delphi fo PHP的评测。前端
WEB程序的架构基本上能够分红如下三类:程序员
(一) 基于"WEB页面/文件",例如CGI和PHP/ASP程序。程序的文件分别存储在不一样的目录里,与URL相对应。当HTTP请求提交至服务器时,URL直接指向某个文件,而后由该文件来处理请求,并返回响应结果。web
好比http://www.website.conm/news/readnews.php?id=1234数据库
能够想像,咱们在站点根目录的news目录下放置一个readnews.php文件。编程
这种开发方式最天然,最易理解,也是PHP最经常使用的方式。要注意产生的URL对搜索引擎不友好,不过你能够用服务器提供的URL重写方案来处理,例如Apache的mod_rewrite。小程序
(二) 基于"动做"(Action)。这是MVC架构的WEB程序所采用的最多见的方式。目前主流的WEB框架像Struts、Webwork(Java),Ruby on Rails(Ruby),Zend Framework(PHP)等都采用这种设计。URL映射到控制器(controller)和控制器中的动做(action),由action来处理请求并输出响应结果。这种设计和上面的基于文件的方式同样,都是请求/响应驱动的方案,离不开HTTP。浏览器
好比 http://www.website.com/news/read/id/1234缓存
能够想像在实际代码中,咱们会有一个控制器newsController,其中有一个readAction。不一样框架可能默认实现方式稍有不一样,有的是一个Controller一个文件,其中有多个Action,有的是每一个Action一个文件。固然这些你均可以本身控制,题外话。服务器
这种方式的URL一般都很漂亮,对搜索引擎友好,由于不少框架都自带有URL重写功能。能够自由规定URL中controller、action及参数出现的位置。
另外,还有更直接的基于URL的设计方案,那就是REST。经过人为规定URL的构成形式(好比Action限制成只有几种)来促进网站之间的互相访问,下降开发的复杂性,提升系统的可伸缩性。REST对于Web Services来讲是一个创新。
虽然本文讨论的是单个项目所采用的架构,而REST是为了解决网站之间的通信问题,但REST的出现,会对单个项目的架构形成影响(很显然你在开发时就要构造规范的URL)。未来混用REST和MVC应该也是一种趋势。RoR提供很好的REST支持,Zend Framework也提供了Zend_Rest来支持REST,包括Server和Client。
(三) 基于"组件"(Component ,GUI设计也常称控件)、事件驱动的架构,最多见的是微软的.NET。基本思想是把程序分红不少组件,每一个组件均可以触发事件,调用特定的事件处理器来处理(好比在一个HTML按钮上设置onClick事件连接到一个PHP函数)。这种设计远离HTTP,HTTP请求彻底抽象,映射到一个事件。
事实上这种设计本来最常应用于传统桌面GUI程序的开发,例如Delphi,Java Swing等。全部表现层的组件好比窗口,或者HTML表单均可以由IDE来提供,咱们只须要在IDE里点击或拖动鼠标就可以自动添加一个组件,而且添加一个相应的事件处理器。
这种开发方式有几个优势:
复用性 -代码高度可重用。
易于使用 -一般只须要配置控件的属性,编写相关的事件处理函数。
我我的也挺喜欢这种方式,PEAR就提供了至关强大的HTML_QuickForm,用于在页面添加表单元素及其事件处理函数,还能够与Smarty等模板引擎相结合。这对于项目开发来讲是一个补充性的功能,在项目中的某些部份使用QuickForm,有时能够大大加快开发。
而彻底基于组件和事件驱动的开发框架对于PHP来讲也已经不新鲜,PRADO就是一个这样的框架,曾经得过Zend编程大赛的头奖。但目前来讲很显然Prado所提倡的这种开发方式仍然没有被大部份PHP程序员所接受。为何呢?
我以为主要有如下两个问题:
(1)效率问题
这里指的不是开发效率,而是代码的执行效率。众所周知,正常状况下,PHP的执行是至关高效的。可是目前这种基于控件的框架效率都成问题。Prado自己提供了一个缓存机制来缓解这个问题。若是不采用缓存,能够说不少站点根本不能使用Prado这样的框架,好比门户网站,大型论坛等。
但ASP .NET不太同样,由于它是编译型的框架,最后生成的代码是编译生成的,不须要再次进行中间过程的诸多处理,因此在第一次执行以后速度会很快,执行效率仍是很高的。 这是语言层次的功能,Prado没法经过代码层次的努力彻底弥补。
(2)没有强大的IDE支持
设置控件的属性,添加其对应的事件处理器,看似简单,但控件多了,这也是个繁重的工做。.NET的强大就在于它把程序员从重复的工做中解放了出来,设置属性很方便,事件处理器也会自动添加。Prado目前没有这样的IDE支持。
总之,这种基于控件的框架比较适合于用户交互较多的,须要对页面中的不少组件设置不一样处理操做,但对于性能要求不高的应用。另外,带有组件支持的框架一般对AJAX的支持都较好,好比.NET和Ruby on Rails。
综上,三种架构基本上能够表明目前的全部主流WEB开发方式,包括PHP,JavaEE,.NET,Ruby/RoR。
//**************************************************************************************//
//**************************************************************************************//
//**************************************************************************************//
目前PHP开发的情况和将来的趋势:
平时作PHP比较多,特别总结一下PHP开发的趋势。目前在PHP开发中,咱们最经常使用的是基于"文件"的架构,其实也就是一种"面向过程"的开发方式。一般咱们写PHP程序的目的就是"快点上线,让程序跑起来"。并且大多数PHP程序员还要和HTML、CSS作近身搏斗,因此若是程序太抽象,调整视觉效果就比较困难。因此对于小项目,这是一个最好的选择。
但愈来愈多人认识到,面向对象和MVC框架更能促进代码的复用和分享,并且程序易于扩展,随着程序复杂性的增长这个趋势越明显。因此OO框架层出不穷。目前PHP框架当中最有前景的是CakePHP、Symphony和Zend Framework,各自拥有活跃的社区和庞大的用户群,都在快速成长当中。PHP的框架都避免走Java框架庞大臃肿的老路,致力于快速开发,并且主动模仿和吸取RoR这些优秀框架的新特性。随着PHP5的普及和这些框架的成熟,加上PHP本来开发社区的庞大人数,未来也许又会再产生出一些行业性的标准。
这种选择适合于中大型项目,特别是须要较大的团队合做和须要长期维护和二次开发状况。我的认为这是未来PHP开发的趋势。
而对于基于组件和事件驱动的开发方式大多数PHP程序员都不感兴趣。可是也有很多人在作这方面的努力,例如Codegear的Delphi for PHP,就吸引了不少人的关注。若是有强大的商业支持,也许未来在开发市场也会占一席之地。
我会在下一篇文章介绍D4P的新特性并做评测。
WEB开发的将来展望:
随着更贴近HTTP的REST的流行,我以为像.NET和Java中的抽象组件的方式会受到冲击。由于这些组件并不如它们所承诺的那么方便。将来MVC+REST+RIA的模式应该会比较流行。
AJAX是一把双刃剑,尽管事件驱动的架构看起来很是适合于处理异步的请求(能够想像页面中存在几个组件,每一个组件均可以触发异步请求,对应对服务器端的某个事件处理器,看起来是很理想的一个处理方式),但要为客户端自动生成良好的JavaScript代码是很不容易的,要知足各类浏览器的兼容性要求,还要可以本身进行扩展,以知足项目中千奇百怪的需求。 不少时候我更倾向于使用一些JS框架如Prototype来本身开发各类效果,而不是在服务器端生成。在服务器端生成JS的两个结果,一是对生成的代码不信任,二是人变傻,由于你并不知道真正发生了什么。
(一点牢骚也贴上来)
关于WEB开发的我的疑惑:
l 为了让开发更简单,咱们不得不学习使用复杂的开发工具和框架,这究竟是一个进步,仍是退步?
l IDE让程序员变聪明仍是变傻? 当咱们在服务器代码里面就能够设计客户端界面,这是一个进步仍是退步?
举个例子说,微软的ASP.NET AJAX,让咱们能够在服务器端设计各类异步的控件。那么程序员甚至能够不会Javascript,不懂AJAX就设计出各类客户端效果。要是哪一天项目须要设计稍复杂的效果,靠IDE和框架没法自动完成,你要怎么办? 到这个时候再来学JS,也许就迟了。更可怕的是,技术在更新和淘汰,可能十年以后,你会发现本身除了各类IDE以后,真正精通的技术不多,脱离了IDE你写一个小程序都要查半天API手册,由于你平时都是依赖"自动补齐"来写代码的! 这样的情景,我想没有人愿意发生。
也许对于短时间开发的项目来讲,是一个进步,但对于程序员我的的成长来讲,这并非好事。对工具的依赖,致使了咱们对于底层和核心技术的不求甚解,限制了我的的成长。