• 1
  • 2
  • 3
  • 4
  • 5
阿里云应用开发 首 页  »  帮助中心  »  云服务器  »  阿里云应用开发
关于用云和NoSQL扩展PHP应用的介绍
发布日期:2016-3-23 14:3:51
 

  关于用云和NoSQL扩展PHP应用的介绍

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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