• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
用云与NoSQL扩展PHP应用
发布日期:2016-7-29 10:7:19

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

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

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

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

  1、PHP运行环境有多糟糕?

  Apache Web Server预派生模式(Prefork)是最常见的PHP运行环境,是指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应用无法利用这样的方式。

  在(在Unix/Linux服务器上,以netstat –na类型)运行PHP应用得时候,若检查Web服务器或数据库服务器上的活跃连接,你将看到在数据库间存在大量TIME_WAIT或者CLOSE_WAIT状态的连接。若改为在允许池化连接的运行环境上运行应用,你可看到处于ESTABLISHED状态的数量(根据数据库连接池规模)。它的本质是,因为并行模式的限制,导致PHP应用是一个位于数据库上的负载。

  其中的原因是什么呢?最初Linux不支持多线程的,仅仅支持子进程。Windows NT系的操作系统一直支持多线程,虽然与现代化的Linux原生多线程相比其要笨拙许多。所以其与Linux相比具有较大的优势。但不幸的是,没有人相信这些由微软资助的研究成果。

  为了在关系型数据库中扩展PHP,你需要切分你的数据。这意味着要用合理的方式将数据拆解。这可能意味着位于不同地理位置的客户需要访问不同的关系型数据库。当初正是由于所谓的“简单”和“免费”,你才会选择PHP。但当选择了PHP后,却将不得不面对大量错综复杂的东西。

  2、云和NoSQL:游戏规则颠覆者

  在云计算模式中,若你能换一个配备自动分区(autoshard),并能够平衡每个节点连接的数据库,那么PHP能进行完美地扩展。你能在多个数据库服务器中进行平衡,而不是创建一系列与一台或者两台机器相连的非池化连接。

  越来越多的Web服务器限制了数据库客户端缺乏连接池化所产生的影响。更多的数据库节点与分区减少了服务器节点的影响。趋势已非常明显,转向NoSQL与云可以对现有运行环境进行扩展。PHP取得这样成功要归功于其经济性,这一特性可能会促使它在云上取得更大的成功,不用再像以往那样,要对PHP线程安全进行修订。


  图1

  总的来说,云和NoSQL相结合所产生的优势缓和了这些矛盾,或者是让应用可更容易地被部署,这对阿里云未来的发展也是一个很好的建议。这意味着只要有一个完善的NoSQL方案与一个合理的云部署方案,我们或许能雇佣离岸的PHP程序员团队,让其转向NoSQL数据库。