在Sharded服务器配置中上传PHP文件


PHP File Upload in Sharded Server Configuration

我们使用多个服务器来处理传入的web请求,这些请求以循环方式进行负载平衡。我遇到了一个问题,我不知道该怎么解决。

使用AJAX(qqFileUploader),我正在上传一个文件。默认情况下,它会进入/tmp文件夹,这很好。问题是,当我尝试检索该文件时,该检索请求将由中没有我上传的文件的下一个服务器处理。如果我一次又一次地重复请求,它最终会到达存储文件的原始服务器(通过循环负载平衡),然后我可以打开它。显然,这不是一个好的解决方案。

这是本质上的代码:http://jsfiddle.net/Ap27Z/.为了简洁起见,我去掉了一些。您将看到上传器对象对PHP文件进行调用以进行文件上传,然后在文件上传完成后,对脚本进行另一个AJAX调用以处理.csv文件。这就是循环赛过程中迷失的地方。

我在SO上读到了一些关于将文件上传到内存的问题,目前看来这基本上是不可行的。有没有其他选项可以用来上传文件并在同一请求中处理所有文件?

这类问题的经典解决方案是在负载均衡器上使用粘性会话。这对你来说可能不是一个好的解决方案,因为它会修改你的整个设置来解决一个小问题。

我建议为每台机器添加一个子域前缀,例如上传到www.example.com,然后为每台服务器分配一个额外的子域www1.example.com、www2.example.com,这些子域总是直接传递给该服务器,而不是循环DNS。

作为成功结果的一部分,您可以传回指向确切服务器的服务器名称,而不是负载平衡名称,然后所有后续引用上载数据的Ajax调用都使用该服务器特定域名,而不是通用负载平衡域名。

有没有其他选项可以用来上传文件并处理所有文件在同一个请求中?

当然,为什么不呢?处理数据POST的代码可以做任何你想做的事情。

您的问题(至少)有两种解决方案:

  1. 您更改了负载平衡

有几个负载平衡代理支持会话亲和性,也称为"粘性会话"。这意味着用户在一个会话中总是获得相同的服务器。

两个可以这样操作的程序是HAProxy(这里是SO上的相关问题)和带有custon模块的nginx(这里是教程)。

  1. 您可以确定文件的位置

另一种选择是将存储文件的位置更改为所有服务器都可以通过同一位置访问的某个位置。例如,这可以是NFS装载或数据库(文件存储为BLOBS)。这样,哪个服务器处理请求并不重要,因为它们都可以访问该文件。