无限星辰工作室-客户无限互联网动力之源

标题: Discuz!X 解决由于用户频繁刷新列表导致的慢查询问题(CC攻击防御) [打印本页]

作者: crx349    时间: 2014-1-27 11:02
标题: 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,判断如果是那个无条件的慢查询就不执行了




欢迎光临 无限星辰工作室-客户无限互联网动力之源 (https://xmspace.net/) Powered by Discuz! X3.4