欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

微软对PHP支持的改进 及其它一些胡言乱语_PHP

程序员文章站 2024-02-14 20:15:22
...
这里有一份我觉得值得推荐给大家的幻灯片(下载链接)。这个幻灯片是不久前举办的WordCamp China 2009上微软王超群的演讲,演讲主题是《熟悉的陌生人:微软对PHP的新支持使WordPress在IIS7上雄起》。WordCamp是业界著名的PHP大会,不过我这里推荐这个幻灯片不是为了为了推广PHP,而是为了说明一些其他问题——当然也有关于技术的有价值的内容,这些您看了幻灯片和我的文章之后就会明白了。

对了,之前我已经在InfoQ上写了一篇新闻报道了这次事件。不过新闻归新闻,目的是客观说明情况而不是发表个人观点。不过博客是个人地盘,我就打算在此畅所欲言了。

说到PHP,可能最容易让人想起的就是著名的LAMP架构(Linux + Apache + MySQL + PHP),而这全开放的平台似乎和“封闭”的微软技术距离比较远。不过微软其实一直没有放弃对PHP的“追求”,这次演讲谈的就是微软在这方面的努力,以及取得的成果。我推荐这个幻灯片的主要原因之一,便是它写的非常有水平,尤其是开头一部分。在幻灯片一开始阐述了微软对待开源的态度,希望和PHP的同志们拉近一些距离:

微软对PHP支持的改进 及其它一些胡言乱语_PHP

嗯,就是这个观点:“微软已经不是当年的微软了”,它变了,变得怎么样了呢?变得拥抱开源了:“开源的朋友们,不要看到“微软”两个字就心生厌恶,来,抱一个”。此外还引用了微软首席软件架构师Ray Ozzie(如果我没有认错的话)的言论:

I think any company these days, any technology provider, even Microsoft, has to find the right balance of being a contributor and user of open source.

我认为如今任何的公司及技术提供商,即使是微软,也必须在开源的用户和贡献者中寻找一个合适的平衡点。

如果说Ray Ozzie可能还是在“王婆卖瓜”的话,那么Linux创建者、开源领袖Linus Torvald最近发表的话语应该更有“参考价值”:

Oh, I’m a big believer in “technology over politics” 。.. There are “extremists” in the free software world, but that’s one major reason why I don’t call what I do “free software” any more. I don’t want to be associated with the people for whom it‟s about exclusion and hatred.

哦,我强烈认为“技术高于政治”……*软件世界中有一些“*者”,这也是我不再把我做的事情称作“*软件”的主要原因。我不想和那些有排斥和憎恶心态的人产生关系。

这句话在有人反对“微软为Linux提交GPL代码以提高Hyper-V的兼容性”时说的。Linus的意思再明确不过了:“技术就是就是技术,不要有门户之见”。顺便一提,开源软件(Open Source)和*软件(Free Software)是有很大区别的,不应该混为一谈。就我个人而言,我喜欢“开源”而不喜欢“*”。我也不喜欢FSF觉得微软永远是错的,不喜欢它搞某些东西的方式。不过肯定也有人喜欢,每个人都可以有自己的观点。

好像有点说歪了。其实我也不知道微软是不是只是“口头”上讨好开源界,但是我至少看出,微软在想办法证明自己——不管这个证明是不是有什么陷阱,有什么“不可告人的秘密”。在这方面,微软至少在摆事实,讲道理,而不是随口说“我就是拥抱开源”。我觉得,在中学里学写议论文的时候,大家都应该已经知道就被告知论述的基本方式是“摆事实”,“讲道理”。可是从平时讨论的时候,我却又觉得根本不是那么一回事情。说句得罪人的话,我觉得许多朋友缺乏必要的逻辑思维能力,会产生非常多的逻辑谬误出来,但是却都还坚持自己是正确的。搞到最后,吵起架来彼彼皆是。而且往往在这个时候,无数匿名兄弟就跳出来发挥自己的聪明才智,各种讽刺挖苦谩骂的奇思妙语一个接一个,令人宛如置身于天上“猫扑”,人间“天涯”。

其实坚持自己是正确的不要紧,我也喜欢坚持自己的意见,谁不希望自己是正确的呢?但是要拿出理论根据来。其实作为技术从业人员,在许多问题上拿出根据来非常简单,例如写一个程序便知泛型会不会降低性能。如果有些问题很难用数据说明问题(如数据获取太难),那么至少也要找出一些别人的看法来支持自己的观点。如果一味地“我认为”,“我觉得”效果自然就大打折扣了。因此,我现在也经常会有意地在文章中引用自己或其它的人的说法,至少可以让自己有“底气”一些,而不会感觉像是在扯淡。

我个人比较反感“光说不练”的人,我希望看到的不是“个人说法”,而是多个人的观点,或者是实际效果。例如前几天有个匿名朋友在我博客上留言,偏要坚持“静态方法的调用会阻塞其它线程访问”,我说“你试试看就知道了”,他也原样复制一遍发回给我,针锋相对,不屈不饶。不知道他最后是否认为他达到了论证“我在误导初学者,为自己的书作广告”的目的(我写过书吗?),至少我当时,既无奈,又窝火。

既然谈到了技术,那就再谈远一些。这位认为“静态方法的调用会阻塞其它线程访问”的朋友证明了他自己在某个方面学的有问题,而我前几天发表的Double Check文章中,有许多朋友提出“怎么能lock在一个实例字段上”,“应该lock在一个静态字段才能产生效果”。换句话说,在这些朋友看来,一个实例方法是不会产生线程安全问题的——虽然ASP.NET MVC框架的DefaultControllerFactory就出现了这样的毛病。这说明了在多线程开发方面,社区的整体意识还处于一个非常薄弱的程度——希望我这么说不会引起各位的不满。

此外,昨天我意识到原来很多朋友用了很久的for却无法写出其等价的while写法,又想起之前发现公司里的大部分同事不知道C#中使用@开头的字符串表示法中如何包含一个双引号。这应该都是基础中的基础,应该人人知道,不是吗?但事实就是让我感到惊讶,许多朋友认为自己不停地在学东西,ASP.NET MVC、Sliverlight,WPF一个一个地学,但是最后最普通的东西却不知道。结果工作找不好,薪水拿不高,最后一崩溃又开始叫嚷着这个行业没前途。那么,有没有想过换一种思路来学习,例如,不要随意轻视一些东西?

说到这里,我又想起其它一些事情,那就是我觉得如今社区里的“风气”出现了比较严重的问题。例如最近不止一次发生围攻面试者的“群体性事件”,每次有人发表面试对方的题目之后,就有大量朋友上前表示不满,对于简单的题目认为太基础了,考不出能力。对于困难的题目,就认为它太难,钻牛角尖,“又不是在招算法研究人员”。总之我发现,似乎只要是遇到了回答不出的问题,都会遭到许多人的反对。似乎社区中许多朋友都认为自己怀才不遇,“我来面试你,你也过不了”,都认为“千里马常有,而伯乐不常有”。有朋友问我,你面试别人时问些什么?我难以启齿啊,因为我问的往往也是那些问题,可是一下子就被鄙视了。其实没有什么东西是简单的,有时候问问题并不是要得到结果,而是想从中看出一些细节来,例如一个人的思考方式和深度——我问某某和某某在写法上的区别,不是在搞“茴香豆”,是由其他目的。不知您是否相信,我在面试时会让对方谈一下最喜欢的体育运动的规则?

最近似乎认为我“无聊”的朋友也多了起来,认为我写的东西没有什么实际意义,认为我写这些东西都是在“炫耀”。其实,我的文章都是源于实际工作中的想法,我认为对于实际工作是非常有帮助的。我不喜欢《XX编程三百例》式的文章,我认为那是“鱼”而不是“渔”。我不知道那些朋友希望我写什么样的文章才算有实际意义,但是我想最有意义的应该是提高您的能力,而正是如此,我认为您更应该关注我在成长过程中想到的这些问题。轻易鄙视这个鄙视那个,就好像鄙视面试者那样,这可不好。鄙视一个东西不要紧,但关键是,你思考了没有?不要鄙视了半天,但是到最后也不知道发生了什么事,盲目地忙碌。

思考很重要,例如换一种思考方式就会得到不同凡响的结果。至少,这也是锻炼逻辑的一种有效方式。想要验证自己想清楚了没,我认为最好的方式就是写一篇文章。如果您想明白了,一定能把它说清楚。反过来说也一样,如果您说不清楚,基本上就是因为您没有想明白。

说了好多,越扯越远,喝口水,回来继续吧。

PPT的正题自然是讲述微软在PHP平台上做出的努力和取得的成果,其中列举了之前与康盛创想合作进行的性能评估结果,证明在Windows Server 2008 + IIS上运行PHP,从平均相应时间,每秒处理的请求数,以及数据吞吐量等多方便均显著优于Linux + Apache的托管方式。当然,这个结果也受到了一些质疑,例如为什么在Apache中使用了mod_php而不是在大多数情况下性能更好的FastCGI。关于这点我没有测试过,我不清楚,不过这并不要紧。我只想说:Windows的性能真的不差。

微软对PHP支持的改进 及其它一些胡言乱语_PHP

这也是PPT的截图之一。从中可以看出IIS 7的吞吐量完全可以达到静态文件请求20K,ASP.NET请求5K RPS(每秒请求数)的吞吐量。这是100%的事实,我可以担保,因为在我07年在微软的时候,曾经在自己工作用的普通 32位workstation上试验过,请求静态文件轻松超过了10K。算上IIS 7的性能增强,以及测试机的性能因素,得到上图的结果完全没有问题。至于ASP.NET动态请求的性能,5000多完全就是一个没有意义的数字了——我不是说它假,我只是说它没有意义。因为对于动态请求来说,纯粹比这种“空请求”的吞吐量,几乎没有任何实际参考价值。因为,我们有其它的性能瓶颈,根本达不到IIS本身的性能限制。

对于普通Web应用程序来说,如果在实现上没有大的问题,几乎不会让Web服务器(指IIS这种,不是指“机器”)成为性能瓶颈。性能瓶颈往往是在外部服务器调用,或者外部数据访问上。例如耗时的SQL查询一多,应用程序整体性能自然就下来了。因此,业界最为热烈的讨论往往是基于“缓存”和各种数据存储方式的,因为到目前为止它们都是最有可能成为性能瓶颈的。对于Web服务器本身性能的讨论也不是没有,只是相对就少很多了,要有,大部分也是基于静态请求的性能比较。

对于Web 2.0的网站来说,由于变化太多几乎无法生成静态页,因此这样的Web应用程序在一台机器上的吞吐量根本达不到5K,即时是1K也几乎不可能达到。在一台目前普通配置的服务器上,如果可以达到每秒100多的动态请求,基本上已经做的相当不错了,甚至50、60多也已经基本“够意思”了——像当年豆瓣鬼神般的5、600(如果我没有记错的话)几乎难以再现了。不过100 RPS也已经是一个很了不起的数字了,如果按6小时的密集请求来算,这样一个动态站点的日访问量是多少呢?

当然,Windows不是没有性能问题,我只是说在IIS,Web开发等方面不会出现性能问题。有人说Windows的文件系统,也就是NTFS的性能很差,尤其是在处理零碎地文件时候。这我也有所耳闻,平时也有类似的感觉,但是没有经过这方面的实践,所以并无法说出准确的结论。不过真的性能差,也要去好好了解它,这样我们就可以设法避免一些薄弱的环节。随意举个例子,我们可以优化自己程序的存储方式,尽量读取连续的数据,让文件系统的性能问题可以缓解一下。SQL Server不也是在NTFS上构建出高效数据应用的吗?

使用Windows系统的另外的问题,也是被人提及很多次的问题,便是授权协议。Linux使用是不要钱的,而Windows是要花钱买的,这个自然应该算入成本。不过在我看来,其实Windows并不贵。为什么呢?您可以去Dell的网站上看一下一台预装了Windows Server的服务器的价格,一个Web Edition的Windows Server操作系统的价格大约是3000多元,这也就相当于一个普通程序员1个月的薪水而已,更何况操作系统可以算作是一次性投资。对于一个公司来说,每天开一次门就相当于几千几万的钱花出去了,购买一个Web Edition的Windows Server价钱根本算不了什么。至于开发成本,这是一个太“虚”的东西,暂时就不讨论了吧——我想,应该也没有什么理由可以有力证明使用ASP.NET会加大开发成本。

事实上,Web Edition已经足够部署ASP.NET应用程序了,Enterprise Edition自然要贵上十几倍甚至更多,但是您根本用不着。用盗版操作系统时带来的坏习惯“要用就用最好的”,在产品环境中一定要改一下。哦,对了,微软对于年收入低于100万的公司,或是非盈利机构都有非常大的折扣,甚至免费的策略(如BizSpark计划)。您不应该错过。

因此我认为,在Windows平台上使用ASP.NET,是一个非常合适的Web应用程序开发/运行平台。即时是对于创业型小公司来说,我也会选择使用Windows + ASP.NET。

但是……微软平台上的授权价格并非总是个可以忽视的问题。因为SQL Server实在是太贵了,而免费的Express版本是不可以用于商业应用的。如果我们想要使用SQL Server,那么成本的确会哗哗地上升,尤其对于创业公司来说这是比不可忽视的支出(当然如果加入了BizSpark计划……)。因此可以这么说,运行ASP.NET的Windows很便宜,但是SQL Server,以及运行SQL Server的Windows会非常昂贵。因此,对于数据存储来说,我会选择Linux下的免费及开源的产品。而且我可以有更多的选择,无论是关系型数据库,键/值存储方式,还是现在慢慢再兴起的如MongoDB那样的无架构,文档型数据库,都可以合理组装使用。

所以我现在越来越推荐Windows + *nix的合作关系,至于在Windows和*unix项目的通讯问题上,其实丝毫不用担心。如今各个项目都是基于标准的通讯协议(如TCP/IP,甚至HTTP),使用通用的或自定义的格式进行数据交换的。对于一个Linux下的数据库来说,它根本不会关心与它连接的是Windows还是Linux,也不会关心发起调用的是.NET还是Java,Python,Ruby平台。大家根据协议办事即可。

那么为什么业界总是认为Windows性能差呢?原因可能是因为微软的“声誉”不太好,而业界声音最响,最为活跃的大都是开源工作者或*人士,他们自然会不遗余力地支持自己的环境——这很正常,优秀的程序员一定是有信仰的,我一直这么认为——当然也会产生一些不客观的FUD行为。还有便是,Windows进入服务器领域时间比较晚,而且在IIS 5那些年代时,Windows在服务器领域的表现的确不怎么好。因此,那时候留下的负面印象自然也会产生不好的影响。但是微软是在发展的,微软牛人非常多,微软研究院的论文年年占据各大会议相当比例,而微软的产品的质量也已经足够了得了。如果继续用10年前的印象来判断如今的微软是不正确的——当年微软系统在服务器这块没有丝毫占用率(几乎都是Unix,Oracle的天下),现在已经占据中小公司80-90%,世界五百强50%的份额,这还不够说明问题吗?

关于这点,作为Windows平台下的程序员,我们应该有足够的自信,管别人怎么“怀疑”我们呢。

对了,还有一个可能的原因是由于微软的技术太容易入门,导致给人不够“牛逼”的感觉。这也是没有必要的,就好比说,一个国家的初等教育水平高,能证明它的高等教育水准不行吗?这只是定位的问题,当然这也是微软的策略——但是这不是微软的错,也不是微软技术没有价值的证据。当然,作为Windows平台上的程序员,提高自己的能力是没有错的。不光没有错,是一定必须这么做的!

不过必须承认的是,Windows有个硬伤,就是您无法在上面捣鼓东西,例如换一个文件系统,改一改内核。如果你是热衷于这方面的Geek,那么自然不应该使用Windows。

最后,还是用PPT上的内容收尾吧。在这份PPT的末尾附有30多页的IIS Web应用程序配置最佳实践,是一个非常不错的参考,您一定要看一下。

就写到这里吧,虽然结尾有些仓促,但我真的已经很困了。