проверить, существует ли объект в облачных файлах (PHP API) - PullRequest
6 голосов
/ 10 августа 2011

Я только начал работать с PHP API для Rackspace Cloud Files.Пока все хорошо - но я использую его в качестве мема-кеша для бедного человека, храня пары ключ / значение сериализованных данных.

Мое приложение пытается получить существующий кэшированный объект по его ключу ('name'в языке API), используя что-то вроде этого:

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

Проблема в том, что если объект не существует, API выдает фатальную ошибку, а не просто возвращает false.«Правильный» способ сделать это с помощью API, вероятно, состоит в том, чтобы сделать

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

и затем проверить мое значение $key в этом списке.Тем не менее, это кажется гораздо более затратным по времени / ЦП, чем просто возврат false из запроса * 1012. *

Есть ли способ выполнить «поиск объекта» или «проверить, существует ли объект» в облакеФайлы?

Спасибо

Ответы [ 5 ]

4 голосов
/ 22 августа 2011

Я отправил им запрос на получение и надеюсь, что он будет включен.

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 голос
/ 17 декабря 2012

У меня есть более общий способ проверить, существует ли объект:

    try {
        $this->_container->get_object($path);
        $booExists = true;
    } catch (Exception $e) {
        $booExists = false;
    }
0 голосов
/ 20 сентября 2016

Если вы не хотите импортировать 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';
}
0 голосов
/ 07 июля 2016

Я знаю, что немного опоздал на вечеринку, но, надеюсь, это поможет кому-то в будущем: вы можете использовать метод 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 голосов
/ 04 декабря 2012

Если вы сбросите объект $, вы увидите, что 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);

Внутри этого объекта вы увидите response_status, равный 404

[response_status:CF_Http:private] => 404
...