帝国论坛帝国网站管理系统交流区帝国CMS使用交流【优化分享】帝国CMS大数据量筛选性能瓶颈突破实践 【本版专题贴子】  
主题:【优化分享】帝国CMS大数据量筛选性能瓶颈突破实践 [加入收藏夹]   

hanxing3437
用户头衔:举人

精华贴   :0
发贴数   :254
经验值   :1252
注册时间:2009-11-08
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 1 楼]
【优化分享】帝国CMS大数据量筛选性能瓶颈突破实践
近期在使用帝国CMS开发站点时,为提升用户体验需实现多条件组合筛选功能。初期直接调用系统默认的联动筛选组件,上线后发现随着数据量增长(当前主表记录已超20万条),筛选结果分页加载速度呈断崖式下降,尤其第5页后响应时间常超10秒,严重影响用户体验。
经过对核心处理逻辑的深度剖析,定位问题主要出在/e/action/ListInfo.php文件:
打开/e/action/ListInfo.php文件,找到:$query="select ".ReturnSqlListF($mid)." from {$dbtbpre}ecms_".$tbname.ReturnYhAndSql($yhadd,$add,1);
改成:
// 合并统计查询
$totalquery = "SELECT SQL_CALC_FOUND_ROWS id FROM {$dbtbpre}ecms_".$tbname.ReturnYhAndSql($yhadd,$add,1)." LIMIT 1";
$sql = $empire->query($totalquery);
$total_result = $empire->query("SELECT FOUND_ROWS() AS total");
$num = $empire->fetch($total_result)['total'];

// 优化字段选择 (约减少30%数据传输量)
$query = "SELECT
    id,classid,title,titleurl,titlepic,  -- 必要字段
    UNIX_TIMESTAMP() AS current_time  -- 添加时间计算字段
FROM {$dbtbpre}ecms_".$tbname.ReturnYhAndSql($yhadd,$add,1);

// 优化分页逻辑 (使用更高效的分页算法)
$page_size = $line;
$last_id = (int)$_GET['last_id'];
if($page > 0 && $last_id > 0) {
    $add .= " AND id > {$last_id}";
    $query .= " WHERE id > {$last_id} ORDER BY id ASC LIMIT {$page_size}";
} else {
    $query .= " ORDER BY id DESC LIMIT {$page_size}";
}

// 预处理模板变量 (减少循环内重复操作)
$base_replacements = [
    '[!--newsnav--]' => $url,
    '[!--page.stats--]' => '',
    '[!--show.page--]' => $listpage,
    '[!--news.url--]' => $public_r[newsurl]
];
$listtemp = str_replace(array_keys($base_replacements), array_values($base_replacements), $listtemp);

// 批量获取数据 (减少内存占用)
$result_set = [];
while($r = $empire->fetch($sql)) {
    $result_set[] = $r;
}
$empire->free_result($sql);  // 立即释放查询结果

// 优化模板渲染
$chunk_size = 500;  // 分批处理防止内存溢出
foreach(array_chunk($result_set, $chunk_size) as $chunk) {
    $buffer = '';
    foreach($chunk as $index => $r) {
        // 使用预先生成的替换数据
        $replace_data = [
            '{title}' => htmlspecialchars($r['title']),
            '{time}' => date("Y-m-d H:i:s", $r['current_time'])
        ];
        $buffer .= str_replace(array_keys($replace_data), array_values($replace_data), $listtext);
    }
    echo $buffer;
    flush();  // 分批输出缓冲
}

附:期待与各位共同探讨大数据量场景下的CMS性能优化实践。以后更多改进请参考链接:https://www.moyublog.com/notes/1253.html

[该贴被修改 1 次,最后修改时间 2025-03-27 23:30:46 ]


帝国CMS精品模板
帝国CMS经典教程


2025-03-27 22:45:12 已设置保密 顶部 回复 引用 报告 编辑 删除

hanxing3437
用户头衔:举人

精华贴   :0
发贴数   :254
经验值   :1252
注册时间:2009-11-08
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 2 楼]

对了 上面代码针对7.5 更高版本 正式版以后再看吧



帝国CMS精品模板
帝国CMS经典教程


2025-03-27 22:45:44 已设置保密 顶部 回复 引用 报告 编辑 删除

m8hwj7
用户头衔:举人

精华贴   :0
发贴数   :480
经验值   :1419
注册时间:2015-12-08
信息 搜索 好友 发送悄悄话 精益求精-帝国网站管理系统7.5正式版开源发布】   [第 3 楼]

支持




2025-03-28 07:50:52 已设置保密 顶部 回复 引用 报告 编辑 删除

csdn2
用户头衔:探花

精华贴   :0
发贴数   :4760
经验值   :14024
注册时间:2013-11-21
信息 搜索 好友 发送悄悄话 免费开源-EBMA系统:更安全的MYSQL管理和备份系统】   [第 4 楼]

支持下




2025-03-31 07:23:23 已设置保密 顶部 回复 引用 报告 编辑 删除

快速回复
内容

表情
使用EBB代码 使用smile代码 显示签名 自动分析url 自动分析img
     【进入高级模式】   (按 Ctrl+Enter 直接提交)
    顶部  加入收藏夹
关于帝国 | 广告服务 | 联系我们 | 法律声明 | 隐私条款 | 许可协议
Powered by: EBB Version 2.2.1