您的位置: 网界网 > 周报全文 > 正文

[周报全文]用云和NoSQL扩展PHP应用

2012年06月26日 14:42:59 | 作者:CNW.com.cn | 来源:网界网 | 查看本文手机版

摘要:作为最流行的Web应用语言,PHP正在被繁重的负载所压垮,除非你选择云扩展和NoSQL后台。

标签
扩展
PHP
云计算
NoSQL

PHP和传统关系型数据库的强大之处在于它们能够让初级开发者快速找出应用的主要特征。但不幸的是,PHP所使用的默认运行环境混乱,并且无法扩展

可能有很多人并不在意PHP的可维护性。他们的PHP应用是抛弃型的,其负载繁重,并且常常并行运行。例如,曾经有一家公司开发了一款使用甲骨文后台的PHP营销应用,客户可以通过这个应用购买商品,并用“点数”换取某款在线游戏的一些功能。这个应用一直运营良好,但当用户数量达到了数百万之后局面就改变了。

事实是,如果你有足够的服务器和充足的数据库服务器,那么不会出现什么问题。但是由于PHP 的Web应用在顶层,关系型数据库无法以出色的费效比(投入产出比)进行扩展,提供优异的读写性能。实践证明,应对这一问题的解决方案是:云与NoSQL的综合运用。云基础设施让我们能够拥有充足的服务器,NoSQL数据库让我们能够更加高效地分享数据。不过在这里,首先让我们看看PHP运行环境如此混乱的根本原因。

PHP运行环境有多糟糕?

最常见的PHP运行环境是Apache Web Server“预派生”模式(Prefork),指Web服务器运行一系列独立的子进程,以支持并行请求。当你将这一并行特征与MySQL、PostgreSQL或甲骨文等传统关系型数据库结合在一起后,这样的选择就意味着非池化数据库连接,因为数据库连接池需要一个共享的内存空间。

另一方面,原生多线程有一个共享内存空间作为其主进程的一部分。而子进程没有一个共享内存空间,除非你使用一款名为“共享内存”(Shared memory)的操作系统,其速度无法与根据索引传递内存相媲美。此外,Apache Web Server的“预派生”模块并不支持使用共享内存。很多时候,PHP有可能与原生多线程共同运行,即员工模式。但是,其严重依赖你使用的模块,以及这些模块是否带有“线程安全”特性。

在使用关系型数据库时,PHP并行模式会对垂直扩展模式产生重要影响。尽管其能够打开数以千计的非共享并行连接,以连接MySQL或Oracle数据库,但是这对大量的并行请求具有负面冲击。典型的PHP应用(实际上任何Web应用),都是由以下逻辑所组成的:

request -> getData -> doStuff -> getMoreData -> doMoreStuff -> WriteData -> sendReponse

在此类代码中,有一个相对长的时间周期,期间应用实际上无法与数据库交互。另一个请求能够“共享”相同的数据库连接,前提是数据库连接能够被汇聚。自从PHP处理模式禁止了这一模式,你只能被迫做出决定:是为请求/响应循环的持续而保持连接,还是每次在应用执行时运行。

但是问题是其取决于打开的套接字连接的性能特点。TCP堆栈被用于防止先前连接生产的孤立数据包干扰新连接。这是保证TCP涵盖IP的一部分。TCP/IP的工作机制是让用户等待重新使用相同的套接字连接。因此,一秒钟内你能够打开的TCP套接字连接的数量受到了限制。摆脱这一限制的方法是,在多请求循环中重新使用连接。但是,PHP并行模式导致多数PHP应用无法利用这样的方式。

12
[责任编辑:孙可 sun_ke@cnw.com.cn]