我需要检查S3中是否存在一组密钥,用于大量项目中的每一个. (每组键与大量项目中的一个相关).
我正在使用PHP SDK(v2)
目前我正在为每个键调用$client-> doesObjectExist(BUCKET,$key),这是一个瓶颈(每次调用到S3的往返时间).
我更喜欢做$client-> doesObjectExist(BUCKET,$batch),其中$batch = array($key1,$key2 … $keyn),并且客户端检查所有这些键然后返回一系列的回应(或一些其他类似的结构).
我遇到了一个few references到一个“批量api”,听起来很有希望,但没有什么具体的.我猜这可能只存在于v1 SDK中.
解决方法:
您可以通过利用底层Guzzle库功能,使用AWS SDK for PHP执行并行请求.由于doesObjectExist方法实际上在该引擎盖下执行Headobject操作.您可以通过执行以下操作来创建Headobject命令组:
use Aws\S3\S3Client;
use Guzzle\Service\Exception\CommandTransferException;
function doObjectsExist(S3Client $s3, $bucket, array $objectKeys)
{
$headobjectCommands = array();
foreach ($objectKeys as $key) {
$headobjectCommands[] = $s3->getCommand('Headobject', array(
'Bucket' => $bucket,
'Key' => $key
));
}
try {
$s3->execute($headobjectCommands); // Executes in parallel
return true;
} catch (CommandTransferException $e) {
return false;
}
}
$s3 = S3Client::factory(array(
'key' => 'your_aws_access_key_id',
'bucket' => 'your_aws_secret_key',
));
$bucket = 'your_bucket_name';
$objectKeys = array('object_key_1', 'object_key_2','object_key_3');
// Returns true only if ALL of the objects exist
echo doObjectsExist($s3, $bucket, $objectKeys) ? 'YES' : 'NO';
如果您想要响应中的数据,除了键是否存在之外,您可以更改try-catch块来执行类似的操作.
try {
$executedCommands = $s3->execute($headobjectCommands);
} catch (CommandTransferException $e) {
$executedCommands = $e->getAllCommands();
}
// Do stuff with the command objects
foreach ($executedCommands as $command) {
$exists = $command->getResponse()->isSuccessful() ? "YES" : "NO";
echo "{$command['Bucket']}/{$command['Key']}: {$exists}\n";
}
AWS SDK for PHP User Guide中提到了并行发送命令,但我也会看一下Guzzle batching documentation.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。