2011-08-10 74 views
6

我剛剛開始使用Rackspace Cloud Files的PHP API。目前爲止這麼好 - 但我將它用作窮人的內存緩存,存儲序列化數據的鍵/值對。檢查雲文件(PHP API)中是否存在對象

我的應用程序試圖通過它的鍵(API語言「名」)使用像這樣搶現有的緩存對象:

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

的問題是,如果對象不存在, API會引發致命錯誤,而不是簡單地返回false。 「正確」的方式,通過API來做到這一點很可能是做一個

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

然後檢查我在該列表中$key值。但是,這似乎比從get_object請求返回false更多的時間/ CPU密集度。

有沒有辦法在雲文件中執行「搜索對象」或「檢查對象是否存在」?

謝謝

+2

如果它拋出一個錯誤,請嘗試抓住它。 –

+0

@Marc B--確實有效 - 我只是在尋找是否存在「文件存在」類型的功能,我可以使用而不是嘗試/捕獲 – julio

+0

沒有我知道的,但如果有無論如何,它可能只是一個包裝器,無論如何都會嘗試/捕獲。所以這可能仍然是你最好的選擇;) – Brian

回答

4

我向他們發送了一個拉請求,希望它會包括在內。

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

我拉請求包括一個例子,你將與此類似:

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

如果轉儲$對象,你會看到CONTENT_LENGTH爲零。或者,上次修改將是一個零長度的字符串。

例子:

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

還有,深傾銷父對象,一個404將返回,但它是私有的,所以你需要一些hackin'得到它。

看到這一點,做到以下幾點:

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

你會認爲物體內部看response_status是404

[response_status:CF_Http:private] => 404 
1

我要檢查更普遍的方式,如果對象存在:

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

我知道我對派對有點遲到,但希望這會幫助某人未來:您可以使用objectExists()方法來測試對象是否可用。

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

使用像...

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

如果您不希望導入opencloud執行這一檢查,你可以使用以下命令:

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