先确认问题落在哪一层

列表浏览正常,点击Export CSV就Allowed memory size exhausted。导出会遍历全部筛选结果,自定义列在每行load实体会迅速放大内存。

记录导出筛选条件、总行数和OOM堆栈。先用100、1000、10000行逐级测试,观察内存是否线性增长或突然跳升。

检查Grid Collection是否select了大字段、join造成重复行,Renderer/DataProvider是否在每行调用Repository getById。把所需字段一次join或批量预取。

php -d memory_limit=512M bin/magento vendor:export --page-size=1000 --from-id=1
rg -n 'getCsvFile|getCsv|_prepareCollection|addFieldToFilter|getById' app/code
SELECT COUNT(*) FROM target_table WHERE created_at BETWEEN :from AND :to;

实际修复

  • 大数据导出改为固定页大小读取并流式写临时文件/响应,每页clear集合与实体缓存。排序必须稳定(例如entity_id),避免翻页重复漏行。
  • 若导出需要分钟级时间,改成队列任务并提供下载链接;限制用户可导出的最大范围和临时文件保留时间。

怎样才算修好

用边界数据量导出,CSV行数与COUNT一致,首尾ID无缺失重复,内存峰值在分页增加后保持稳定;中文和公式开头字段正确转义。