2011-08-10 8 views
6

私は、RackspaceクラウドファイルのPHP APIの使用を開始しました。これまでのところとても良いですが、シリアル化されたデータのキーと値のペアを格納する、貧しい人のmemcacheのようなものとして使用しています。クラウドファイル(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

私が知っているものはありませんが、とにかくtry/catchを行うラッパーになるでしょう。だからおそらくあなたの最善の策です;) – 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がゼロで表示されます。または、最後に変更されたものは長さゼロの文字列になります。

例:そこ深いダンプされた親オブジェクト、戻ります404で、またですが、あなたはそれを得るためにいくつかのhackin'に必要があると思いますので、それは、プライベートだ

$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); 

あなたは、そのオブジェクトの内側に404

[response_status:CF_Http:private] => 404 
1

あるresponse_status私はオブジェクトが存在するかどうかを確認するために、より一般的な方法を持って表示されます:

を、これを参照してください。次の操作を行うに

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'; 
} 
関連する問題