Home  >  Article  >  php教程  >  大型系统上PHP不称职的六个理由(拍砖激辩中)

大型系统上PHP不称职的六个理由(拍砖激辩中)

WBOY
WBOYOriginal
2016-06-06 19:56:11922browse

本文发出后,确实引起不少的争议。看来PHP的支持者不少

本文发出后,确实引起不少的争议。看来PHP的支持者不少啊。但是,从一个侧面来审视PHP,也未尝不可。

从php3到php4到PHP5,再到PHP6,PHP确实越来越完善,功能也更强大。PHP为一开放源码项目,其中包括可以简化程序的描述性语言引擎以及一个大的链接库,也有专门开发PHP的公司,如Zend就有销售PHP套装产品、程序撰写工具及技术支持服务。尤其是跨平台的使用特性将使它在linux平台大放异彩。可以直接使用java的类库,可以直接调用perl/c等语言写的程序增强了它的可扩展性。越来越成熟的MVC开发框架使它能适应企业级的大型应用开发。再加上它天生强大的数据库支持能力。确实博得了很多用户的喝彩!

不过,这里倒是想从侧面来看看PHP也许不称职的几个理由。

1.应用范围仍然有限

与Java相较,PHP可用范畴限制较多,它仅能用在网络服务器上,不像Java,同时可用在网络服务器、个人计算机、手机、芯片卡或其它装置。记得有个老友陈述放弃php的原因:“第一:每个变量前面要写一个$符号;   第二:因为不是编译执行的方式;  第三:面向对象的功能不强。”比如,php的oop运行一次就退出,下次还要继续重建o,继续继承....。注意是每一次请求,它不能利用上一次的结果,下一次用还要从头初始化。许多问题的根源还在于apache。

再一个:“可能目前php   IDE不是很好,给别人入门难的感觉。”尽管新版本增加了面向对象功能,但相比成熟的Java,仍然有许多待改进之处。以至于有人这么归纳: (1)缺乏广泛的使用,以至于微软也要和大家讨论PHP到ASP.Net的迁移。(2)缺乏大公司的支持,象IBM的开发中心开源项目首页上的6个标题中,PHP只有3个。 (3)缺乏重量级的应用,象Google和Yahoo用PHP(不是所有的产品)都是瞎玩。当然,我知道Taobao.com也是PHP做的。

2.调试还是不太方便

在apache上的进程工作模式。 apache处理每一个php请求,都要创建一个子进程,这样的话实现连接池比较困难了,进程间的数据共享一般只能通过文件,数据库什么的完成,各项开销比较大,当然速度并不低。

还是陈述一个网友的发言:“没有好的开发工具,调试起来过于复杂。虽然zend不错,但是哪里是VS的对手。没有强大的Visual 开发工具,换句话,如果有了,我绝对选择PHP。”这好像是和Java早期比较类似的一个情形。也许,在不远的未来,我们会看到很好的调试工具。问题是:现在还没有太称心的,尤其是大型系统上。

还有个问题,就是共享内存的使用,我就不知道为什么直接使用php操作共享内存就这么复杂,而且速度居然比直接操作磁盘文件还慢。

3.主流版本的安全漏洞百出

看一个最近的新闻,和Php pdflib扩展绕过open_basedir安全限制漏洞有关。受影响系统:PHP PHP 5.3.0。PHP所使用的PDFLib扩展没有正确的强制基础PHP配置指令,这允许攻击者绕过open_basedir限制在非授权位置写入文件。仅在多个用户可以创建和执行任意PHP脚本代码的共享托管配置中才会出现这个漏洞。在这种情况下,open_basedir限制应彼此隔离用户。

PHP V6 在添加一些新特性的同时,也删除了以前版本中的一些函数和特性。被删除的大部分东西,比如 register_globalssafe_mode,在当前的 PHP 中都被广泛认为是 “有漏洞的”,因为它们可能招致安全风险。当然,PHP的配置非常灵活,可以通过php.ini, httpd.conf, .htaccess文件(该目录必须设置了AllowOverride All或Options)进行设置,还可以在脚本程序里使用ini_set()及其他的特定的函数进行设置。通过phpinfo()和get_cfg_var()函数可以得到配置选项的各个值。

4.大型系统的稳定性与一种语言的风格

有人这么说(也是一个PHP读者的疑问):“大型系统还是用.net或者jsp吧,不是因为php不可靠,是因为开发php的人良莠不齐,而php的开发模式又不固定,以你问这问题的情况来看,如果是多人开发,你肯定控制不好。.net或者jsp相对来说比较容易控制,可以让程序结构清晰,二次开发或者更换程序员都不会有太大问题。”

老牌计算机作家Bruce Eckel也这么说:“你经常会发现很多使用PHP编写出的代码错误百出,但这些代码往往却被人们互相拷贝,却没有人去认真分析研究它们。这些代码通常是由那些习惯互相借鉴拷贝代码的程序员所编写,这些代码质量低劣的原因是这些程序员通常不习惯问为什么,不喜欢弄清楚原理,只管拿来就用。”为了让大家可信,我放出他的相片吧。

大型系统上PHP不称职的六个理由(拍砖激辩中) 

很自然,作为普通读者,会产生一个焦点问题:PHP到底有没有前途?你说有前途是把,再秀几点理由?

5.PHP的解释运行机制

也许有经验的PHP程序员最感到痛苦的地方是PHP的解释运行机制。这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空。以JSP为例,在JSP中,Java Bean的scope有四种有效值:Page、Application、Session、Request,分别对应页面、程序、会话、请求四种生存期。但在PHP中,只有Page一种生存期。

在PHP中,如果需要在页面之间共享数据,需要手动将变量保存到预定义的全局变量$GLOBALS或$_SESSION中。PHP会将这些变量保存在某个文件中,以便下次执行页面时读取。但是,这种方式存在着极大的限制,除了效率的低下外,它还无法保存引用外部资源的变量,例如文件、Socket、数据库连接等,而正是这些资源最需要被缓存。

这导致了许多高级的模式和技术无法使用。例如,即使是最简单的Singleton模式也无法在PHP中被应用。虽然可以使用PHP写出Singleton的代码,但是由于PHP中没有真正全局的static变量,所以每次页面被执行时,都会重新建立新的对象,这样也就完全失去了Singleton的意义。这也导致复杂的OR Mapping技术难以应用,因为没有对象的缓存机制,OR Mapping的开销已经使这种技术失去了意义。

6.前途未卜,开源的商业模式到底能撑多久?

对于从事PHP开发的同志们来说,Mysql的重要性是显而易见的。还是老牌计算机作家Bruce Eckel的一个观点:PHP主要是与数据库搭配使用,数据库来处理所有一致性问题,因此多数人只关心从数据库中存取数据,而不用再去必须考虑底层的问题。但是这个语言不仅仅可以处理与数据库交互的上层问题,同样也可以实现与文件系统之间交互的底层问题。我的感觉是,在PHP社区中多数人只关心如何得到一个好的结果,而没有多少人关心它的真正实现原理,因此才出现了这种错误的倾向。

再看一个新闻(2008-1-21 ):国外媒体今天发表分析文章称,Sun之所以斥资10亿美元收购开放源代码软件公司MySQL,主要是为了进军Web2.0软件市场。Sun周三宣布,该公司已经同MySQL达成最终协议,将以10亿美元收购这家开放源代码软件厂商。从交易价值来看,这是迄今为止开放源代码领域最大的交易,其规模甚至接近之前所有开放源代码交易的总和,包括红帽以3.26亿美元收购JBoss,Citrix以5亿美元收购XenSource,以及雅虎以3.5亿美元收购Zimbra。

在《Sun总裁博客:我们为什么收购MySQL》一文中,Sun总裁提出:除了要收购 MySQL,Sun 将提出面向 MySQL 市场的全球支持解决方案。我们将同时在社区和市场两方面注入资金 —— 以加速本行业由专属技术阶段向开放式网络平台阶段转化的进程。并认为:新创公司和网络公司的 CTO 不同意使用收费的非开源产品。他们需要也想要获取源代码以实现优化和快速解决问题(尽管他们乐于对其认为有价值的支持服务付费)。另一方面,更多传统 CIO 不同意使用不受商业关系背景支持的产品—— 因为他们更放心借 Sun 供应商之手来管理全球性业务和关键基础架构。

仔细分析一下吧。还是那句老话,你也许认为PHP是免费的,所有的在手册中提到的PHP模块也是免费的。但是,如同一个有生命力的产品一样,免费的东西,也许会有很多理念的不统一。

 

 

一个晚上,评论无数。反对的意见也不是不接纳,这里先展示一个老友的反驳意见:

  1.   面向对象不足  
  如果你使用过PHP 5的话,你就不会这样说了,你所想到的东西:访问权限(public/private)、继承、抽象类、接口、克隆、串行化、自动垃圾收集、静态成员、强大的异常处理...  
  可以说基本上常见的面向对象的东西都有了,不要以为php5很遥远,其实目前有很多人、很多项目都在使用PHP 5,你最好自己尝试一下看看。  
  建议参考:  
  http://www-128.ibm.com/developerworks/cn/opensource/os-phpobj/  
  http://www-128.ibm.com/developerworks/cn/opensource/os-advphpobj/  
  2.   变量名前面加   $   
  这个只能算是一个小问题,是PHP告诉大家这是PHP独特特征的地方,PHP不是Java,不是C++,它是从开源世界走出来的脚本语言,有了$,我觉得很亲切,很棒。  
  3.   不是编译执行  
  这个当然比不上CGI了,如果你用C写CGI的化,但是我想,PHP的执行速度不会比JSP差到哪里去的吧,也不会比ASP慢。另外,Zend有相关的商业工具来作类似于编译的工作。  
  4.   PHP太灵活  
  我想,谁都比较喜欢能够自由控制的语言,这样才能体现程序员的技术,当然,灵活也会带来很多问题,比如很容易出错,而且不容易找到,对于初学者的代码可能会写的很糟糕。但是,这就是PHP呀,这才是我们心目中开源的、自由的、高效的PHP  
  5.   没有MVC框架  
  呵呵,如果你使用过   phpCake、Zend   frame的话,我想你不会说没有框架,只是成熟程度的问题,其实Cake和Zend   frame都非常棒,当然,另外一些象   Prado、phpMVC等框架也是值得一提的  
  参考:http://framework.zend.com/、http://cakephp.org/  
  6.   没有好的IDE  
  PHP的特点就是简单,容易开发,你可以使用记事本,vi,也可以使用Editplus、UE,同样也可以使用Nu、Zend等等工具,选择很大,其实不要跟VS2003比较,因为他们不是一个东西,VS是个统一开发平台,PHP只是一门脚本语言,使用Zend已经足够了,至少我是这么觉得。  
  7.   扩展不容易写  
  呵呵,我想ASP的com也不是那么好写的,JSP里面的JavaBeans也不是那么简单的,没有很容易的事情,简单或者复杂程度取决于你对一项事务的认识程度。如果你C学的好,你就不会觉得扩展不好写。当然,相对来说,用C写PHP扩展是稍微有点复杂,不过,因为复杂,所以你才能靠写扩展拿高薪呀,呵呵。  
  建议参考:《PHP程序设计》第十四章[扩展PHP]  
  8.   调试不方便  
  我不知道怎样算是调试方便,如果你使用过ruby、perl写cgi,你会知道什么是调试不方便。如果你喜欢写C,使用GDB之类的命令行工具,你会知道什么是不方便。当然了,相对来说,你使用好的IDE,调试的工作量会减少很多的。 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn