紫影基地

 找回密码
 立即注册
查看: 242|回复: 0

[PHP学习] 缓存论坛数据,优化四格及首页速度(discuz)

[复制链接]
阅读字号:

2002

主题

2117

帖子

21万

积分

超级版主

Rank: 8Rank: 8

积分
210303
发表于 2024-4-7 19:24:33 | 显示全部楼层 |阅读模式




  1. 仅使用3次查询, 即可以完成首页显示.

  2. disucz本身是有缓存系统的, 可缓存的过程被固定了, 没办法新增加缓存内容及方法. 为此, 写了个插件来支持无限的缓存意识, 让部分查询SQL可以稍休息片刻. 这样的作用在于,减轻SQL压力, 更快显示出内容.

  3. 安装方法:
  4. 首先下载function.rar,将里面的php文件上传在根目录.
  5. 下载

  6. 接着打开: index.php

  7. $discuz_action = 1;
  8. 复制代码
  9. 的上一行增加:
  10. include_once('function.php');
  11. 复制代码
  12. 引入function.php文件,里面包含着两个函数.

  13. 接着就可以使用了. 也讲讲原理.比如

  14. $str = cache_read('str',3600); 首先读一下数据   
  15. if(is_array($str)===false){
  16.          //如果读不到数据, 当然就进来了.
  17.          $str = '我是数据';
  18.          cache_write('str',$str);  //再把数据写进去.
  19. }
  20.   echo $str;   // 结果总是一样的.

  21. 两个函数的参数有:
  22. cache_read('标识',过期时间,缓存文件名);
  23. cache_write('标识',$str,缓存文件名);

  24. 现在我们来优化首页四格.
  25. $allarray = cache_read('all',3600);
  26. if(is_array($allarray)===false){
  27. //----首页五格代码开始 缓存开始
  28. $colorarray = array('', 'red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple', 'gray');
  29. //新贴
  30. $hack_cut_str = 28; //标题字数
  31. $hack_cut_strauthor = 9;
  32. $new_post_threadlist = array();
  33. $nthread = array();
  34. $query = $db->query("SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>'$fid' AND f.fid=t.fid AND f.fid not in (0) AND t.displayorder not in (-1,-2) ORDER BY t.dateline DESC LIMIT 0, 10");
  35. while($nthread = $db->fetch_array($query)) {
  36.         $nthread['forumname'] = ereg_replace('<[^>]*>','',$nthread['name']);
  37.         $nthread['view_subject'] = cutstr($nthread['subject'],$hack_cut_str);
  38.         $nthread['view_author'] = cutstr($nthread['author'],$hack_cut_strauthor);
  39.         $nthread['date']= gmdate("$dateformat $timeformat", $nthread['dateline'] + $timeoffset * 3600);
  40.         $nthread['lastreplytime']= gmdate("$dateformat $timeformat", $nthread[lastpost] + ($timeoffset * 3600));
  41.         if($nthread['highlight']) {
  42.                 $string = sprintf('%02d', $nthread['highlight']);
  43.                 $stylestr = sprintf('%03b', $string[0]);
  44.                 $nthread['highlight'] = 'style="';
  45.                 $nthread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
  46.                 $nthread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
  47.                 $nthread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
  48.                 $nthread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
  49.                 $nthread['highlight'] .= '"';
  50.         } else {
  51.                 $nthread['highlight'] = '';
  52.         }
  53.         $new_post_threadlist[] = $nthread;
  54. }
  55. //新回复
  56. $hack_cut_str = 28; //标题字数
  57. $hack_cut_strauthor = 9;
  58. $new_reply_threadlist = array();
  59. $rthread = array();
  60. $query = $db->query("SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>'$fid' AND f.fid=t.fid  AND t.closed NOT LIKE 'moved|%' AND t.replies !=0 AND f.fid not in (0) AND t.displayorder not in (-1,-2) ORDER BY t.lastpost DESC LIMIT 0, 10");
  61. while($rthread = $db->fetch_array($query)) {
  62.         $rthread['forumname'] = ereg_replace('<[^>]*>','',$rthread['name']);
  63.         $rthread['view_subject'] = cutstr($rthread['subject'],$hack_cut_str);
  64.         $rthread['view_lastposter'] = cutstr($rthread['lastposter'],$hack_cut_strauthor);
  65.                 $rthread['date']= gmdate("$dateformat $timeformat", $rthread['dateline'] + $timeoffset * 3600);
  66.         $rthread['lastreplytime']= gmdate("$dateformat $timeformat", $rthread[lastpost] + ($timeoffset * 3600));
  67.         if($rthread['highlight']) {
  68.                 $string = sprintf('%02d', $rthread['highlight']);
  69.                 $stylestr = sprintf('%03b', $string[0]);
  70.                 $rthread['highlight'] = 'style="';
  71.                 $rthread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
  72.                 $rthread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
  73.                 $rthread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
  74.                 $rthread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
  75.                 $rthread['highlight'] .= '"';
  76.         } else {
  77.                 $rthread['highlight'] = '';
  78.         }
  79.         $new_reply_threadlist[] = $rthread;
  80. }

  81. //本月热帖
  82. $hack_cut_str = 30; //标题字数
  83. $hack_cut_strauthor = 9;
  84. $new_hot_threadlist = array();
  85. $mthread = array();
  86. $ctime=$timestamp-3600*24*30;//最后30是天数为本月  
  87. $query = $db->query("SELECT t.*, f.name FROM {$tablepre}threads t, {$tablepre}forums f WHERE t.fid<>'$fid' AND f.fid=t.fid  AND t.closed NOT LIKE 'moved|%' AND t.replies !=0 AND t.dateline>$ctime AND f.fid not in (0) AND t.displayorder not in (-1,-2) ORDER BY t.replies DESC LIMIT 0, 10");
  88. while($mthread = $db->fetch_array($query)) {
  89.         $mthread['forumname'] = ereg_replace('<[^>]*>','',$mthread['name']);
  90.         $mthread['view_subject'] = cutstr($mthread['subject'],$hack_cut_str);
  91.         $mthread['view_lastposter'] = cutstr($mthread['lastposter'],$hack_cut_strauthor);
  92.                 $mthread['date']= gmdate("$dateformat $timeformat", $mthread['dateline'] + $timeoffset * 3600);
  93.         $mthread['lastreplytime']= gmdate("$dateformat $timeformat", $mthread[lastpost] + ($timeoffset * 3600));
  94.         if($mthread['highlight']) {
  95.                 $string = sprintf('%02d', $mthread['highlight']);
  96.                 $stylestr = sprintf('%03b', $string[0]);
  97.                 $mthread['highlight'] = 'style="';
  98.                 $mthread['highlight'] .= $stylestr[0] ? 'font-weight: bold;' : '';
  99.                 $mthread['highlight'] .= $stylestr[1] ? 'font-style: italic;' : '';
  100.                 $mthread['highlight'] .= $stylestr[2] ? 'text-decoration: underline;' : '';
  101.                 $mthread['highlight'] .= $string[1] ? 'color: '.$colorarray[$string[1]] : '';
  102.                 $mthread['highlight'] .= '"';
  103.         } else {
  104.                 $mthread['highlight'] = '';
  105.         }
  106.         $new_hot_threadlist[] = $mthread;
  107. }

  108. //今日发贴排行
  109. $tomonth=date(n);
  110. $todate=date(j);
  111. $toyear=date(Y);
  112. $time=mktime(0,0,0,$tomonth,$todate,$toyear);
  113. $query=$db->query("select count(pid) as num,authorid,author from $tablepre"."posts where dateline>=$time group by authorid order by num desc limit 0,10");
  114. while($result=$db->fetch_array($query)){
  115.         $poststar.="<a href=space.php?uid=".$result[authorid].">".cutstr($result[author],8)."</a><font color=red>[".$result[num]."]</font>  ";
  116. }
  117. $allarray['new'] =$new_post_threadlist;
  118. $allarray['reply'] =$new_reply_threadlist;
  119. $allarray['hot'] =$new_hot_threadlist;
  120. $allarray['poststar'] =$poststar;
  121. cache_write('all',$allarray);
  122. //----首页五格代码结束
  123. }
  124. //将数据重新归位.
  125. $new_post_threadlist = $allarray['new'];
  126. $new_reply_threadlist = $allarray['reply'];
  127. $new_hot_threadlist = $allarray['hot'];
  128. $poststar = $allarray['poststar'];
  129. 复制代码
  130. 还有对首页版块的缓存:
  131.         $mysqlda = cache_read('all2',3600);
  132.         if(is_array($mysqlda)===false){
  133.         $sql = !empty($accessmasks) ?
  134.                                 "SELECT f.fid, f.fup, f.type, f.name, f.threads, f.posts, f.todayposts, f.lastpost, f.inheritedmod, f.forumcolumns, f.simple, ff.description, ff.moderators, ff.icon, ff.viewperm, ff.redirect, a.allowview FROM {$tablepre}forums f
  135.                                         LEFT JOIN {$tablepre}forumfields ff ON ff.fid=f.fid
  136.                                         LEFT JOIN {$tablepre}access a ON a.uid='$discuz_uid' AND a.fid=f.fid
  137.                                         WHERE f.status>0 ORDER BY f.type, f.displayorder"
  138.                                 : "SELECT f.fid, f.fup, f.type, f.name, f.threads, f.posts, f.todayposts, f.lastpost, f.inheritedmod, f.forumcolumns, f.simple, ff.description, ff.moderators, ff.icon, ff.viewperm, ff.redirect FROM {$tablepre}forums f
  139.                                         LEFT JOIN {$tablepre}forumfields ff USING(fid)
  140.                                         WHERE f.status>0 ORDER BY f.type, f.displayorder";

  141.         $query = $db->query($sql);

  142.         while($row = $db->fetch_array($query)) {
  143.                 $fourmsdata[] = $row;
  144.         }
  145.         $mysqlda['fourmsdata'] = $fourmsdata;
  146.         cache_write('all2',$mysqlda);
  147.         }
  148.         $fourmsdata = $mysqlda['fourmsdata'];
  149. 复制代码
  150. 现在看看底部, 会发现SQL查询从8次, 变成3次了.  速度肯定会加快.

  151. 举一反三, 许多数据都可以这样来缓存.  
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|紫影基地

GMT+8, 2025-1-12 09:44 , Processed in 0.083153 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表