Rackspace Cloudfiles API — наиболее эффективный метод возврата файлов контейнера

Используя Rackspace CloudFiles API (на PHP), бывают случаи, когда мне нужно просто получить список всех текущих файлов в контейнере. То, что я только что придумал, ужасно медленно и неэффективно, потому что оно получает каждый объект, относящийся к этому файлу. Итак, что у меня есть:

Моя функция

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

оболочка get_objects для CodeIgniter

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

функция 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, перечисляя каждый из них как 4-й параметр get_objects. Итак, get_objects(0, NULL, NULL, 'css') и т. д. Все же кажется, что есть способ получше.


person Jared Eitnier    schedule 29.05.2013    source источник


Ответы (2)


Если вы используете старые привязки php-cloudfiles, используйте метод list_objects(). Это просто вернет список объектов в контейнере.

Привязки php-cloudfiles теперь устарели, новые официальные привязки php cloudfiles: php-opencloud (object-store) и вы можете найти раздел о перечислении объектов в контейнере здесь

person ScottSA    schedule 29.05.2013
comment
Сладкий, спасибо. Я проверю это. Думаю, пора обновиться. - person Jared Eitnier; 29.05.2013

Используя php-opencloud, если у вас есть объект Container, используйте метод ObjectList() для возврата списка объектов:

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

$obj содержит все метаданные, связанные с объектом, возвращаемым списком (то есть есть определенные атрибуты, которые можно получить только путем прямого вызова объекта, но это должно иметь большую часть того, что вам нужно).

person Glen Campbell    schedule 30.05.2013
comment
Я использовал старые привязки php, но это, очевидно, работает для opencloud. Спасибо - person Jared Eitnier; 30.05.2013