AWS sdk:如何减慢请求速度

时间:2018-03-29 19:52:42

标签: php aws-sdk

情景:

我使用此功能一次将整个目录上传到AWS桶,而某些文件夹的照片确实很大(如30GB)。

$client->uploadDirectory(
  MY_SOURCE,
  SPACES_NAME,
  DESTINATION,
  array(
    'concurrency' => 1,
    'debug'          => TRUE,
    'force'            => FALSE,
    'options'        => array(
      'ServerSideEncryption' => 'AES256',
    ),
  )
);

错误: 即使并发= 1,一段时间后我的脚本结束时出现以下错误:

  

503减速请降低您的请求率。

我的问题是

是否有一些限制请求的参数?读取文档我找不到使这个函数减慢请求的方法。我知道有100个文件/秒的限制,我想遵守这个限制,但不知道放在哪里。

2 个答案:

答案 0 :(得分:1)

您可以尝试使用中间件来减慢请求速度。像这样:

use Aws\Middleware;
use Psr\Http\Message\RequestInterface;

...

$s3Client->getHandlerList()->appendInit(Middleware::mapRequest(function (RequestInterface $request) {
    sleep(1);
    return $request;
}));

$s3Client->uploadDirectory(...);

请参阅docs

答案 1 :(得分:0)

好的,我找到了解决方案:

首先,我有一个特定的服务器来执行此操作,脚本在没有时间限制的情况下运行,并且可以使用非常好的内存。

   $counter     = 0;
$files      = scanDirAndSubdir($folder);
foreach($files as $file){
    if(is_file($file)){

        $ACL = 'private';

        $insert[]       = $client->getCommand('putObject',array(
            'Bucket'        => SPACES_NAME,
            'Key'           => $file,
            'SourceFile'    => $file,
            'ACL'           => $ACL,

        ));

        if($counter==100){
            // Executes all commands at once
            $pool = new Aws\CommandPool($client, $insert);
            $promisse = $pool->promise();
            $promisse->wait();

            $counter = 0;
            sleep(1);
        }
        $counter ++;
    }
}