大型系统上PHP令人不爽的九大原因

我在过去的四年里一直致力于PHP应用的开发。PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。
  下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。

  1. 对递归的不良支持

  递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序(quicksort)。不幸的是,PHP并不擅长递归。Zeev,一个PHP开发人员,说道:“PHP 4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。”见bug 1901。这是一个很不好的借口。每一个编程语言都应该提供良好的递归支持。

  2. 许多PHP模块都不是线程安全的

  在几年前,Apache发布了Web服务器的2.0版。这个版本支持多线程模式,在这个模式下,软件一个一部分可以同时运行多个。PHP的发明者说PHP的核心是线程安全的,但是非核心模块不一定是。但是十次有九次,你想要在PHP脚本中使用这种模块,但这又使你的脚本不能合适Apache的多线程模式。这也是为什么PHP小组不推荐在Apache 2 的多线程模式下运行PHP。不良的多线程模式支持使PHP常被认为是Apache 2依然不流行的原因之一。

  请阅读这篇讨论: Slashdot: Sites Rejecting Apache 2?.

  3. PHP 由于商业原因而不健全

  通过使用缓存,PHP的性能可以陡增500%[见基准测试]。那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者,它在销售自己的Zend Accelerator,所以当然,他们不想抛弃自己的商业产品这块肥肉。

  但是有另一个可选择的: APC. (Zend后来推出Zend Optimizer,免费的加速器——译者)

  4. 没有命名空间

  设想某个人制作了一个PHP模块用来阅读文件。模块中一个函数叫做read。然后另一个人的模块可以读取网页的,同样包含一个函数read。然后我们就无法同时使用这两个模块了,因为PHP不知道你要用哪个函数。 但是有一个很简单的解决方法,那就是命名空间。曾经有人建议PHP5加入这个特性,但不幸得是他没有这么做。现在,没有命名空间,每个函数都必须加上模块名作为前缀,来避免名称冲突。这导致了函数名恐怖得长,例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解。

  5. 不标准的日期格式字符

  很多程序员对 日期格式字符 都很熟悉,它是从UNIX和C语言中来的。其他一些编程语言采用了这个标准,但是很奇怪的,PHP有它自己的一套完全不兼容的日期格式字符。在C中,“%j”表示一年中的当天,在PHP中他表示一个月中的当天。然而使事情更混乱的是:Smarty (一个很流行的PHP模版引擎)的 strftime 函数和 date_format 函数,却使用了C/UNIX的格式化字符。

  6. 混乱的许可证

  你也许认为PHP是免费的,所有的在手册中提到的PHP模块也是免费的。错了!例如,如果你想在PHP中生成PDF文件,你会在手册中发现两个模块:PDF 和 ClibPDF。但是这两个都是有商业许可证的。所以,你所使用的每个模块,你都要确保你同意他的许可证。

  7. 不一致的函数命名规则

  有些函数名称是有多个单词组成的。一般有三种单词组合的习惯:

  直接拼接:getnumberoffiles
  用下划线分开:get_number_of_files
  骆驼法则:getNumberOfFiles

  大部分语言选择其中一中。但是PHP都用到了。

  例如,你想要把一些特殊字符转换成HTML实体,你会使用函数htmlentities (直接拼接单词)。如果你要使用相反的功能,你要用到它的小弟弟html_entity_decode。由于某些特殊的原因,这个函数名是由下划线分隔单词。怎么能这样呢?你知道有一个函数叫strpad。或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误。函数是不分大小写的,所以对于PHP来说rawurldecode 和RawUrlDecode之间没有什么区别。这也很糟糕,因为两个都使用到了同时他们看上去还不一样,混淆了阅读者。

  8. 魔法引用的地狱

  魔法引用(Magic quote)可以保护PHP脚本免受SQL注入攻击。这很好。但是出于某些原因,你可以在php.ini中关闭这个配置。所以你如果要写出一个有弹性的脚本,你总要检查魔法引用是开启还是关闭。这样一个“特性”应该让编程更简单,而事实上变得更复杂了。

  9. 缺少标准框架

  一个成长中的网站没有一个整体框架,最终会变成维护的噩梦。一个框架可以让很多工作变得简单。现在最流行的框架模型时MVC-模型,在其中表现层、业务逻辑和数据库访问都分离开了。

  很多PHP网站不使用MVC-模型。他们甚至没有一个框架。甚至现在有一些PHP框架同时你都可以自己写一个,关于PHP的文章和手册没有提高框架的一个字。同时JSP-开发人员使用像Struts的框架、ASP开发人员使用.Net,看起来好像这些概念都广泛被PHP开发人员所了解。这就说明了PHP实际上到底是多专业。

  总结

  什么问题?

  对于非常小的项目,它可以是一个十分符合人意的编程语言。但是对于较大的和更为复杂的项目,PHP就显出他的薄弱了。当你不断地摸索之后,你会发现我提到的某些问题的解决方案。所以,当解决方案已知之后,为什么不能修正他呢?另外为什么这些修补不在手册中提到呢? 一个开源的语言十分流行是一件好事。但不幸得是,它不是一个伟大的语言。我希望所有的问题能有一天得到解决(也许在PHP6?),然后我们就将拥有一个开源语言,他既开源,又好用。

  到现在,当你要启动一个多于5个脚本页面的项目的时候,你最好考虑C#/ASP.Net 或者 Java/JSP或者也许Python同样是一个更好的选择。

时间: 2024-10-28 22:38:38

大型系统上PHP令人不爽的九大原因的相关文章

位 机器 传输-32位系统上最大支持的传输是多大?

问题描述 32位系统上最大支持的传输是多大? 32位机器上最大支持的传输是多大?64位机器上上最大支持的传输是多大?一次传送的文件是多大 解决方案 这个没有关系,但是你的文件系统会决定单个文件的最大值,windows的FAT32/NTFS或EXT3.4等都不一样. 解决方案二: 32位和64位在支持文件传输方面毫无区别.如果你使用的是NTFS这样的文件系统,单个文件可以达到2TB,或者说是2048GB. 解决方案三: "电脑系统硬盘的最大限制",没有这种限制,GPT分区可以支持更大的磁

cjff-怎样在安卓系统上自己编一个APP应用

问题描述 怎样在安卓系统上自己编一个APP应用 求大神指教.!!,!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!需要哪些准备工作!???求解答 解决方案 有技术的自己去学Android,自己写代码,自己开发没技术的可以去网上,网上有些网站可以帮你做APP 解决方案二: 在pc上编译吧.用android studio这个软件. 解决方案三: 先配置好java环境,然后看你是选择用eclipse还是AS开发喽(建议使用AS,因为ec已经停止更新了)网站尽量去看国外的1.w

WinXP系统下那些令人揪心的错误代码

  虽然WinXP已经推出了系统操作舞台,没有技术的支持,没有补丁的更新,但是还有些用户仍然坚守在WinXP系统的阵地上.为了满足这部分用户的需求,下面小编就和大家来分享一下windowsXP系统下经常遇到的那些错误代码汇总,方便用户有针对性地解决这些故障. 0 0x0000 操作成功完成 1 0x0001 函数不正确 2 0x0002 系统找不到指定的文件 3 0x0003 系统找不到指定的路径 4 0x0004 系统无法打开文件 5 0x0005 拒绝访问 6 0x0006 句柄无效 7 0

中国邮政:核心系统上云,承载包裹洪峰

中国邮政:核心系统上云,承载包裹洪峰 "云栖奖"获奖人:中国邮政集团信息技术部总经理石纯斌 作者:阿里云研究中心田丰      中国邮政是关乎民生的大型国有企业,依法经营各项邮政业务,承担邮政普遍服务义务,在全国各省.自治区.直辖市.各地市.县设置邮政分公司,主要经营业务包括国内和国际信函寄递业务.包裹快递业务.报刊图书等出版物发行业务.邮票发行业务.邮政汇兑业务.机要通信业务.邮政金融业务.邮政物流业务.电子商务业务.各类邮政代理业务与国家规定开办的其他业务.作为世界500强排名第1

Bashware攻击:在Windows系统上运行Linux恶意软件

本文讲的是Bashware攻击:在Windows系统上运行Linux恶意软件, 近日,据外媒报道称,安全专家最新发现了一种惊人的攻击技术,名为"Bashware"攻击,利用该技术,攻击者可以隐藏恶意软件,即便是主流的安全产品(包括下一代防病毒软件.防勒索软件等)也无法检测出. 2016年3月,微软公司宣布将Windows Subsystem for Linux(简称WSL,指适用于Linux的Windows子系统)作为一项Beta特性添加至2016年8月发布的Windows 10周年更

中大型系统架构组合之EF4.1+ASP.NET MVC+JQuery

EF4.1已经推出有一段时间了,它给人的第一吸引力就是比LINQ TO SQL更加适合大型项目,它的封装更加紧密,操作也更加灵活,而且弥补了LINQ To SQL的最大不足,可以支持多种数据库.   EF4.1+ASP.NET MVC+JQuery 第一先说一下EF4.1: 我们数据层OR/Mapping采用EF4.1来实现数据的持久化 我们必须要对EF4.1进行一个封装,把对数据的操作限制在DATA层,不能向上一层暴露太多实现的细节,这样作是安全的,层次分明的. 对数据操作有一个泛型接口来实现

无法读取此系统上以前注册的服务器的列表。请在“已注册的服务器”窗口中重新注册您的服务器

环境: 服务器系统: 数据库版本:Microsoft SQL Server 2008 R2 错误提示如下图: 截图来自:点击打开链接 详细错误信息: 有关调用实时(JIT)调试而不是此对话框的详细信息, 请参见此消息的结尾. ************** 异常文本 ************** Microsoft.SqlServer.Management.RegisteredServers.RegisteredServerException: 无法读取此系统上以前注册的服务器的列表.请在"已注册

“无法启动承载网络连到系统上的设备没有发挥作用”怎么办

  [背景介绍] 我用的电脑是Lenovo ThinkPad E420,操作系统版本为:Windows 7 家庭普通版 SP1,处理器为:英特尔酷睿 i5-2450M CPU @ 2.50GHz,内存为:4G. [期望结果] 用该笔记本的无线网卡作为 无线路由器(即 实现wifi功能),便于没有当前没有无线路由器的环境下能够共享网络,同时上网. [操作方法] 在"开始"按钮的"搜索程序和文件"栏输入 cmd ,然后右键显示出来的 "cmd程序"并

ssh linux-从本机往虚拟机(linux系统)上传东西

问题描述 从本机往虚拟机(linux系统)上传东西 遇到一个特别匪夷所思的问题,本机安装了虚拟机,想用SecureCRT或WinSCP软件通过SSH协议把本机的JAR包上传到虚拟机,可就是传不上去,上传过程中软件如同死机一样没有反映.但上传word文档(小文件)就能传上去. 同事用他们的电脑用同样的方式连我的虚拟机就可以传我传不上的文件,请求下牛人们这是怎么回事,百思不得其解? 解决方案 是不是防火墙什么的过滤掉了啊?我猜测 解决方案二: 是不是本地杀毒软件拦截