专家畅谈ASP.NET与PHP的未来

开发 后端
本文将讨论的是ASP.NET与PHP各自在速度上,以及市场占有率方面的对比。其实ASP.NET与PHP孰强孰弱的讨论的意义,还不如看到各自的优势来的更好。这里也会结合专家意见,大家一起畅谈ASP.NET与PHP的未来。

单纯通过对比两种开发工具,是没有任何意义的。因为二者在自己的开发领域各有所长,就好像Java对比.NET,各有优势。本文主要的目的是通过比较ASP.NET与PHP,让大家更清楚的看到二者的区别,以便于大家选好适合自己的开发工具。

php LOGO

我日常工作使用的是ASP.NET,前一段想学习了解一下其他的网络应用开发技术,本可以选择热门的Ruby on Rails或者Python,但是无奈精力有限,想都学是不可能的,而我的博客建在WordPress上,WordPress是用PHP写的,所以还是选择多花些时间了解PHP。

PHP和ASP.NET最大最本质的区别,就是PHP只是一门编程语言,而ASP.NET是一个平台。

这世界上大约1/3的网站的应用程序是用PHP写的,这些PHP程序又大部分运行在Apache上,作为一门语言,PHP并不是必须运行在Apache上,PHP是独立于运行平台的,它也可以在IIS里运行。与PHP相反,ASP.NET是一个平台而不是语言,ASP.NET的程序可以用C#写,也可以用VB.NET写,可以用任何能够编译成在.NET CLR上运行的的编程语言来写,ASP.NET通常运行在Windows+IIS上,但是也可以运行在其他Web Server比如Apache上。

从这个意义上说,PHP和ASP.NET的区别,就好比是iPhone和Windows 7的区别,不是一样的东西,但是你选择了其中一个,就等于选择一种风格。

但是作为开发网络应用的工具,就我的体会,在功能上还有两个显著区别。

Share-Nothing Architecture

PHP的哲学是Share-Nothing Architecture,每次对HTTP请求的处理都是独立的,不共享任何数据,如果真的需要共享的话,那也是通过文件系统或者数据库,在PHP的运行空间中不会共享内存对象。这篇关于Share-Nothing Architecture的文章非常详细地介绍了Share-Nothing Architecture,这种架构能够带来更好的扩展性(Scalability)和可维护性(Maintainablity)。

使用ASP.NET一样可以实现Share-Nothing Architecture,问题是,ASP.NET一族的编程语言特性让打破Share-Nothing Architecture太容易了。比如,C#语言中的static变量,如果使用的话,同一AppDomain的每个HTTP请求都Share同一数据,这样就不是Share-Nothing了。

Asynchronous Programming Model

ASP.NET有一个功能是PHP不具有的,Asynchronous Programming Model(APM),异步编程模型,这一模型可以更有效地利用线程,提高Scalaibility,当然,写异步的程序要比写同步的程序困难得多。

PHP没有ASP.NET一样的Asynchronous Programming Model,为什么在这一方面PHP世界居然逊于微软技术呢?

我看可从两方面回答,第一,微软支持APM是因为它能够支持,第二,是因为微软必须支持。

为了支持APM,必须要有底层支持,ASP.NET作为一个平台,可以利用微软的IO Completion Port来实现真正的异步。但是像PHP这样的编程语言,只是编程语言,不能够假设自己运行在一个支持异步端口的平台上,所以决定语言不会添加APM功能。

为什么又说微软必须支持APM呢?Windows上进程的代价很大,线程的代价好一点,但是依然很大,所以要有效地使用线程,就必须创造出APM这样的东西。相比之下,Linux上进程线程的代价要小得多,这样创造APM的压力也就小得多,不用APM一样可以保持高效。

Trends

这篇文章标题是”PHP vs ASP.NET”,我们用Google Trends来看看二者的比较。看短期对PHP和ASP.NET的关注程度,有意思,每到周末,对这两个关键词的搜索就少,可见PHP和ASP.NET的使用者大都是周一到周五工作的上班族。

PHP走势图

我们看长期比较,对PHP的搜索呈下降趋势,怎么会这样呢?我想不明白,PHP依然是这世界上应用最广的网络编程语言,最近Facebook的开发者发布了HipHop,将大大提高PHP应用的性能,也许运行速度可以比ASP.NET还要快。

 

搜索走势图

在这里我们要引用博客园老赵的一篇博文《从ASP.NET的PHP执行速度比较谈起

原文链接:http://www.cnblogs.com/JeffreyZhao/archive/2009/09/18/aspnet-php-benchmark-and-more.html

我在InfoQ发表了一篇新闻,对Joe Stagner在博客上发表的三篇关于ASP.NET与PHP性能对比的文章进行了总结。写新闻其实挺不爽的,因为不能夹杂个人的看法,只能平铺直叙陈述事实。当然,如果像某些新闻那样“换一种说法”是可以骗过一些“不明真相的群众”,但是这就有违道德了。因此,在客观陈述完新闻内容之后,我只能选择把自己的感想、评论等内容放在自己的博客上。

Joe Stagner的背景挺特殊,它是PHP的老用户,在ASP.NET出现之前就是PHP的重量级开发人员了。后来不知哪一天开始他加入了微软,我们就可以在一些如介绍ASP.NET AJAX的文章、视频中看到他。这次他又涉及了一个敏感话题:性能比较。要知道每次这种比较都会惹来一阵争论……我不想用“口水战”来形容,我认为它和“争论”的性质不同。Joe也承认,每次他说PHP好话就会被微软的同事指责,而说.NET好话就要被PHP阵营说是微软的托。

我深信优秀的技术人员都是有信仰的,都有技术倾向性。因此如Joe夹在中间的人的确比较尴尬。但是我认为,有信仰,和“客观”是不冲突的。信仰涉及到倾向性,而客观则意味着有倾向性之后的办事方式。

至于比较结果,您可以关注一下新闻内容,总体来说,ASP.NET从纯粹的执行效率上来说是大幅领先于PHP的。这并不令人惊讶,一个是编译为机器码的执行方式,一个是解析执行(即时缓存了op-code也并不是机器码),性能自然天差地远。

Joe也知道会引发争论,因此他在文章后面写道:

我知道某些人会被这个测试结果激怒,欢迎发表评论及反对意见,但是如果你无法保持礼貌的话,我会删除你的评论并阻止你的IP。

如果你不喜欢,并拒绝接受这个结果——那么你也来测试一下。用数据支持你的观点,使用我的代码或你自己的,然后围绕事实再来争论
自然,Joe也给出了测试代码及测试环境的描述。

文章的评论自然是很有看头的,说法很多,有许多人说VS的IDE好,有人说PHP永远只能写出半专业的程序。Joe一一进行了回应,我个人认为回应的还是很客观的,紧紧围绕在测试的中心。他表示,虽然VS非常优秀,但是PHP也有很好的IDE。而能否写出专业的程序是看人,而不是由PHP决定的,有丑陋的PHP程序,也能写出如C++一般工整美观的代码。

从表面上看,ASP.NET在性能上胜出PHP一大截,作为ASP.NET的忠实用户我应该非常乐意接受这个“结果”。但是,我并不关注这个,因为这种运行时上纯粹的速度对于一个Web应用程序来说实在微不足道。例如Joe的第三篇文章里列举出的PHP高手的应对方式:

ASP.NET在性能上的领先不会对我有什么影响。PHP是我的最爱,我的应用程序已经足够快了。

没错,ASP.NET在基础性能上是比较快,但是我的应用程序可以通过优秀的页面实现和JavaScript实践把这部分性能补回来。

我在进行Drupal开发,我对PHP最熟悉,因此我宁愿多花一些硬件来保持更好的开发效率。

以及InfoQ上的一条评论:

在WEB上便捷的开发,与各种系统之间灵活的搭配,像胶水一样将各种不同的物件拼装起来呈现给Web,(python在这方面也做得非常棒)。这才是PHP能有今天的本质原因。
之前我批评Java是一种不思进取的低生产力语言,回应很多。其中也有类似的说法,如说Java平台上开源多,项目多等等。没错,这我在对Java语言发起非难之前就已经反复强调了。我同意这个观点——但是,如果是这样的“结论”肯定是站不住脚的:“因为Java平台开源多,项目多,因此Java语言并不是不思进取的语言”。这就好比有人说“他熟悉PHP,PHP的项目多,因此PHP的性能比ASP.NET快”一样,把两种东西混淆起来了。

奇怪的是,Joe没有让人不要用PHP,我也没有让人不要用Java平台(不过我现在一直建议别人用Scala代替Java语言)。

许多国内技术人员总有这样的“毛病”,见不得自己使用东西有一点点“瑕疵”。既然我是Java平台开发人员,我使用Java语言,我就见不得别人说Java语言一丁点不好。其实做技术就是做权衡,“没有银弹”就意味着没有技术是完美无缺的,我们选择技术是在优势和劣势之间进行平衡后的结果。只有承认了缺点,认识到缺点,才能吸取其他技术的长处,来作出更好的权衡。

因此我一直认可的是,SQL Server的确贵,数据存储就用*nix平台上的吧。选择多,性能多。

当然,这不是国内技术人员的毛病,这是一个广泛的问题。很巧,李笑来老师昨天写了一篇博文,似乎刚好谈论了这方面的问题。文章很短,就全文摘录了:

无论是谁,一生中总是在不停地“选择”(姑且不论所谓选择之中有多少是真实的有多少是幻象而已)。每个人都在尽量在众多选项中选择“最好”的那个。一生有2n选择,可最终只有一条路属于自己。

走在自己正在走的那条路上,人们对其它可能性可以抱有两种态度:“好奇”——通常因对现状不满而表现为“后悔”;或者“自负”——更多人最终选择的是这个,因为另外一个选择所表现出来的“后悔”通常被认为是负面情绪,而与之相反的“无怨无悔”好像更加理直气壮更加毅然决然(尽管并不总是正确)。

时间长了,人们就不知不觉把“我一直在尽量选最好的”和“我选的就是好的”等同起来,进而外演为“与我选的不一样的选择就是不好的”,再进一步演化为“既然选的是‘不好’的,那他要么是笨,要么是‘坏’,反正跟我不一样!”

根源就在这里了。以自我为中心也好,过度自恋也好,沙文主义、大男子主义、狭隘民族主义也罢,都大抵上如此。
还有一个问题,之前也多次谈过,国内技术人员太容易轻视一个问题。例如在这篇新闻中不止一个用户觉得这个测试很无聊。为什么“无聊”?可能是觉得“这点性能不是关键”因此这个实验没有意义吧。我想说,其实最无聊的不是做实验的人,而是纠结与实验结果的人。或者说,无聊的不是实验,而是纠结于实验结果。与此相比,我反而强烈怀疑,轻易认为这个实验无聊的人,倒是真正只关注与“谁快谁慢”,而不关注过程和结果所表达出的内容。不去推测,不去思考。那么以后到了需要决策的时候,决策所需的依据从哪里来呢?应该都已经被“无聊”走了吧。

Joe的这几篇文章,以及我总结的时候,都刻意的详细列出了测试的过程和“运行性能”以外的结果。除了保持公正,客观之外,因为它们也是重要的数据。例如,我现在知道了在Windows上访问MySQL的驱动程序实现很差,而不同平台上访问PostgreSQL性能则相差无几。我知道,在Windows上进行大文件复制,受ACL影响性能较差。而如果关注Windows上运行PHP情况的朋友们则可以获得更多信息。

我不知道是不是国内技术人员的普遍水平较高,总是容易感觉国外的一些讨论无聊。例如有人讨论Java的原生类型时有人回复“是不是经济危机老美太闲了”。而上次有人和别人讨论ppt的缩写是怎么来的,就给软件最初的编写者写了一封英文信求证,老外非常详细解答了这个问题,还纠正了简称和缩写的差异。作者把信贴出来写了篇blog,原站上评论都是赞同。转帖评论齐刷刷都是骂该作者闲的蛋疼。

我不知道这算是学术态度的问题,还是只能说“对工作没有热情,对生活没有好奇”?在《原生类型》那片文章里,有朋友回复的好:

西方人这种看似无聊的争论才让他们达到了今天的高度,争论是不是一切量都可以用有理数表示,争论什么是运动,争论地球是宇宙的中心还是太阳是宇宙的中心,争论撒旦是如何诞生的,争论行星是如何运行。而我们很只注重实用,所以无法达到西方在理论上的高度,永远只能等别人争论完了,出结果了。我们拿来用用,仅此而已。
不过,嫌外国人无聊的人,往往也是嫌国内没有技术含量的人。是不是很奇怪?

同样,Erlang之父Joe Armstrong写Why OO Sucks;Stephan Schmidt写Clojure vs Scala(上,下),Java平台语言Groovy创始人James Strachan认为Scala是Java未来的替代品,他和JRuby的核心维护者James Gosling、Charles Nutter对Scala vs. Java的话题讨论的不亦乐乎。这些都是在批评一个事物,或是在进行“语言比较”这一“无聊”的话题。那么他们是不是也都闲得慌了?

我在想,如果把他们的文章翻译过来,匿个名,或者让吉日嘎拉这样的“众矢之的”来发表,会不会被人指责不懂OO,不懂Java?您别说,我还真见过这样的事情,谁让国内翻译转载常常不留出处呢?

其实这又是个逻辑问题了,这近似于《常见逻辑谬误》一文提到“人身攻击及‘你也一样’”,也就是指并不关心问题本身,而是把论据转移到“对方”身上。其实,一个命题是否正确,和它是由哪个人提出的有联系吗?我们一直指责某些人“屁股决定脑袋”,可别人真的用脑袋说话了,我们每次还是盯着别人的屁股看。

如果用博客园里常见的现象就是,如果一个人在说比较微软技术和其他技术,而“恰好”那人又在说微软好话,又“恰好”那人是MVP。那么好,肯定会出现许多人说MVP是微软的托。我承认,有些MVP因为个人利益而会作微软的托。例如您现在在Google上搜索“MVP TFS”的第一条便是一则不光彩的事件。Ben Scheirman在一个TFS的MVP博客里回复说“即使有钱,也会用免费工具,因为更好用”,结果这条回复被删除了。对方私下写信说,这是因为他在用TFS咨询赚钱。

这不正说明MVP是托吗?不过这显然是MVP的个人行为,而不是MVP的群体做法。原因很简单,因为Ben自己也是个MVP,所以现在是“一个MVP说微软产品不好,其回复被另一个MVP删除了”。那么您说,MVP是否是微软的托?还有,您说我是不是微软的托?

同样道理,Oracle认证工程师说Oracle好,Rails爱好者说Rails好,是不是都是托呢?开源爱好者是不是开源的托?我还是认为,优秀的技术人员一定是有信仰的,也是有倾向性的。但是,他们的说得东西本身是否正确,并不以他们的倾向性而转移,那些东西的正确性是客观确定的。

我认为,如果社区要蓬勃发展,就要接受这种倾向性,并尽力保持客观的头脑,经常“换一种方式想问题”。我们要的不是和谐,而是争论,对客观事物的争论,而不是对个人的人身攻击。我认为,这方面我们做的还很不够,要继续努力。

【编辑推荐】

  1. 专访微软MVP衣明志:走进ASP.NET MVC 2框架开发
  2. ASP.NET 4中的SEO改进
  3. ASP.NET专家访谈之三:学习ASP.NET的捷径
  4. 详解ASP.NET MVC 2自定义验证
  5. 详解ASP.NET MVC对表进行通用的增删改
  6. 使用NetBeans和Eclipse开发PHP应用程序
  7. Java、.Net、PHP、Ruby优劣势概览
  8. PHP开发者究竟需不需要Silverlight ?
  9. 揭示PHP成功背后的秘密:PHP创始人访谈录
  10. 用PHP校验EMAIL地址的正确方法
责任编辑:彭凡 来源: 博客园
相关推荐

2009-07-28 14:10:14

2009-07-28 15:04:34

PHP ASP.NET

2011-09-22 10:58:56

ASP.NET

2009-07-29 17:29:46

ASP与ASP.NET

2009-07-28 14:30:35

ASP.NET JSP

2009-07-24 15:47:35

ASP.NET与ASP

2009-12-02 09:07:45

ASP.NET 4.0

2009-09-16 09:14:46

ASP.NETPHP

2009-07-22 17:45:35

ASP.NET教程

2009-07-28 17:17:19

ASP.NET概述

2009-08-03 14:22:33

什么是ASP.NET

2009-07-27 10:22:43

ASP.NET Dro

2009-09-18 19:00:01

2010-03-03 17:12:56

Ubuntu ASP.

2009-12-14 10:03:16

ASP.NET 2.0

2009-07-27 12:22:03

ASP.NET和ASPASP.NET入门教程

2010-07-28 14:11:49

Flexasp.net

2009-07-29 10:56:54

ASP.NET构架与安

2009-07-29 09:38:06

Web开发ASP.NET

2009-07-27 10:35:33

TypeConvertASP.NET
点赞
收藏

51CTO技术栈公众号