找回密码
 立即注册

QQ登录

只需一步,快速开始

Discuz!X 解决由于用户频繁刷新列表导致的慢查询问题(CC攻击防御)

问题描述:由于用户量访问量大或恶意用户频繁刷新列表,导致系统资源占用巨大或mysql出现慢查询,拖慢服务器运行。

故障原因:
经排查是source/class/table/table_forum_thread.php里的fetch_all_search函数生成的这个查询导致的

  1. public function fetch_all_search($conditions, $tableid = 0, $start = 0, $limit = 0, $order = '', $sort = 'DESC', $forceindex='') {
  2.                 $ordersql = '';
  3.                 if(!empty($order)) {
  4.                         $ordersql =  " ORDER BY $order $sort ";
  5.                 }
  6.                 $data = array();
  7.                 $tlkey = !empty($conditions['inforum']) && !is_array($conditions['inforum']) ? $conditions['inforum'] : '';
  8.                 $firstpage = false;
  9.                 $defult = count($conditions) < 5 ? true : false;
  10.                 if(count($conditions) < 5) {
  11.                         foreach(array_keys($conditions) as $key) {
  12.                                 if(!in_array($key, array('inforum', 'sticky', 'displayorder', 'intids'))) {
  13.                                         $defult = false;
  14.                                         break;
  15.                                 }
  16.                         }
  17.                 }
  18.                 if(!defined('IN_MOBILE') && $defult && $conditions['sticky'] == 4 && $start == 0 && $limit && strtolower(preg_replace("/\s?/ies", '', $order)) == 'displayorderdesc,lastpostdesc' && empty($sort)) {
  19.                         foreach($conditions['displayorder'] as $id) {
  20.                                 if($id < 2) {
  21.                                         $firstpage = true;
  22.                                         if($id < 0) {
  23.                                                 $firstpage = false;
  24.                                                 break;
  25.                                         }
  26.                                 }
  27.                         }
  28.                         if($firstpage && !empty($tlkey) && ($ttl = getglobal('setting/memory/forum_thread_forumdisplay')) !== null && ($data = $this->fetch_cache($tlkey, 'forumdisplay_')) !== false) {
  29.                                 $delusers = $this->fetch_cache('deleteuids', '');
  30.                                 if(!empty($delusers)) {
  31.                                         foreach($data as $tid => $value) {
  32.                                                 if(isset($delusers[$value['authorid']])) {
  33.                                                         $data = array();
  34.                                                 }
  35.                                         }
  36.                                 }
  37.                                 if($data) {
  38.                                         return $data;
  39.                                 }
  40.                         }
  41.                 }
  42.                 $data = DB::fetch_all("SELECT * FROM ".DB::table($this->get_table_name($tableid))." $forceindex".$this->search_condition($conditions)." $ordersql ".DB::limit($start, $limit));
  43.                 if($firstpage && !empty($tlkey) && ($ttl = getglobal('setting/memory/forum_thread_forumdisplay')) !== null) {
  44.                         $this->store_cache($tlkey, $data, $ttl, 'forumdisplay_');
  45.                 }
  46.                 return $data;
  47.         }
复制代码


解决办法:改了一下最后那里的sql,判断如果是那个无条件的慢查询就不执行了

本教程由无限星辰工作室CRX349独家整理和提供,转载请注明地址,谢谢。本文地址:https://www.xmspace.net/thread-116-1-1.html
无限星辰工作室  好集导航 Discuz全集下载  星辰站长网  集热爱361  一品文学  手机小游戏合集   海外空间网 星辰api  星辰支付二维码管理平台 阿里云服务器 腾讯云服务器
服务Discuz!建站|DiscuzQ配置|二开|小程序|APP|搬家|挂马清理|防护|Win/Linux环境搭建|优化|运维|
服务理念:专业 诚信 友好QQ842062626 服务项目 Q群315524225

发表于 2014-1-27 11:02:00 | 显示全部楼层 |阅读模式

回复 | 使用道具 举报

该帖共收到 0 条回复!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

美图秀

    • fastadmin 后台界面使用字段数组类型
    • Discuz!x3.5 修改标题高亮颜色
    • Discuz!x3.5 应用中心 下载应用一直下载中
    • 帖子定时显示
    • 论坛辅助审核
拖动客服框
Online Service
点击这里给我发消息
点击这里联系我们
微信扫一扫
在线客服
快速回复 返回顶部 返回列表