如果即使一个CommandPool失败,Amazon S3 PHP SDK也会返回false,否则返回true

问题描述:

例如,我试图创建一个类似于doesObjectExist()的方法,但对于名为doObjectsExist()的多个文件。问题是如果所有文件都存在,我需要它返回true,如果只有一个文件不存在,则返回false。这是我目前的方法。如果即使一个CommandPool失败,Amazon S3 PHP SDK也会返回false,否则返回true

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; 
    } 
} 

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

我会改善被拒绝的功能,以实际测试$理由你需要检测。

[编辑]

下面是一个例子,可以帮助您通过与解释示例代码了解CommandPool。

Command Objects

+0

最初有一个变量来跟踪丢失,但它并没有等待设置。吮吸,几乎没有关于这个在线信息。 –

+0

我不明白你的意思是“但它没有等待设置”。 –

+0

例如,你的变量名'$ missing'在一个被拒绝的CommandPools中有'$ missing = true'。如果我在try/catch块的'$ promise-> wait()'之后立即执行'if($ missing)',讽刺的是不会等待'$ missing'被设置为true。我希望我清除它。 –