【问题标题】:Amazon S3 PHP SDK return false if even one CommandPool fails, true otherwise如果一个 CommandPool 失败,Amazon S3 PHP SDK 返回 false,否则返回 true
【发布时间】:2018-03-23 20:41:02
【问题描述】:

例如,我正在尝试创建一个类似于doesObjectExist() 的方法,但用于多个名为doObjectsExist() 的文件。问题是,如果所有文件都存在,我需要它返回 true,如果只有一个文件不存在,则返回 false。这是我目前的方法。

public function doObjectsExist(...$objects) {
    $client = $this->client;
    $bucket = $this->bucket;
    $commands = [];
    foreach ($objects as $key) {
        $commands[] = $client->getCommand('HeadObject', [
            'Bucket' => $bucket,
            'Key'    => $key
        ]);
    }
    $pool = new CommandPool($client, $commands, [null,
        'rejected' => function (AwsException $reason, $iterKey, PromiseInterface $aggregatePromise) {
            return false;
        }
    ]);
    $promise = $pool->promise();
    try {
        $promise->wait();
        return true;
    }
    catch (AwsException $e) {
        return false;
    }
}

【问题讨论】:

    标签: php amazon-web-services amazon-s3 aws-sdk aws-php-sdk


    【解决方案1】:

    由于您希望函数在任何丢失的文件上返回 false,因此在 $commands 之后添加一个变量 $missing = false。在您的“拒绝”回调函数中设置 $missing = true。在 $promise->wait() 之后,如果 $missing 等于 true,则返回 false。

    我会改进被拒绝的功能,以实际测试 $reason 以了解您需要检测的内容。

    [编辑]

    这是一个示例,它可以通过示例代码和解释帮助您理解 CommandPool。

    Command Objects

    【讨论】:

    • 最初有一个变量来跟踪丢失,但它没有等待设置。可惜网上几乎没有这方面的信息。
    • 我不明白您所说的“但它没有等待设置”是什么意思。
    • 例如,您的变量名称 $missing 在被拒绝的命令池之一中执行 $missing = true。如果我在 try/catch 块中的 $promise->wait() 之后立即执行 if($missing),具有讽刺意味的是,它不会等待 $missing 设置为 true。我希望我澄清了这一点。
    • 那么代码有问题。 $promise->wait() 是阻塞的,在所有命令完成(或失败)之前不应返回。将一些调试代码放入被拒绝的回调中,并确保在调用 wait() 时时间正确。出了点问题。
    • 我提供的是整个代码(减去$missing)。它真的不会因为某种原因而等待。自己试试吧。我已经成功地使用了很多时间。将它与 CommandPools 结合使用给我带来了麻烦。不过,我感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2018-10-22
    • 1970-01-01
    • 2017-08-19
    相关资源
    最近更新 更多