检查云文件中是否存在对象(PHP API)

检查云文件中是否存在对象(PHP API),php,rackspace-cloud,cloudfiles,Php,Rackspace Cloud,Cloudfiles,我刚刚开始为Rackspace云文件使用PHP API。到目前为止还不错——但我把它当作穷人的memcache,存储序列化数据的键/值对 我的应用程序尝试通过其键(“API语言中的名称”)获取现有缓存对象,如下所示: $obj = $this->container->get_object($key); 问题是,如果对象不存在,API会抛出一个致命错误,而不是简单地返回false。API实现这一点的“正确”方法可能是 $objs = $this->container->l

我刚刚开始为Rackspace云文件使用PHP API。到目前为止还不错——但我把它当作穷人的memcache,存储序列化数据的键/值对

我的应用程序尝试通过其键(“API语言中的名称”)获取现有缓存对象,如下所示:

$obj = $this->container->get_object($key);
问题是,如果对象不存在,API会抛出一个致命错误,而不是简单地返回
false
。API实现这一点的“正确”方法可能是

$objs = $this->container->list_objects();
然后检查该列表中我的
$key
值。但是,这似乎比仅从
get\u对象
请求返回
false
要耗费更多的时间/CPU

有没有办法在云文件中“搜索对象”或“检查对象是否存在”


谢谢

我给他们发了一个请求,希望能包括在内

我的pull请求包括一个示例,对于您来说,它类似于以下内容:

$object = new CF_Object($this->container, 'key');
if ($object->exists() === false) {
    echo "The object '{$object->name}' does not exist.";
}

如果转储$object,您将看到content_length为零。或者,最后修改的字符串长度为零

例如:

$object = new CF_Object($container, 'thisdocaintthere.pdf');
print_r($object->content_length);
在被转储的父对象的深处还有一个404,它将返回,但它是私有的,所以你需要一些黑客来获取它

要查看此信息,请执行以下操作:

$object = new CF_Object($container, 'thisdocaintthere.pdf');
print_r($object->container->cfs_http);
$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';
}
您将在该对象中看到一个响应状态为404

[response_status:CF_Http:private] => 404

我有更一般的方法来检查对象是否存在:

    try {
        $this->_container->get_object($path);
        $booExists = true;
    } catch (Exception $e) {
        $booExists = false;
    }

我知道我参加聚会有点晚了,但希望这会对将来的人有所帮助:您可以使用
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);

如果不想导入opencloud来执行此检查,可以使用以下方法:

$object = new CF_Object($container, 'thisdocaintthere.pdf');
print_r($object->container->cfs_http);
$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';
}

如果它抛出一个错误,请尝试
catch
ing它。@Marc B--这确实有效--我只是想知道是否有一个“文件存在”类型的函数可以使用,而不是try/catch。我不知道有一个函数,但如果有,它可能只是一个执行try/catch的包装器。所以这可能仍是你最好的选择;)