6

我刚刚开始使用 Rackspace Cloud Files 的 PHP API。到目前为止一切都很好——但我将它用作一种穷人的内存缓存,存储序列化数据的键/值对。

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

$obj = $this->container->get_object($key);

问题是,如果对象不存在,API 会抛出致命错误,而不是简单地返回false. API 执行此操作的“正确”方法可能是执行

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

然后检查我$key在该列表中的值。但是,这似乎比仅从请求返回更耗费时间/ falseCPU get_object

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

谢谢

4

5 回答 5

4

我向他们发送了一个拉取请求,并希望它会被包括在内。

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.";
}
于 2011-08-22T02:24:14.083 回答
1

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

    try {
        $this->_container->get_object($path);
        $booExists = true;
    } catch (Exception $e) {
        $booExists = false;
    }
于 2012-12-17T17:17:15.557 回答
0

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

例子:

$object = new CF_Object($container, 'thisdocaintthere.pdf');
print_r($object->content_length);

在转储的父对象的深处,还有一个 404 会返回,但它是私有的,所以你需要一些 hackin 才能得到它。

要查看此内容,请执行以下操作:

$object = new CF_Object($container, 'thisdocaintthere.pdf');
print_r($object->container->cfs_http);

您将在该对象内部看到一个 404 的 response_status

[response_status:CF_Http:private] => 404
于 2012-12-04T17:59:53.353 回答
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);
于 2016-07-07T15:10:07.360 回答
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';
}
于 2016-09-20T15:40:30.987 回答