2013-08-05 19 views
8

Czy funkcja wstrzyma skrypt php, dopóki nie znajdzie obiektu na serwerach s3?waitUntilObjectExists() Metoda Amazon S3 PHP SDK, jak to działa?

Mam go wewnątrz pętli foreach, przesyłając obrazy jeden po drugim. Po znalezieniu obiektu wywołuję metodę, aby usunąć obraz lokalnie, a następnie usunąć folder lokalny, jeśli jest pusty. Czy to właściwa droga do tego? Dzięki

    foreach ($fileNames as $fileName) 
        { 

         $imgSize = getimagesize($folderPath . $fileName); 

         $width = (string)$imgSize[0]; 
         $height = (string)$imgSize[1]; 

         //upload the images 
         $result = $S3->putObject(array(
          'ACL'  => 'public-read', 
          'Bucket'  => $bucket, 
          'Key'  => $keyPrefix . $fileName, 
          'SourceFile' => $folderPath . $fileName, 
          'Metadata' => array(
           'w' => $width, 
           'h' => $height 
          ) 
         )); 

         $S3->waitUntilObjectExists(array(
         'Bucket' => $bucket, 
         'Key' => $keyPrefix . $fileName)); 

         $this->deleteStoreDirectory($folderPath, $fileName); 
        } 

Odpowiedz

12

waitUntilObjectExists jest w zasadzie kelner który okresowo sprawdza (polls) S3 w określonych odstępach czasu, aby zobaczyć, czy zasób jest dostępny. Wykonywanie skryptu jest blokowane do momentu znalezienia zasobu lub osiągnięcia maksymalnej liczby ponownych prób.

Jak docs AWS definiuje je:

Kelnerzy pomóc łatwiej pracować ostatecznie spójnych systemów poprzez zapewnienie łatwego sposobu, aby czekać aż zasób wchodzi w określonym stanie przez odpytywanie zasobu.

Domyślnie kelner waitUntilObjectExists jest skonfigurowany tak, aby próbował zlokalizować zasób 20 razy, z 5-sekundowym opóźnieniem między kolejnymi próbami. Można zastąpić te domyślne wartości pożądanymi wartościami, przekazując dodatkowe parametry do metody waitUntilObjectExists.

Jeśli kelner nie może zlokalizować zasobu po maksymalnej liczbie prób, wygeneruje wyjątek.

Możesz dowiedzieć się więcej o kelnerów w:

http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/feature-waiters.html

Dla Państwa przypadku użycia, nie sądzę, ma sens, aby zadzwonić waitUntilObjectExists po przesłaniu obiektu, chyba że sam skrypt PHP próbuje pobrać ten sam obiekt z S3 później w kodzie.

Jeśli wywołanie API putObject zwróciło pomyślną odpowiedź, obiekt ostatecznie pojawi się w S3 i niekoniecznie trzeba będzie poczekać, aż to nastąpi przed usunięciem plików lokalnych.

+0

Ok, dzięki człowieku. Więcej sensu teraz –

+0

Prawidłowo, nie potrzebujesz kelnera, chyba że musisz natychmiast uzyskać dostęp do obiektu. –

+0

W moim przypadku potrzebuję uzyskać dostęp do obiektu zaraz po przeniesieniu go do wiadra S3. Problem w tej sytuacji polega na tym, że w pewnym momencie obiekt będzie znajdował się w wiadrze, gdy zostanie o to poproszony, ale ponieważ nie będzie miał ukończonego transferu, otrzymam niekompletne obrazy przy pierwszym wywołaniu getObject lub żadne wszystko. –