【问题标题】:Handeling multi API Request through PHP通过 PHP 处理多 API 请求
【发布时间】:2014-05-08 17:20:31
【问题描述】:

我有一个接受用户发送的文件的基本 PHP 脚本。这段代码只是一个简单的 API,用户通过 POST 请求向我们发送文件。

我想知道如何让这个程序同时处理超过 3000 个用户发送文件?我需要使用线程吗?最好的解决方案是什么?

在用户网站上:(www.example.com)

 <form action="http://www.mywebsite.com/file.php" method="post" enctype="multipart/form-data">
Your Photo: <input type="file" name="photo" size="25" />
<input type="submit" name="submit" value="Submit" />
  </form>

这是我服务器上的代码(mywebsite.com)(file.php):

       //if they DID upload a file...
    if($_REQUEST['photo']['name'])
     {
//if no errors...
if(!$_REQUEST['photo']['error'])
{
    //now is the time to modify the future file name and validate the file
    $new_file_name = strtolower($_REQUEST['photo']['tmp_name']); //rename file
    if($_REQUEST['photo']['size'] > (1024000)) //can't be larger than 1 MB
    {
        $valid_file = false;
        $message = 'Oops!  Your file\'s size is to large.';
    }

    //if the file has passed the test
    if($valid_file)
    {
        //move it to where we want it to be
        move_uploaded_file($_REQUEST['photo']['tmp_name'], 'uploads/'.$new_file_name);
        $message = 'Congratulations!  Your file was accepted.';
    }
}
//if there is an error...
else
{
    //set that to be the returned message
    $message = 'Ooops!  Your upload triggered the following error:  '.$_REQUEST['photo']['error'];
}
    }

提前致谢

【问题讨论】:

  • 注意安全。该名称没有被正确清理,例如,我可以在文件前加上 ../ 并将文件(我想要的)放在我有权限的任何地方。您应该查看您的 php 设置、内存设置、网络服务器选择和设置以及硬件选择。
  • 是的,我明白你的意思了,谢谢Ronni,我可以稍后对其进行清理,我需要解决多个用户同时发送我的文件的问题,我该如何处理?
  • 您需要执行压力测试以查看您一次可以处理多少用户,并计划您如何处理峰值(本地或通过第三方,有很多类似这样的服务)值。可能您已经可以处理您想要(或不想要)的用户数量,但无论如何测试都会为您提供更好的指标。您还可以选择一个为您自动扩展的托管服务提供商。
  • 是的,我认为你是对的,我需要做压力测试,但我该怎么做呢?你有什么推荐给我吗
  • stackoverflow.com/questions/7492/… 或相关链接之一。另一种选择是一些可扩展的云托管。最后,有很多服务可以进行压力测试(第 3 方),例如 loader.io

标签: php php-5.3


【解决方案1】:

您不需要在 PHP 脚本中使用线程,因为这在网站上通常没有意义。根据网络服务器,它将确保负载在系统资源之间保持平衡。

每次有人访问 API 时,都会产生一个新的 php 进程,因此多个用户将能够同时使用它,因为网络服务器会处理线程。

正如 Ronni 的评论中提到的,您可能还想花一些时间保护 API 免受攻击,这将有效地允许用户覆盖您的文件之一。解决此问题的一个好方法是简单地为文件指定一个随机名称而不是原始名称。


有多种技术可以优化您的服务。您应该注意的一些事情是实际的网络服务器(nginx、apache、lighttpd、IIS 等)以及它们处理 PHP 文件的方式(例如 mod_php、php_fcgi、php-fpm)。

由于您将处理文件传输,因此您可能会遇到大量的网络流量和 I/O,您可能需要查看具有千兆位连接的服务器,在极端情况下使用固态驱动器或大型 RAID 配置。获取 VPS 或使用云实例通常是一个好主意,因为这些服务很容易扩展,在 VPS 上获取新硬件只需要重新启动,而专用服务器可能会在交换硬件时停机 15-30 分钟或您甚至可能不得不将所有东西移到另一台机器上。

在更极端的情况下,您可以考虑购买 IP 负载平衡器来平衡集群周围的负载,但这可能与同时传输的数量无关。

如果您对服务器软件或硬件有任何具体问题,您可以在https://serverfault.com/ 上创建一个新问题,这是服务器管理的 Stack Overflow 等效项。

至于压力测试,请查看this wikipedia page 上的一些工具。

【讨论】:

  • 太好了,所以基本上它取决于我的服务器,我需要做负载平衡,你知道做负载平衡的好资源吗?
  • @user3150060 我在回答中添加了更多细节:)
  • @user3150060 如果它解决了您的问题/是您问题的满意答案,请单击答案旁边的复选标记 :)
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 2020-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2019-11-01
  • 2015-09-25
相关资源
最近更新 更多