2011-08-10 18 views
6

Właśnie zacząłem pracować z PHP API dla Rackspace Cloud Files. Do tej pory taki dobry ... ale używam go jako rodzaju memcache biedaka, przechowując pary klucz/wartość zserializowanych danych.sprawdź, czy obiekt istnieje w Cloud Files (PHP API)

Moja aplikacja próbuje chwycić istniejącego obiektu przez jego pamięci podręcznej kluczy („nazwa” w języku API), używając coś takiego:

$obj = $this->container->get_object($key); 

Problem jest, jeśli obiekt nie istnieje, API zgłasza błąd krytyczny, a nie po prostu zwraca false. „Prawo” sposób to zrobić przez API będzie prawdopodobnie zrobić

$objs = $this->container->list_objects(); 

a następnie sprawdzić na własną wartość w tym wykazie $key. Wydaje się to jednak znacznie bardziej czasochłonne/obciążające procesor niż tylko zwracanie false z żądania get_object.

Czy istnieje sposób, aby wykonać "wyszukiwanie obiektu" lub "sprawdzić, czy obiekt istnieje" w Cloud Files?

Dzięki

+2

Jeżeli zgłasza błąd, spróbuj "łapcie to". –

+0

@Marc B - to działa - szukałem tylko informacji o tym, czy istnieje funkcja "plik istnieje", której mógłbym użyć, zamiast próbować/złapać – julio

+0

Nie ma takiego, o którym wiem, ale jeśli istnieje było, prawdopodobnie byłby to wrapper, który i tak spróbuje/złapie. Więc to prawdopodobnie nadal jest twój najlepszy zakład;) – Brian

Odpowiedz

4

Wysłałem im żądania ściągania i nadzieję, że to się włączone.

https://github.com/rackspace/php-cloudfiles/pull/35

Moja pull-Żądanie zawiera przykładowe, dla ciebie byłoby podobne do tego:

$object = new CF_Object($this->container, 'key'); 
if ($object->exists() === false) { 
    echo "The object '{$object->name}' does not exist."; 
} 
0

Jeśli zrzucić $ object, zobaczysz, że CONTENT_LENGTH wynosi zero. Lub ostatnia modyfikacja będzie ciągiem o zerowej długości.

Przykład:

$object = new CF_Object($container, 'thisdocaintthere.pdf'); 
print_r($object->content_length); 

Jest także głęboko w dumpingowych obiektu nadrzędnego, 404 że wróci, ale to jest prywatny, więc trzeba by jakiegoś hackin', aby uzyskać na nim.

Aby to zobaczyć, wykonaj następujące czynności:

$object = new CF_Object($container, 'thisdocaintthere.pdf'); 
print_r($object->container->cfs_http); 

Zobaczysz wewnątrz tego obiektu jest response_status który jest 404

[response_status:CF_Http:private] => 404 
1

mam bardziej ogólny sposób, aby sprawdzić, czy obiekt istnieje:

try { 
     $this->_container->get_object($path); 
     $booExists = true; 
    } catch (Exception $e) { 
     $booExists = false; 
    } 
0

Wiem, że jestem trochę spóźniony na imprezę, ale mam nadzieję, że to pomoże komuś w e przyszłość: możesz użyć metody objectExists(), aby sprawdzić, czy obiekt jest dostępny.

public static function getObject($container, $filename, $expirationTime = false) 
{ 
    if ($container->objectExists($filename)) { 

     $object = $container->getPartialObject($filename); 

     // return a private, temporary url 
     if ($expirationTime) { 
      return $object->getTemporaryUrl($expirationTime, 'GET'); 
     } 

     // return a public url 
     return $object->getPublicUrl(); 
    } 

    // object does not exist 
    return ''; 
} 

Zastosowanie jak ...

// public CDN file 
$photo = self::getObject($container, 'myPublicfile.jpg'); 

// private file; temporary link expires after 60 seconds 
$photo = self::getObject($container, 'myPrivatefile.jpg', 60); 
0

Jeśli nie chcesz importować OpenCloud wykonać to sprawdzić można użyć następujących:

$url = 'YOUR CDN URL'; 
$code = FALSE; 
$options['http'] = array(
    'method' => "HEAD", 
    'ignore_errors' => 1, 
    'max_redirects' => 0 
); 
$body = file_get_contents($url, NULL, stream_context_create($options)); 
sscanf($http_response_header[0], 'HTTP/%*d.%*d %d', $code); 


if($code!='200') { 
    echo 'failed'; 
} else { 
    echo 'exists'; 
}