微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 如何将doObjectExist()请求批量处理到Amazon S3?

我需要检查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 举报,一经查实,本站将立刻删除。

相关推荐