后台编辑分类时,页面打开很快,但点击“保存”后要等几十秒甚至超时,问题通常不在浏览器,而在分类保存触发的数据库写入、商品关联更新、索引或第三方事件。先记录一次请求的总耗时和 HTTP 状态,不要一开始就清空所有缓存。
先判断时间花在 PHP 还是数据库
在浏览器 Network 中找到分类保存请求,观察 Waiting/TTFB。如果请求很快返回但页面跳转慢,再查代理和静态资源;如果 TTFB 本身很长,同时查看 var/log/system.log、var/log/exception.log 与 PHP-FPM slow log。保存期间可在数据库执行:
SHOW FULL PROCESSLIST;
SHOW ENGINE INNODB STATUS\G
如果看到对 catalog_category_entity、catalog_category_product 或索引表的锁等待,应该先找持锁事务。不要直接杀掉所有数据库连接,先确认是否有批量导入、索引或长时间未提交的自定义脚本。
分类商品越多,保存动作越值得检查
分类页面提交的商品关联会更新大量 position 数据。若只有商品很多的分类保存慢,检查表单是否提交了异常大的商品集合,以及扩展是否逐个加载完整商品对象。一个常见的低效写法是在分类保存 observer 中循环调用 repository 的 getById();它会放大 EAV 查询和插件链。更合理的做法是只读取需要的属性,或让资源模型批量处理。
同时检查索引模式:
bin/magento indexer:show-mode
bin/magento indexer:status
bin/magento cron:run --group index
生产站通常使用“按计划更新”。如果分类商品索引被改为“保存时更新”,一次后台保存可能同步完成大量索引工作。切换模式前要确认 Cron 正常,否则只是把慢保存变成前台数据长期不更新。
排除插件时看执行顺序,不要直接删模块
分类保存会经过 repository、资源模型事件及 URL 重写等链路。开启数据库 profiler 或应用性能监控后,比较原生保存与启用第三方模块时的调用耗时。重点查 catalog_category_save_before、catalog_category_save_after、repository plugin,以及生成 URL Rewrite 的定制逻辑。
修复后分别用空分类、几十个商品的分类和大量商品的分类各保存一次,记录 TTFB、SQL 数量和锁等待。只有三种规模下耗时都稳定,且分类商品、URL 和索引结果正确,才能说明根因已经处理,而不是偶然避开了锁。

