应付款终版导入:分块读取工作簿,避免大文件把进程撑爆导致 500 #359

Merged
renshen merged 1 commits from feature/sumu-import-memory-fix into main 2026-10-16 23:15:34 +08:00
Collaborator

现象

生产上「供应商应付(终版)→ 货款对账」导入时浏览器只显示 500,服务器上没有任何异常日志。

原因

导入使用 PhpSpreadsheet 整表载入(load() + toArray()),大文件或带巨大"幽灵区域"的工作簿会让 PHP 进程内存涨到 GB 级(实测 3 万行 xlsx 峰值 425MB 且仍在涨),进程被系统杀掉 → 空 500;同时线上 php.ini 里 log_errors=Off,致命错误不会留下任何日志。

改动

  • PayablesFinalImporter 改为按 2000 行分块读取(只把当前块载入内存),读满 10,000 行立即抛出「请拆分文件」提示,不再走到崩溃;
  • deploy/php.ini 补上 display_errors=Off / log_errors=On / error_log=storage/logs/php-errors.log,以后致命错误可查。

验证

  • SupplierPayableFinalPagesTest 12/12:新增「跨块导入 4,500 行成功」「超过 1 万行给出提示且不写入」两个用例;原有导入/导出/页面用例全部通过。
  • CourierPayableFinalPagesTest / PayablesFinalEntriesTest / SupplierPayableActionsTest / SupplierPayablePagesTest 28/28 通过。
  • 部署后在生产容器内用 3 万行 xlsx 复测:应快速返回「单次最多导入 10,000 条记录」,内存保持在百兆级。

说明

  • 不涉及数据库结构、权限或金额口径;单次导入上限仍为 10,000 行(模板里已写明)。
## 现象 生产上「供应商应付(终版)→ 货款对账」导入时浏览器只显示 500,服务器上没有任何异常日志。 ## 原因 导入使用 PhpSpreadsheet 整表载入(`load()` + `toArray()`),大文件或带巨大"幽灵区域"的工作簿会让 PHP 进程内存涨到 GB 级(实测 3 万行 xlsx 峰值 425MB 且仍在涨),进程被系统杀掉 → 空 500;同时线上 php.ini 里 `log_errors=Off`,致命错误不会留下任何日志。 ## 改动 - `PayablesFinalImporter` 改为按 2000 行分块读取(只把当前块载入内存),读满 10,000 行立即抛出「请拆分文件」提示,不再走到崩溃; - `deploy/php.ini` 补上 `display_errors=Off` / `log_errors=On` / `error_log=storage/logs/php-errors.log`,以后致命错误可查。 ## 验证 - SupplierPayableFinalPagesTest 12/12:新增「跨块导入 4,500 行成功」「超过 1 万行给出提示且不写入」两个用例;原有导入/导出/页面用例全部通过。 - CourierPayableFinalPagesTest / PayablesFinalEntriesTest / SupplierPayableActionsTest / SupplierPayablePagesTest 28/28 通过。 - 部署后在生产容器内用 3 万行 xlsx 复测:应快速返回「单次最多导入 10,000 条记录」,内存保持在百兆级。 ## 说明 - 不涉及数据库结构、权限或金额口径;单次导入上限仍为 10,000 行(模板里已写明)。
renshen added 1 commit 2026-10-16 23:15:31 +08:00
以前整表载入内存(大文件/带幽灵区域的工作簿会让 PHP 进程涨到 GB 级并被系统杀掉,页面只显示一个 500 且没有任何日志);现在按 2000 行分块读取,读满 1 万行立即给出「请拆分文件」提示。部署 php.ini 补上 display_errors=Off / log_errors=On / error_log,避免以后再出现看不到原因的 500。
renshen merged commit 7742163632 into main 2026-10-16 23:15:34 +08:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WuYongJie/CaiWuXiTong#359
No description provided.