点导出后页面静止 40 秒没有任何提示,用户以为没反应又点了两次,最后收到三封邮件。日志里能对上时间点,这种反而好排。

导出走同步请求,浏览器在等响应期间没有任何状态变化。前端没有 loading 态,也没有轮询进度的接口。这一点先确认清楚,后面就不用反复试。

$progress = get_transient('export_' . $job_id);
set_transient('export_' . $job_id, ['done' => $i, 'total' => $total], 600);

这次卡住的地方就在「导出进度反馈」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。

日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。

处理上按这个顺序:点击后立刻显示进度条和已处理条数;后端分批处理并把进度写进缓存 前端每 2 秒轮询一次;完成后自动触发下载并提示文件已生成。

结果对不对很好判断,导出全程能看到百分比变化,完成时自动开始下载。

作者 9823189