2011-08-10 16 views
6

içinde nesne olup olmadığını kontrol edin Sadece Rackspace Cloud Dosyaları için PHP API ile çalışmaya başladım. Şimdiye kadar çok iyi-- ama seri olarak verilmiş verilerin anahtar/değer çiftlerini depolayarak fakir bir adamın memcache'si gibi kullanıyorum.Cloud Files (PHP API)

uygulamam böyle bir şey kullanarak anahtar (API dilinde 'adıyla') tarafından mevcut önbelleğe nesneyi kapmak için çalışır:

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

nesne yoksa problem, API, false'u döndürmekten ziyade önemli bir hata atar. API tarafından Bunu yapmak için "doğru" yolu muhtemelen

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

yapmak ve daha sonra bu listedeki benim $key değeri için kontrol etmek olurdu. Ancak bu, get_object isteğinden false döndürmekten çok daha fazla zaman/CPU yoğun görünüyor.

Cloud Files'da "nesne için arama" veya "nesne olup olmadığını kontrol etmenin" bir yolu var mı?

Teşekkür

+2

, denemek onu yakala. –

+0

@Marc B-- bu işe yarar ... Sadece "dosya var" türünün işlevini kullanıp kullanamayacağına dair bilgi arıyordum. – julio

+0

/yakalamak yerine kullanabileceğim işlevler var. Olsa, muhtemelen sadece bir deneyin/yakalamak yapan bir sarıcı olacaktı. Yani muhtemelen bu muhtemelen en iyi bahistir;) – Brian

cevap

4

Onlara bir çekme isteği gönderilir ve dahil olsun umuyoruz. Eğer $ nesne dökümü olursa

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

, o CONTENT_LENGTH sıfır görürsünüz:

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

Benim çekme isteği sizin için buna benzer olacağını, bir örnek içerir. Veya son değiştirilen sıfır uzunluklu bir dize olacaktır.

Örnek: Orada derin dampingli üst nesnenin, dönecektir 404 yılında, aynı zamanda, ama bunu almak için bazı hackin' gerekiyordu bu yüzden, özeldir

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

.

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

Sen bu nesne içindeki nesne varsa ben de kontrol etmek daha genel bir yol var 404

[response_status:CF_Http:private] => 404 
1

bir response_status göreceksiniz:

Bunu görmek için aşağıdakileri yapın

0

Partiye biraz geç kaldığımı biliyorum, ama umarım bu, e future: Bir nesnenin mevcut olup olmadığını test etmek için objectExists() yöntemini kullanabilirsiniz.

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

kullanın gibi ...

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

bu aşağıdakileri kullanabilirsiniz kontrol gerçekleştirmek için opencloud ithal etmek istemiyorsanız:

bir hata atarsa ​​
$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'; 
}