簡體   English   中英

檢查雲文件中是否存在 object (PHP API)

[英]check if object exists in Cloud Files (PHP API)

我剛剛開始為 Rackspace 雲文件使用 PHP API。 到目前為止一切都很好——但我將它用作一種窮人的內存緩存,存儲序列化數據的鍵/值對。

我的應用程序嘗試使用以下內容通過其鍵(API 語言中的“名稱”)獲取現有緩存的 object:

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

問題是,如果 object 不存在,則 API 會引發致命錯誤,而不是簡單地返回false API 執行此操作的“正確”方法可能是執行

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

然后在該列表中檢查我的$key值。 但是,這似乎比僅從get_object請求返回false更耗費時間/CPU。

有沒有辦法在雲文件中進行“搜索對象”或“檢查 object 是否存在”?

謝謝

我向他們發送了一個拉取請求,並希望它會被包括在內。

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

我有更通用的方法來檢查 object 是否存在:

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

如果您轉儲 $object,您將看到 content_length 為零。 或者,最后修改的將是一個零長度的字符串。

例子:

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

還有,在傾倒的父 object 的深處,一個 404 會返回,但它是私有的,所以你需要一些 hackin 才能得到它。

要查看此內容,請執行以下操作:

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

你會在里面看到 object 的 response_status 是 404

[response_status:CF_Http:private] => 404

我知道我參加聚會有點晚了,但希望這對將來的某人有所幫助:您可以使用objectExists()方法來測試 object 是否可用。

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 來執行此檢查,您可以使用以下命令:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM