访客

zblog调取大量数据内存不溢出的方法

2167 大谋儿 知识探索

下面的例子是导出网站用户1的所有文章名,每次取出100个文章

set_time_limit(0);

//封装好的函数
function GetAllData($method, $w, $o, $limit, $callback){
    global $zbp;
    
    $page = 1;
    
    do{
        $p = new Pagebar('', false);
        $p->PageNow = $page++;
        $p->PageCount = $limit;
        
        $array = $zbp->$method(
            '*',
            $w,
            $o,
            array(($p->PageNow - 1) * $p->PageCount, $p->PageCount),
            array('pagebar' => $p),
            false
        );
        
        $complete = !$limit || $limit * $p->PageNow >= $p->Count;
        
        $res = $callback($array, $p, $complete);
        
        if ($res === false){
            break;
        }
        
        $zbp->posts = []; //清空zb内存中的文章缓存,防止内存溢出
    }while(!$complete);
}

//例:导出所有用户1的文章名
header("Content-Disposition:attachment;filename=posts.txt");

//调用本站封装好的函数
GetAllData('GetArticleList', array(array('=','log_AuthorID',1)), array('log_PostTime' => 'DESC'), 100, function($articles, $pagebar, $complete){
    // $pagebar pagebar分页对象
    
    if ($complete){
        //已取出全部
    }else{
        //还有数据未取出
    }
    
    //执行你的代码
    foreach ($articles as $article) {
        echo iconv("UTF-8","GB2312//IGNORE", $article->Title."\n");
    }
    ob_flush();
    flush();
    //结束你自己的代码
    
    //return false; //终止,即便还有数据未取出,也不会再去取,也不会执行回调函数。如果继续执行,请不要添加此代码
});

 


THE END
相关文章
评论列表
  • 暂时还没有人评论哦,来占个沙发吧?
发布评论
验证码