帝国CMS比较高效的随机调用方法
时间:2024年03月31日
/来源:网络
/编辑:佚名
不少人喜欢用ORDER BY RAND()随机调用,随机调用是最耗资源的一种调用方式,信息数在1万以上随机调用就开始影响速度。比like模糊匹配更占用资源!!!使用时建议慎之又慎。如果你能惹受乌龟爬的速度就当没说了!
如果确实要使用,可以参照帝国开发者王猛同志的逻辑思路:先用php随机出信息ID,然后SQL调用用id in (php随机的ID列表) 这样索引就能起到作用了!
那我们以文章表举例一下,调用举例:
<?php
$bid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id desc");
$randnum=10;//随机数量
$randids='';
$randdh='';
$minId=1;
$maxId=$bid['id'];
$idRange=range($minId,$maxId);//生成ID范围数组
shuffle($idRange);//随机打乱数组顺序
foreach($idRange as $randomId){
$randids.=$randdh.$randomId;
$randdh=',';
$randnum--;
if($randnum<=0){
break;
}
}
?>
[e:loop={'article',10,18,0,"id in ($randids)"}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br>
[/e:loop]
由于数据删除那就会存在ID不连续的情况,这样就会导致随机的id可能不存在,调用少了!那就只能加大马力给服务器增加压力查询验证下随机出来的ID是否存在咯!代码如下:
<?php
$sid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id asc");
$bid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id desc");
$randnum=10;
$randids='';
$randdh='';
$possible_ids=range($sid['id'],$bid['id']);
shuffle($possible_ids);
foreach($possible_ids as $randomId){
$r = $empire->fetch1("select id from {$dbtbpre}ecms_article where id = $randomId");
if($r['id']){
$randids.=$randdh.$randomId;
$randdh=',';
$randnum--;
}
if($randnum<=0){
break;
}
}
?>
[e:loop={'article',10,18,0,"id in ($randids)"}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br>
[/e:loop]
上面两种代码经过在本站文章数据表拥有将近12万篇文章的情况下!不管是静态生成还是动态浏览速度就大大的提高了!毕竟有充分利用到索引id字段。
当然也还有一种方法!敬请脑补!循环出来的ID转为数组在与文章表的数组进行去重后再合并数组在转为字符获得有用的随机ID!
不管哪种方法!帝国模板是支持PHP的,都可以借用memcached或者redis这样的内存把缓存时间设置长点!比如缓存一天的时间更能大大提高生成速度与动态速度!
总之:尽量不要用随机调用!这个确实是很浪费服务器资源!数据多会造成服务器资源耗尽!
如果确实要使用,可以参照帝国开发者王猛同志的逻辑思路:先用php随机出信息ID,然后SQL调用用id in (php随机的ID列表) 这样索引就能起到作用了!
那我们以文章表举例一下,调用举例:
<?php
$bid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id desc");
$randnum=10;//随机数量
$randids='';
$randdh='';
$minId=1;
$maxId=$bid['id'];
$idRange=range($minId,$maxId);//生成ID范围数组
shuffle($idRange);//随机打乱数组顺序
foreach($idRange as $randomId){
$randids.=$randdh.$randomId;
$randdh=',';
$randnum--;
if($randnum<=0){
break;
}
}
?>
[e:loop={'article',10,18,0,"id in ($randids)"}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br>
[/e:loop]
由于数据删除那就会存在ID不连续的情况,这样就会导致随机的id可能不存在,调用少了!那就只能加大马力给服务器增加压力查询验证下随机出来的ID是否存在咯!代码如下:
<?php
$sid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id asc");
$bid=$empire->fetch1("select id from {$dbtbpre}ecms_article order by id desc");
$randnum=10;
$randids='';
$randdh='';
$possible_ids=range($sid['id'],$bid['id']);
shuffle($possible_ids);
foreach($possible_ids as $randomId){
$r = $empire->fetch1("select id from {$dbtbpre}ecms_article where id = $randomId");
if($r['id']){
$randids.=$randdh.$randomId;
$randdh=',';
$randnum--;
}
if($randnum<=0){
break;
}
}
?>
[e:loop={'article',10,18,0,"id in ($randids)"}]
<a href="<?=$bqsr['titleurl']?>" target="_blank"><?=$bqr['title']?></a> <br>
[/e:loop]
上面两种代码经过在本站文章数据表拥有将近12万篇文章的情况下!不管是静态生成还是动态浏览速度就大大的提高了!毕竟有充分利用到索引id字段。
当然也还有一种方法!敬请脑补!循环出来的ID转为数组在与文章表的数组进行去重后再合并数组在转为字符获得有用的随机ID!
不管哪种方法!帝国模板是支持PHP的,都可以借用memcached或者redis这样的内存把缓存时间设置长点!比如缓存一天的时间更能大大提高生成速度与动态速度!
总之:尽量不要用随机调用!这个确实是很浪费服务器资源!数据多会造成服务器资源耗尽!
新闻资讯 更多
- 【帝国cms教程】帝国CMS模板变量$GLOBALS[navclassid]用法分析04-03
- 【帝国cms教程】鲜为人知帝国CMS内容页调用上一篇和下一篇的精华方法汇总04-03
- 【帝国cms教程】怎么快速找出帝国CMS数据库配置文件路径及迁移网站后修改技巧!04-03
- 【帝国cms教程】帝国CMS模板$GLOBALS[navclassid]用法详解04-03
- 【帝国cms教程】帝国cms 7.5版列表页分页样式修改笔记04-02
- 【帝国cms教程】解决帝国CMS搜索页面模板不支持灵动标签和万能标签的方法04-02
- 【帝国cms教程】帝国CMS只备份栏目和模板的方法04-02
- 【帝国cms教程】帝国CMS怎样删除清空数据库记录?04-02
热门文章
- 178Moban源码谈谈免费源码与收费源码的区别
- 2帝国CMS忘记后台登陆用户名、密码、认证码的解决方法
- 3帝国CMS(EmpireCMS) v7.5后台任意代码执行漏洞及具体修复方法
- 4帝国CMS和WordPress 哪个好?哪个适合建站?
- 5如何解决Discuz的密码错误次数过多请15分钟后登陆的问题
- 6帝国cms灵动标签取得内容和栏目链接地址
- 7emlog pro 注册码“开心”教程(如果有一天,emlog官方版 或者 emlog免费版 跑路了,那用户怎么办?)
- 8织梦CMS在nginx下设置伪静态方法(附nginx伪静态规则)
- 9帝国cms后台登录出现”您还未登录”怎么解决?
- 10帝国cms7.5忘记登录密码 和忘记登录认证码以及多次登录 失败被锁定解决办法