【问题标题】:Non blocking object copy between S3 regions with the AWS PHP SDK v2使用 AWS PHP SDK v2 在 S3 区域之间进行非阻塞对象复制
【发布时间】:2014-10-08 13:24:57
【问题描述】:

我正在尝试使用 AWS PHP SDK v2 中的 S3Client->copyObject() 操作在位于不同区域的存储桶之间复制 Amazon S3 中的大型对象。

对象复制确实有效,但问题是复制操作可能需要相当长的时间才能返回响应,并且它会阻止 PHP 脚本的执行,这不是我在这种特殊情况下想要的。

有什么方法可以通过 SDK 以非阻塞方式调用 copyObject()(可能使用一些较低级别的 Guzzle 设置)?我需要这种非阻塞行为,因为我必须将定期运行状况检查发送到另一项服务 (Amazon SWF) 以让它知道我的脚本仍在运行。

如果无法以非阻塞方式执行调用,我知道还有其他可能的解决方案,但我希望从具有更多 SDK 经验的人那里获得更多想法。

(我认为我可以采取的一种可能的方法是fork() 进程并在子进程中执行copyObject() 操作;此外,如果 Guzzle 支持并且它确保某种进度回调也可以工作回调方法至少每分钟执行一次)

【问题讨论】:

  • 不确定如何使用 copyObject,而不能使用 copyObject() 指定区域。你能分享一下你是怎么做的代码吗?
  • this official doc page。据我记得,您需要将请求发送到与目标存储桶对应的端点。
  • 那里看不到任何对区域的引用。
  • 一个bucket永远属于一个region。指定源和目标存储桶有效地指定源和目标区域。

标签: php amazon-s3 guzzle aws-php-sdk


【解决方案1】:

为此,您需要创建一些将在后台运行的进程。

您可以为此使用亚马逊队列服务。

检查此链接-http://aws.amazon.com/sqs/

解决方案 1- 您只需向队列服务提供作业,它将在后台执行您的任务,因此您的 PHP 脚本无需等待。

解决方案 2- 还有另一种方法是让 PHP cron 作业在每分钟或 5 分钟后执行。您可以将任务存储在数据库中,您的 cron 将从 DB 访问任务并执行它。 工作原理您只需将任务转储到数据库并返回即可。然后你的 cron 将从 DB 中读取并在后台执行。

【讨论】:

  • 代码已经设置为在后台作为 PHP CLI 进程运行,但它还需要执行其他处理任务,而无需等待 S3 复制操作完成。这就是为什么我需要一个非阻塞调用来在 S3 存储桶之间复制对象。我最终使用了fork(),并计划研究存储桶之间的多部分复制操作,以进一步提高复制速度。
猜你喜欢
  • 2017-07-13
  • 2017-02-04
  • 2021-12-26
  • 1970-01-01
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
相关资源
最近更新 更多