开发者社区> 问答> 正文

关于PHPsdk中的listobject函数问题

最近公司要求增加测试bucket,需要把bucket1里的数据copy一份到新建bucket上,使用list_object获取bucket1中的数据时,因为里面对象有虚拟路径1/2/3/a.jpg,所以写了个递归获取,但是实际操作时,几千条数据执行还正常;bucket里20W条数据,获取不出来,求大神指导,
public function getAllObjects($bucket,$mOption,$forder,$files)
    {
        $forder= array();
        $i =0;
        $j =count($files);
        $arrayH =''; //为marker保存值
        $horizon =0;
        $op =array(
            'prefix'=>'',
            'max-keys'=>100,
            'marker'=>'',
        );
        $prefix  =$mOption['prefix'];
        $xml = $this->list_object($bucket,$mOption);
        //--SDK中返回的$response,从里面取出需要的内容;
        $sxml = new SimpleXMLElement($xml->body);
        foreach($sxml->children() as $s)
        {
            if(!empty($s->Key[0])) //获取当前目录下的文件;
            {
                $files[$j]=(string)$s->Key[0];
                $j  ;
                $arrayH=(string)$s->Key[0];
            }
            if(!empty($s->Prefix[0])) //获取当前目录下的子目录
            {
                $arrayH=(string)$s->Prefix[0];
                    $forder [$i] =(string)$s->Prefix[0];
                    $i  ;
            }
            $horizon  ;
        }    
        if($horizon >100) //获取对象每次不能超过100条,鉴于有其他数据,此处变量准确值为107
        {
            $mOption['marker'] = $arrayH;  //获取下次list的标志位
            $files = $this->getAllObjects($bucket,$mOption,$forder,$files);    
        }
        else if($horizon>6) //如果此次有效数据大于0,小于100,则说明该级目录已搜索完毕,
        {
            $op['marker']='';
            foreach($forder  as $fs) //如果横向搜索完成,则顺着目录向下搜索
            {
                $opdir="";
                $opdir = $fs;                
                $op['prefix']=$opdir;
                $files = $this->getAllObjects($bucket,$op,$forder,$files);
            }
        }
    
        return $files;
    }


展开
收起
堕落了信仰 2014-01-16 13:24:16 9653 0
4 条回答
写回答
取消 提交回答
  • Re关于PHPsdk中的listobject函数问题
    list objects命令中的参数max-keys,它定义了在一次请求内OSS返回文件和文件夹最大的数目,默认值是100,最大可以设成1000。如果文件数超过1000,可以利用list objects的最后一个参数——marker。这个参数告诉OSS从指定的文件开始,按照字典序查其后面的文件,LZ可以测试一下
    2014-01-18 19:16:24
    赞同 展开评论 打赏
  • Re关于PHPsdk中的listobject函数问题
    如果楼主出错了,可以将错误码贴出来,看看OSS返回的错误信息,是不是有帮助。


    感觉在递归遍历的时候,每次100个,20W需要递归2000次。
    我看循环处理可能更好些。下面是一个python的伪代码,楼主凑合看吧。
    例如:

        prefix = “”
        marker = ""
        delimiter = ''
        maxkeys = '1000' 每次拿一千个
        all_object_list = []
        while 1:
            res = oss.get_bucket(bucket, prefix, marker, delimiter, maxkeys) //每次拿一千个
            if res.status != 200: //不是200表示出错
                return res
            body = res.read()
            (tmp_object_list, marker) = get_object_list_marker_from_xml(body) // 从返回的Body中解析出object list和next marker,并将next marker的值返给maker
            all_object_list.extend(tmp_object_list)
            if len(marker) == 0: //如果marker为空,表示停止循环
                break


    //从body中解析出object list和next marker

    def get_object_list_marker_from_xml(body):
        object_meta_list = []
        next_marker = ""
        hh = GetBucketXml(body) //解析body中的xml得到一个结构体,结构体中有object list,有next marker,也有是否结束的标志。都在xml中
        object_meta_list = ParseToGetObjectList(hh)
        if hh.is_truncated: //表明list bucket的结果没有结束,还有object
            next_marker = hh.nextmarker //获得下一次的marker
        return (object_meta_list, next_marker)

    -------------------------

    回楼主堕落了信仰的帖子
    在OSS中实际只有object的概念,并没有目录的概念,所以拿到所有的object list就可以直接操作了。
    2014-01-17 17:58:35
    赞同 展开评论 打赏
  • 获取不出来是什么意思,执行超时还是啥?慢慢的分步执行不就得了
    2014-01-16 20:59:45
    赞同 展开评论 打赏
  • Re关于PHPsdk中的listobject函数问题
    跪求大神指点啊啊啊!!!!!!!!!!!!!!!!!!
    2014-01-16 17:59:56
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载