技术文摘

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

作者:雨祺   发表于:
浏览:65次    字数:1407  电脑原创
级别:站长   总稿:79篇, 月稿:10
近期在使用帝国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 

【审核人:站长】

99Ai聊天   收藏   加好友   海报   67分享
点赞(0)
打赏
标签:帝国CMS帝国

发布者资料

热门文章

技术文摘

查看更多技术文摘
    首页
    栏目
    搜索
    会员
    投稿