可扩展性101:如何使用PHP设计可扩展的Web应用程序? - php

我正在构建一个Web应用程序,并且有几个快速问题。据我了解,最初构建应用程序时,您不必担心可扩展性,而仅在流量增加时才开始担心。但是,这是我的第一个Web应用程序,因此我不确定是否应该采用一种方法以临时方式设计事物,然后“修复”它们。我一直在阅读有关人们如何开始使用一个能在一两周内吸引数百万用户的应用程序的故事。不是我会遇到同样的情况,但我不禁要问,这些人是怎么做到的?

目前,我在Lunarpages上购买了一个共享托管帐户,这使我开始构建和测试该应用程序。但是,我有兴趣学习如何使用云(例如Amazon的EC2)以可伸缩的方式构建相同的应用程序。据我了解,我可以看到几个组成部分:

有一个负载平衡器,它首先接收请求,然后决定将每个请求路由到何处
然后,该请求由服务器副本处理,该服务器副本随后处理该请求并更新(如果需要)数据库,并将响应发送回客户端
如果出现类似的请求,则类似于memcached的缓存机制会进入图片并从缓存中返回对象
处理数据库复制的黑盒

具体来说,我正在尝试执行以下操作:

设置负载平衡器(我的作业显示HAProxy就是这样的负载平衡器之一)
设置复制,以便可以同步数据库
使用memcached
配置Apache以与多个Web服务器一起使用
对应用程序进行分区以使用Amazon EC2和Amazon S3(我的应用程序需要大量存储空间)
最后,在使用Amazon服务时如何避免烧伤自己?因为这只是一个学习阶段,所以我可能可以使用简单的负载均衡器和复制来处理2-3台服务器,但是直到我希望避免意外支付大量资金为止。

我能够找到有关各个主题的资源,但找不到从全局出发的东西。有人可以帮我开始吗?

参考方案

就个人而言,我认为您应该考虑应用程序最初的扩展方式-否则您将遇到问题。

我并不是说您首先需要将其构建为多服务器系统,但是如果您认为以后需要这样做,请立即注意。

以我的经验,这包括以下内容:

会议。除非您使用“粘性”负载平衡,否则您将不得不采用某种方式在服务器之间共享会话状态。这可能意味着将会话数据存储在共享存储或DB中。
文件上传和复制。如果允许用户上传文件,或者拥有允许您上传图像/文档的CMS,则它需要满足以下事实:这些文件也需要找到他们在群集中其他节点上的方式。但是,如果您采用了上述共享存储路径,则应该可以解决此问题。
数据库可伸缩性。如果使用的是传统的数据库服务器,则可能需要考虑如何在该级别上实现可伸缩性。这可能意味着对您的应用进行编码,因此您将一个连接字符串用于读取,将另一个连接字符串用于写入。然后,您可以自由地使用一个主节点来实现复制,该主节点可以处理级联更改的插入/更新操作,以只读处理大部分工作的节点。
中间件。您甚至可能想走实现某种面向​​消息的中间件解决方案的路线,以完全移交业务逻辑功能-这将为您将来如何扩展此业务逻辑层提供极大的灵活性。尽管起初这将是很多麻烦,并且并不会带来很多回报。

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP getallheaders替代 - php

我正在尝试从服务器上的apache切换到nginx。唯一的问题是我在PHP脚本中使用的getallheaders()函数,该函数不适用于Nginx。我已经尝试过用户在getallheaders函数上的php站点上提供的注释,但这并不返回所有请求标头。请告诉我如何解决这个问题。我真的想切换到Nginx。 参考方案 您仍然可以使用它,但是您必须像这里一样重新定义…

PHP mysqli获取查询返回的第一行的值 - php

我正在使用mysqli从数据库中获取某些数据。我正在使用的查询已设置为仅从数据库返回一行。有没有一种方法可以在不使用while循环的情况下获取该行的值?我知道一个while循环对于返回多于一行的行很有用,但是如果不需要while循环,我想避免这种情况,因为不必要的代码是不好的编程。 参考方案 是的-您可以使用:$row = $result->fetch…

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

更改默认的URL PHP - php

如何更改默认网址。例如www.example.com/index.php-> www.example.com现在,我要将其设置为www.example.com/test.php。我应该在php.ini中进行更改吗? 参考方案 假设您正在使用apache,则可以通过DirectoryIndex指令执行此操作。Check out the docs。