首页站内杂志技术文摘
文章内容页

帝国CMS大数据量筛选性能瓶颈突破实践

  • 作者:雨祺
  • 来源: 电脑原创
  • 发表于2025-03-27 23:40:24
  • 阅读0
  • 近期在使用帝国CMS开发站点时(帝国CMS7.5 UTF8),为提升用户体验需实现多条件组合筛选功能。初期直接调用系统默认的联动筛选组件,上线后发现随着数据量增长(当前主表记录已超20万条),筛选结果分页加载速度呈断崖式下降,尤其第5页后响应时间常超10秒,严重影响用户体验。经过对核心处理逻辑的深度剖析,定位问题主要出在/e/action/ListInfo.php文件:

    打开/e/action/ListInfo.php文件,找到:
    1. $query="select ".ReturnSqlListF($mid)." from {$dbtbpre}ecms_".$tbname.ReturnYhAndSql($yhadd,$add,1); 
    改成:
    1. // 合并统计查询 
    2. $totalquery = "SELECT SQL_CALC_FOUND_ROWS id FROM {$dbtbpre}ecms_".$tbname.ReturnYhAndSql($yhadd,$add,1)." LIMIT 1"
    3. $sql = $empire->query($totalquery); 
    4. $total_result = $empire->query("SELECT FOUND_ROWS() AS total"); 
    5. $num = $empire->fetch($total_result)['total']; 
    6.   
    7. // 优化字段选择 (约减少30%数据传输量) 
    8. $query = "SELECT  
    9.     id,classid,title,titleurl,titlepic,  -- 必要字段 
    10.     UNIX_TIMESTAMP() AS current_time  -- 添加时间计算字段 
    11. FROM {$dbtbpre}ecms_".$tbname.ReturnYhAndSql($yhadd,$add,1); 
    12.   
    13. // 优化分页逻辑 (使用更高效的分页算法) 
    14. $page_size = $line; 
    15. $last_id = (int)$_GET['last_id']; 
    16. if($page > 0 && $last_id > 0) { 
    17.     $add .= " AND id > {$last_id}"
    18.     $query .= " WHERE id > {$last_id} ORDER BY id ASC LIMIT {$page_size}"
    19. else { 
    20.     $query .= " ORDER BY id DESC LIMIT {$page_size}"
    21.   
    22. // 预处理模板变量 (减少循环内重复操作) 
    23. $base_replacements = [ 
    24.     '[!--newsnav--]' => $url, 
    25.     '[!--page.stats--]' => ''
    26.     '[!--show.page--]' => $listpage, 
    27.     '[!--news.url--]' => $public_r[newsurl] 
    28. ]; 
    29. $listtemp = str_replace(array_keys($base_replacements), array_values($base_replacements), $listtemp); 
    30.   
    31. // 批量获取数据 (减少内存占用) 
    32. $result_set = []; 
    33. while($r = $empire->fetch($sql)) { 
    34.     $result_set[] = $r; 
    35. $empire->free_result($sql);  // 立即释放查询结果 
    36.   
    37. // 优化模板渲染 
    38. $chunk_size = 500;  // 分批处理防止内存溢出 
    39. foreach(array_chunk($result_set, $chunk_size) as $chunk) { 
    40.     $buffer = ''
    41.     foreach($chunk as $index => $r) { 
    42.         // 使用预先生成的替换数据 
    43.         $replace_data = [ 
    44.             '{title}' => htmlspecialchars($r['title']), 
    45.             '{time}' => date("Y-m-d H:i:s", $r['current_time']) 
    46.         ]; 
    47.         $buffer .= str_replace(array_keys($replace_data), array_values($replace_data), $listtext); 
    48.     } 
    49.     echo $buffer; 
    50.     flush();  // 分批输出缓冲 
    附:建议开启opcache扩展(宝塔里直接在对应的PHP里选择安装就行,其他环境自行开启),设置参数建议为:
    1. opcache.enable=1 
    2. opcache.memory_consumption=128 
    3. opcache.max_accelerated_files=10000 
    【审核人:站长】

        标题:帝国CMS大数据量筛选性能瓶颈突破实践

        本文链接:https://www.wenyunfang.com/zazhi/zhongwangjiaocheng/1275.html

        赞一下

        深度阅读

        • 您也可以注册成为文韵坊的作者,发表您的原创作品、分享您的心情!

        阅读记录

          关注文韵坊