Prestashop 1.7.8.5分类页与产品分页加载慢故障修复咨询
Prestashop 1.7.8.5 分类页加载致CPU占满故障修复
故障基础信息
- 异常触发场景:访问分类页、点击分页器切换产品列表页码时触发,无相关操作时服务器CPU、内存占用始终正常
- 异常表现:页面加载需等待数秒,触发操作时服务器CPU占用飙升至100%,内存占用同步升至高位
- 已排除诱因:缓存配置异常、PHP配置不符合官方要求
- 官方定位根因:
ybc_themeconfig模块新增的产品列表Ajax工具逻辑异常
修复方案
方案1:快速止血(优先采用,5分钟生效)
直接关闭模块自带的异常Ajax加载功能,回归Prestashop原生分页逻辑:
- 进入站点后台,打开「模块与服务」-「已安装模块」,找到
ybc_themeconfig模块进入配置页 - 定位到和「产品列表Ajax加载、无刷新分页、Ajax筛选」相关的配置项,全部设置为关闭状态,保存配置
- 清空站点全量缓存:包括后台「高级参数」-「性能」里的全部缓存,以及服务器上
/var/cache/目录下prod、dev文件夹内的所有文件 - 重新访问分类页、切换分页验证即可
这个故障的核心诱因是该模块的Ajax加载逻辑没有做数据库层分页,每次请求会拉取当前分类下所有产品数据到内存中再做切割分页,分类下产品量稍大就会直接打满CPU、内存。关闭自带Ajax功能后走原生分页逻辑,资源占用会立刻恢复到正常水平。
方案2:保留Ajax无刷新效果的代码修复
如果需要保留无刷新切换分页的体验,直接修正模块的查询逻辑bug:
- 找到模块的Ajax请求处理文件,通常位于
/modules/ybc_themeconfig/ajax.php,或是模块目录下controllers/front/路径内的产品列表加载控制器 - 定位到产品数据查询的代码段,找到调用
getProducts()方法时未传入分页参数、偏移量参数的问题代码 - 参考Prestashop原生产品查询逻辑补全分页参数,示例代码如下:
// 从前端请求中获取当前页码、每页展示数量参数 $page = (int)Tools::getValue('page', 1); $itemsPerPage = (int)Configuration::get('PS_PRODUCTS_PER_PAGE'); // 补全分页参数、偏移量参数,避免全量拉取产品数据 $productList = $category->getProducts( $this->context->language->id, $page, $itemsPerPage, 'position', 'asc', null, null, false, false, false, $itemsPerPage * ($page - 1) );
- 额外排查循环查询问题:如果代码中存在遍历产品列表时,单独查询每个产品的图片、库存、属性数据的逻辑,要改成批量关联查询,把单页请求的数据库查询次数降到个位数
- 修改完成后清空全量缓存,压测验证分页请求的资源占用即可
方案3:版本替换
如果不想修改代码,可以直接升级当前使用的YBC主题到最新兼容版本,新版本主题已经修复了该Ajax查询的逻辑bug。升级前务必备份全量站点文件和数据库,升级完成后重新保存主题配置、清空缓存验证即可。如果主题没有更新版本,可以直接停用ybc_themeconfig模块的Ajax分页组件,替换为兼容1.7.8.5版本的社区Ajax分页模块。
内容的提问来源于stack exchange,提问作者alesspetio01
相关产品推荐
相关产品推荐

