rackspace cloudfiles api - 返回容器文件的最有效方法

时间:2013-05-29 14:52:37

标签: php rackspace-cloud cloudfiles

使用Rackspace CloudFiles API(在PHP中),有时我只需要获取容器中所有当前文件的列表。我刚刚提出的是非常慢和无效,因为它获得了与该文件相关的每个对象。所以我有:

我的功能

function clean_cdn() {
    $objects = $this->CI->cfiles->get_objects();
    foreach ($objects as $object) {
        echo $object->name;
    }
}

CodeIgniter的get_objects包装器

public function get_objects() {
    $my_container = $this->container_info();

    try {
        return $my_container->get_objects(0, NULL, NULL, NULL);
    } catch(Exception $e) {
        $this->_handle_error($e);
        return FALSE;
    }
}

cloudfiles get_objects功能

function get_objects($limit=0, $marker=NULL, $prefix=NULL, $path=NULL)
{
    list($status, $reason, $obj_array) =
        $this->cfs_http->get_objects($this->name, $limit,
            $marker, $prefix, $path);

    if ($status < 200 || $status > 299) {
        throw new InvalidResponseException(
            "Invalid response (".$status."): ".$this->cfs_http->get_error());
    }

    $objects = array();
    foreach ($obj_array as $obj) {
        $tmp = new CF_Object($this, $obj["name"], False, True);
        $tmp->content_type = $obj["content_type"];
        $tmp->content_length = (float) $obj["bytes"];
        $tmp->set_etag($obj["hash"]);
        $tmp->last_modified = $obj["last_modified"];
        $objects[] = $tmp;
    }
    return $objects;
}

这会给我一个名字(这就是我目前正在做的所有事情)但是有更好的方法吗?

更新

我注意到我可以在技术上将所有“目录”放在一个数组中并在foreach循环中迭代它们,将它们列为get_objects的第四个参数。所以get_objects(0, NULL, NULL, 'css')等等似乎还有更好的方法。

2 个答案:

答案 0 :(得分:1)

如果您使用旧的php-cloudfiles绑定,请使用list_objects()方法。这将只返回容器中的对象列表。

现在不推荐使用php-cloudfiles绑定,新的官方php cloudfiles绑定为php-opencloud (object-store),您可以在容器中找到列出对象的部分here

答案 1 :(得分:1)

使用php-opencloud,如果你有一个Container对象,使用ObjectList()方法返回一个对象列表:

   $list = $container->ObjectList();
   while ($obj = $list->Next()) {
      // do stuff with $obj
   }

$obj具有与列表返回的对象相关联的所有元数据(也就是说,某些属性只能通过直接调用对象来检索,但这应该具有大部分你需要什么)。