zblog php静态的缓存数据保存成txt等文本来(文章归档按照年份输出源代码放出)实现自由调用减少数据查询次数
时间:2023年05月24日
/来源:网络
/编辑:佚名
思路:在看别人主题(看鸟儿博客第一次引用这个函数可以存放文本)的文章归档的时候发现这样的代码:
PHP
$str=file_get_contents($zbp->usersdir . 'cache/tblog5_archive.txt');
这就是调用txt文本静态文件。
这样可以有效减轻数据库的查询次数。下次我们使用的时候直接调用就可以了。
但是这样的txt文件怎么产生喃。步骤如下:
一、挂接接口
PHP
Add_Filter_Plugin('Filter_Plugin_Zbp_BuildModule','tblog5_CacheArchive');
二、写函数(这是文章归档的代码)
PHP
function tblog5_CacheArchive2() {
global $zbp;
$i = $zbp->modulesbyfilename['archives']->MaxLi;
if($i<0)return '';
//开始
$select=array(array('max','log_PostTime','ccmax'),array('min','log_PostTime','ccmin'));
$where=array(array('=','log_Type',0),array('=','log_Status',0));
$sql=$zbp->db->sql->Count($GLOBALS['table']['Post'],$select,$where,null);
$array=$zbp->db->Query($sql);
$min=0;
$max=0;
if(count($array)>0){
foreach($array as $u){
$max=(int)date('Y',GetValueInArray($u,'ccmax'));
$min=(int)date('Y',GetValueInArray($u,'ccmin'));
}
}
if($min==0 || $max==0){
return;
}
for($i=$min;$i<=$max;$i++){
$year_as[]=$i;
}
$s='';
foreach($year_as as $year_a){
//判断这年有无文章
$beginy=mktime(0,0,0,1,1,$year_a);
$endy=mktime(23,59,59,12,31,$year_a);
$sql2 = $zbp->db->sql->Count($zbp->table['Post'], array(array('COUNT', '*', 'num')), array(array('=', 'log_Type', '0'), array('=', 'log_Status', '0'), array('BETWEEN', 'log_PostTime', $beginy, $endy)));
$n = GetValueInArrayByCurrent($zbp->db->Query($sql2), 'num');
if($n>0){
$s .='<h3 class="al_year">'.$year_a.'年('.$n.')</h3>';
}
//判断是否有文章结束
//月份开始
for ($i = 1; $i <13; $i++) {
$dayend=cal_days_in_month(CAL_GREGORIAN,$i,$year_a);
$begin=mktime(0,0,0,$i,1,$year_a);
$end=mktime(23,59,59,$i,$dayend,$year_a);
$articles1=$zbp->GetArticleList(null,array(array('=','log_Type',0),array('=','log_Status',0),array('>=','log_posttime',$begin),array('<=','log_posttime',$end)),array('log_posttime'=>'desc'),null,null);
if(count($articles1)>0){
$s .= '<ul class="al_mon_list"><li><span class="al_mon" style="cursor: s-resize;">'.$i.' 月<em>( '.count($articles1).' 篇文章 )</em></span>
<ul class="al_post_list" style="display: block;">';
foreach($articles1 as $article){
$s .= '<li>'.$article->Time('d').'日:<a href="'.$article->Url.'">'.$article->Title.'</a><em>(评论'.$article->CommNums.')</em></li>';
}
$s .= '</ul></li></ul>';
}
}
//月份结束
}
file_put_contents($zbp->usersdir . 'cache/endskin_archive.txt', $s);
//结束
}
这样就实现了刷新缓存(或者提交文章等)的时候自动更新(新建)txt文本缓存(重新编译模板)了,之后你就可以调用这个txt文本了。。希望对你有用。(代码有点长,,,)
经过sf的指点:这里的接口挂接可以根据用户的需求来挂接不同的接口。
如果是需要实现每次对应数据的更新,比如用户评论了来触发这个这个更新,就用上面的接口就可以了。
但是如果你只是把这个数据只有在某一特定时期更新,比如上面的文章归档,只有文章提交成功的时候才更新,则就可以用如下的接口:
Filter_Plugin_PostArticle_Succeed
PHP
$str=file_get_contents($zbp->usersdir . 'cache/tblog5_archive.txt');
这就是调用txt文本静态文件。
这样可以有效减轻数据库的查询次数。下次我们使用的时候直接调用就可以了。
但是这样的txt文件怎么产生喃。步骤如下:
一、挂接接口
PHP
Add_Filter_Plugin('Filter_Plugin_Zbp_BuildModule','tblog5_CacheArchive');
二、写函数(这是文章归档的代码)
PHP
function tblog5_CacheArchive2() {
global $zbp;
$i = $zbp->modulesbyfilename['archives']->MaxLi;
if($i<0)return '';
//开始
$select=array(array('max','log_PostTime','ccmax'),array('min','log_PostTime','ccmin'));
$where=array(array('=','log_Type',0),array('=','log_Status',0));
$sql=$zbp->db->sql->Count($GLOBALS['table']['Post'],$select,$where,null);
$array=$zbp->db->Query($sql);
$min=0;
$max=0;
if(count($array)>0){
foreach($array as $u){
$max=(int)date('Y',GetValueInArray($u,'ccmax'));
$min=(int)date('Y',GetValueInArray($u,'ccmin'));
}
}
if($min==0 || $max==0){
return;
}
for($i=$min;$i<=$max;$i++){
$year_as[]=$i;
}
$s='';
foreach($year_as as $year_a){
//判断这年有无文章
$beginy=mktime(0,0,0,1,1,$year_a);
$endy=mktime(23,59,59,12,31,$year_a);
$sql2 = $zbp->db->sql->Count($zbp->table['Post'], array(array('COUNT', '*', 'num')), array(array('=', 'log_Type', '0'), array('=', 'log_Status', '0'), array('BETWEEN', 'log_PostTime', $beginy, $endy)));
$n = GetValueInArrayByCurrent($zbp->db->Query($sql2), 'num');
if($n>0){
$s .='<h3 class="al_year">'.$year_a.'年('.$n.')</h3>';
}
//判断是否有文章结束
//月份开始
for ($i = 1; $i <13; $i++) {
$dayend=cal_days_in_month(CAL_GREGORIAN,$i,$year_a);
$begin=mktime(0,0,0,$i,1,$year_a);
$end=mktime(23,59,59,$i,$dayend,$year_a);
$articles1=$zbp->GetArticleList(null,array(array('=','log_Type',0),array('=','log_Status',0),array('>=','log_posttime',$begin),array('<=','log_posttime',$end)),array('log_posttime'=>'desc'),null,null);
if(count($articles1)>0){
$s .= '<ul class="al_mon_list"><li><span class="al_mon" style="cursor: s-resize;">'.$i.' 月<em>( '.count($articles1).' 篇文章 )</em></span>
<ul class="al_post_list" style="display: block;">';
foreach($articles1 as $article){
$s .= '<li>'.$article->Time('d').'日:<a href="'.$article->Url.'">'.$article->Title.'</a><em>(评论'.$article->CommNums.')</em></li>';
}
$s .= '</ul></li></ul>';
}
}
//月份结束
}
file_put_contents($zbp->usersdir . 'cache/endskin_archive.txt', $s);
//结束
}
这样就实现了刷新缓存(或者提交文章等)的时候自动更新(新建)txt文本缓存(重新编译模板)了,之后你就可以调用这个txt文本了。。希望对你有用。(代码有点长,,,)
经过sf的指点:这里的接口挂接可以根据用户的需求来挂接不同的接口。
如果是需要实现每次对应数据的更新,比如用户评论了来触发这个这个更新,就用上面的接口就可以了。
但是如果你只是把这个数据只有在某一特定时期更新,比如上面的文章归档,只有文章提交成功的时候才更新,则就可以用如下的接口:
Filter_Plugin_PostArticle_Succeed
新闻资讯 更多
热门文章
- 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忘记登录密码 和忘记登录认证码以及多次登录 失败被锁定解决办法