我刚开始使用Rackspace Cloud Files的PHP API。到目前为止一切都那么好 - 但我将它用作穷人的内存缓存,存储序列化数据的键/值对。
我的应用尝试使用以下内容通过其键(API语言中的“name”)获取现有的缓存对象:
$obj = $this->container->get_object($key);
问题是,如果对象不存在,API会抛出致命错误而不是简单地返回false
。通过API执行此操作的“正确”方法可能是执行
$objs = $this->container->list_objects();
然后检查该列表中的$key
值。但是,这似乎比从false
请求返回get_object
更多时间/ CPU密集。
云文件中是否有办法“搜索对象”或“检查对象是否存在”?
谢谢
答案 0 :(得分: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.";
}
答案 1 :(得分:1)
我有更通用的方法来检查对象是否存在:
try {
$this->_container->get_object($path);
$booExists = true;
} catch (Exception $e) {
$booExists = false;
}
答案 2 :(得分: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
答案 3 :(得分: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);
答案 4 :(得分: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';
}