修罗高性能获取随机帖子探讨建站心得

已认证已通过实名认证xiuno
管理员
官方成员
2020-7-16 2255

自己写的高性能获取随机帖子代码,分享给大家,不足之处请高手指点!为什么不直接用MySQL语句,据我测试发现兼容性不好,不知道是否我MySQL配置问题。如果您有更好的方法请多指!

代码如下:

function get_rand_thread($num = 20, $cond = array()){
    global $db,$forumlist_show;
    $tablepre = $db->tablepre;
    $fids = arrlist_values($forumlist_show, 'fid');
    $cond['fid'] = $fids;
    $condsql = db_cond_to_sqladd($cond);
    $maxmincount = db_sql_find_one("SELECT MAX(tid), MIN(tid), COUNT(*) FROM {$tablepre}thread {$condsql}");
    list($max, $min, $count) = array_values($maxmincount);
    if($count <= $num){
        //符合条件的数据比指定的数据还少,直接全部读取吧,打散一下
        $sql = "SELECT * FROM {$tablepre}thread {$condsql}";
        $threads = db_sql_find($sql);
        shuffle($threads);
    } else {
        //随机读取帖子,万一存在不符合条件的帖子,数量就少于$num个了,那继续读取,直到数量足够为止
        $threads = array();
        do {
            $rndtids = array();
            //生成随机tid,防止重复
            for($i=$num;$i>0;$i--){
                do {
                    $rand = rand($min, $max);
                } while(in_array($rand, $rndtids));
                $rndtids[] = $rand;
            }
            $cond['tid'] = $rndtids;
            $condsql = db_cond_to_sqladd($cond);
            $sql = "SELECT * FROM {$tablepre}thread {$condsql}";
            $rndthreads = db_sql_find($sql);
            $threads += $rndthreads;
        } while(count($threads)<$num);
    }
    //数据格式化一下
    if($threads) foreach ($threads as &$thread) thread_format($thread);
    return $threads;
}


最后于 2020-9-10被xiuno编辑,原因:

未登录提示:


关闭
最新回复 (4)
  • ConanKaito
    黑铁
    2
    6666
    2020-7-24 回复
  • 哥哥
    黑铁
    3
    66666
    2020-8-11 回复
  • seo456
    黑铁
    4
    好东西
    2020-8-18 回复
  • 已通过实名认证王龙
    黑铁
    5
    能用吗
    2020-12-18 回复
    • Xiuno顶尖网
      6
        登陆 注册
在线客服

特别说明

QQ客服仅提供有偿服务,如无付费意愿,请勿扰!一般问题请站内发帖咨询!
服务项目:
1,xiuno插件模板定制开发
2,xiuno网站BUG修复
3,xiuno个性化定制
4,xiuno仿站等

客服工作时间:8:00~22:00
在线客服