使用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')
等等似乎还有更好的方法。
答案 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
具有与列表返回的对象相关联的所有元数据(也就是说,某些属性只能通过直接调用对象来检索,但这应该具有大部分你需要什么)。