【问题标题】:check if object exists in Cloud Files (PHP API)检查云文件中是否存在对象(PHP API)
【发布时间】:2011-08-10 18:37:26
【问题描述】:

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

我的应用尝试使用如下方式通过其键(API 语言中的“名称”)获取现有缓存对象:

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

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

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

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

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

谢谢

【问题讨论】:

  • 如果它抛出一个错误,尝试catching它。
  • @Marc B--确实有效--我只是在寻找关于是否有“文件存在”类型的函数我可以使用而不是 try/catch 的信息
  • 我不知道有一个,但如果有的话,它可能只是一个无论如何都会执行 try/catch 的包装器。所以这可能仍然是你最好的选择;)

标签: php rackspace-cloud cloudfiles


【解决方案1】:

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

https://github.com/rackspace/php-cloudfiles/pull/35

我的 pull-request 包含一个示例,对您而言,它与此类似:

$object = new CF_Object($this->container, 'key');
if ($object->exists() === false) {
    echo "The object '{$object->name}' does not exist.";
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      如果您转储 $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
      

      【讨论】:

        【解决方案4】:

        我知道我参加聚会有点晚了,但希望这对将来的某人有所帮助:您可以使用 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);
        

        【讨论】:

          【解决方案5】:

          如果您不想导入 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';
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-01-02
            • 2011-05-14
            • 2012-07-27
            • 2013-09-26
            • 1970-01-01
            • 2013-01-03
            • 2018-03-12
            • 2023-04-04
            相关资源
            最近更新 更多