检查Cloud Files中对象是否存在(PHP API)

6
我刚开始使用Rackspace Cloud文件的PHP API。到目前为止,一切都很顺利--但我将其用作贫穷人的memcache,存储序列化数据的键/值对。
我的应用程序尝试通过其键(在API语言中为“name”)获取现有的缓存对象,类似于以下内容:
$obj = $this->container->get_object($key);

问题是,如果该对象不存在,API 会抛出致命错误而不是简单地返回 false。API 应该采用的“正确”方法可能是执行一个

$objs = $this->container->list_objects();

然后在该列表中检查我的$key值。然而,这似乎比从get_object 请求中返回false 更耗费时间和CPU。

在Cloud Files中是否有一种“搜索对象”或“检查对象是否存在”的方法?

谢谢


2
如果它抛出了一个错误,尝试使用 catch 来捕获它。 - Marc B
@Marc B-- 那确实可以工作-- 我只是在寻找关于是否有“文件存在”类型的函数,我可以使用它而不是try/catch。 - julio
据我所知,目前没有这样的东西,但如果有的话,它可能只是一个包装器,无论如何都会进行 try/catch。因此,那仍然可能是你最好的选择 ;) - Brian
5个回答

4

我向他们发送了一个Pull Request,希望它能被包含进去。

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

1

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

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

0
如果你转储$object,你会发现content_length为零。或者,last modified将是一个长度为零的字符串。
例子:
$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);

你会在那个对象里看到一个响应状态是404

[response_status:CF_Http:private] => 404

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接