【问题标题】:Image upload performance issue with Amazon S3 and jqueryfileupload pluginAmazon S3 和 jqueryfileupload 插件的图像上传性能问题
【发布时间】:2013-07-10 18:21:47
【问题描述】:


我有另一个与亚马逊有关的问题,它与文件上传有关。我正在使用 jqueryFileUpload 和亚马逊 API 将文件上传到亚马逊 S3。我已成功上传它,但它涉及一个技巧。
我必须将图像存储在我的服务器上,然后使用 S3 的putObjectFile 方法将其从那里移动到 S3。现在该插件具有裁剪/调整图像大小的强大功能,我一直在使用它们。现在当我集成使用 AWS 的插件,我在上传时面临 性能问题。上传时间比正常情况要长,这引发了我们使用 AWS S3 而非传统方式的问题。
我必须对我的 UploadHandler.php 文件进行更改才能使其正常工作。这些是所做的更改。我在 735 到 750 行

的文件中添加了 AWS 上传代码的一部分
     $bucket = "elasticbeanstalk-2-66938761981";
     $s3 = new S3(awsAccessKey, awsSecretKey);
     $response = $s3->putObjectFile($file_path,$bucket,$file->name,S3::ACL_PUBLIC_READ);
     $thumbResponse = $s3->putObjectFile('files/thumbnail/'.$file->name,$bucket,'images/'.$file->name,S3::ACL_PUBLIC_READ);
     //echo $response;
     //echo $thumbResponse;
     if ($response==1) {
        //echo 'HERER enter!!';
     } else {
          $file->error = "<strong>Something went wrong while uploading your file... sorry.</strong>";
     }
     return $file; 

Here 是 git 上 s3 类的链接。 正常上传到我当前的服务器(不是亚马逊),在 15 秒 内上传相同的图像,但在亚马逊 S3 上大约需要 23 秒,我无法弄清楚一个更好的解决方案。我必须在上传到 S3 之前将图像存储在我的服务器上,因为我不确定是否可以即时处理并直接上传到 S3。
任何人都可以建议解决问题的正确方法?是否可以在内存中将图像调整为不同大小并直接上传到 S3,从而避免将其保存到我们的服务器的开销?如果可以,任何人都可以指导我朝着正确的方向前进吗?
感谢您的关注。

【问题讨论】:

  • 您是否在 Amazon 上使用 EC2 实例?如果是,它是否与您的 S3 存储桶位于同一区域?哪种实例类型?我以类似的方式处理图像大小调整,即使是大图像也不需要 23 秒。
  • @user1091949 他们在同一地区美国东部。带宽可能是个问题!对我来说,它的变量在 1mbps-2mbps 之间。你说什么?
  • 图片有多大?另外,23 秒是从您的计算机传输的时间长度加上调整大小所需的时间吗?
  • 大小可能会有所不同...我输入的数字适用于最大 2 mb 及左右的图像。但应用程序对大小没有限制(可能我们稍后会在 10-12 左右mb) 因为它现在正在开发中。

标签: php jquery amazon-web-services amazon-s3 jquery-file-upload


【解决方案1】:

我相信大约 8 秒是这里创建不同大小的图像版本的开销。 您可以采取不同的方法来消除上传时调整大小的开销。基本思想是允许上传脚本完成执行并返回响应,并将调整大小的过程作为单独的脚本进行。

我喜欢建议以下方法: 方法1.不要在上传过程中调整大小!仅在第一次请求时即时创建调整大小的版本,并缓存生成的图像以直接为以后的请求提供服务。我在 Stackoverflow 的一些 other threads 中看到了 Amazon CloudFront 作为解决方案的一些提及。

方法 2. 在上传原始图像后,调用用于创建调整大小版本的代码作为单独的异步请求。可用的缩放版本将有所延迟。因此,编写必要的代码以在网站中显示一些占位符图像,直到缩放版本可用。您必须想办法确定缩放版本是否可用(例如检查文件是否存在,或在数据库中设置一些标志)。如果您想尝试一下making asynchronous cURL requests are suggested here 的一些方法。

我认为这两种方法的复杂程度相同。

其他一些方法被建议为answers for this other question

【讨论】:

  • 我将研究这两种方法 rineez。第一种看起来更合适,但需要 POC 来检查使用情况。实际上我要求用户从一组定义的尺寸中选择一个尺寸,例如 original,1024x768,800x600,100x100然后我显示图像。所以我必须在用户选择选项之前让它们准备好。这就是我所做的,我在用户选择之前创建版本,当他选择时它们很容易出现。
  • This 问题说明了图像大小调整和内存表示,但我不知道如何在我的场景中实现它。
猜你喜欢
  • 2019-09-20
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-10
  • 2011-02-02
  • 1970-01-01
相关资源
最近更新 更多