情景:
我使用此功能一次将整个目录上传到AWS桶,而某些文件夹的照片确实很大(如30GB)。
$client->uploadDirectory(
MY_SOURCE,
SPACES_NAME,
DESTINATION,
array(
'concurrency' => 1,
'debug' => TRUE,
'force' => FALSE,
'options' => array(
'ServerSideEncryption' => 'AES256',
),
)
);
错误: 即使并发= 1,一段时间后我的脚本结束时出现以下错误:
503减速请降低您的请求率。
我的问题是
是否有一些限制请求的参数?读取文档我找不到使这个函数减慢请求的方法。我知道有100个文件/秒的限制,我想遵守这个限制,但不知道放在哪里。
答案 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 ++;
}
}