2011-08-10 13 views
6

में ऑब्जेक्ट मौजूद है या नहीं, मैंने अभी रैकस्पेस क्लाउड फ़ाइलों के लिए PHP API के साथ काम करना शुरू कर दिया है। अब तक इतना अच्छा है - लेकिन मैं इसे एक गरीब व्यक्ति के memcache के प्रकार के रूप में उपयोग कर रहा हूं, धारावाहिक डेटा के कुंजी/मूल्य जोड़े संग्रहीत कर रहा हूं।क्लाउड फाइलों (PHP API)

मेरा ऐप उसके प्रमुख (एपीआई भाषा में 'नाम') द्वारा मौजूदा कैश की गई वस्तु हड़पने के लिए कुछ इस तरह का उपयोग कर प्रयास करता है:

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

समस्या यह है, अगर वस्तु मौजूद नहीं है, एपीआई false लौटने की बजाय एक घातक त्रुटि फेंकता है। "सही" जिस तरह से एपीआई द्वारा ऐसा करने के लिए शायद एक

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

करना और फिर उस सूची में अपना $key मूल्य के लिए जाँच करने के लिए किया जाएगा। हालांकि, यह get_object अनुरोध से false लौटने की तुलना में अधिक समय/सीपीयू गहन लगता है।

क्या क्लाउड फाइलों में "ऑब्जेक्ट की खोज करें" या "ऑब्जेक्ट मौजूद है या नहीं" करने का कोई तरीका है?

धन्यवाद

+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'; 
} 
संबंधित मुद्दे