2011-08-10 19 views
6

Acabo de empezar a trabajar con la API de PHP para Rackspace Cloud Files. Hasta ahora todo bien, pero lo estoy usando como una especie de memcache de un pobre, almacenando pares clave/valor de datos serializados.compruebe si el objeto existe en Cloud Files (PHP API)

Mi aplicación intenta agarrar el objeto existente en caché por su llave ('nombre' en el idioma API) usando algo como esto:

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

El problema es, si el objeto no existe, el API arroja un error fatal en lugar de simplemente devolver false. La forma "correcta" de hacer esto mediante la API probablemente sería hacer un

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

y para verificar si el valor de mi $key en esa lista. Sin embargo, esto parece mucho más tiempo/CPU que simplemente devolver false desde la solicitud get_object.

¿Hay alguna forma de hacer una "búsqueda de objeto" o "verificar si el objeto existe" en Cloud Files?

Gracias

+2

Si se lanza un error, intente "atraparlo". –

+0

@Marc B-- eso sí funciona-- Estaba buscando información sobre si existe un tipo de "archivo existe" tipo de función que podría usar en lugar de intentar/atrapar – julio

+0

No hay ninguna que yo sepa, pero si hay fueron, probablemente sería solo una envoltura que intenta/atrapa de todos modos. Así que esa es probablemente la mejor opción;) – Brian

Respuesta

4

los envié una solicitud de extracción y espero que obtendrá incluido.

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

Mi pull-petición incluye un ejemplo, para usted sería similar a esto:

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

si vuelca el objeto $, verá que content_length es cero. O bien, la última modificación será una cadena de longitud cero.

Ejemplo:

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

También hay, en el fondo en el objeto principal objeto de dumping, un 404 que devolverá, pero es privado, por lo que había necesidad alguna hackin' para llegar a ella.

Para ver esto, haga lo siguiente:

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

Vas a ver el interior de un objeto que response_status que es 404

[response_status:CF_Http:private] => 404 
1

tengo manera más general para comprobar si existe algún objeto:

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

Sé que llego un poco tarde a la fiesta, pero espero que esto ayude a alguien en el e futuro: puede usar el método objectExists() para probar si un objeto está disponible.

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

uso como ...

// 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

Si no quieren importar OpenCloud para realizar esta comprobación se puede utilizar lo siguiente:

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