这类问题我又碰上了一次。后台导出数据时页面报执行时间超出限制,导出一半中断,用户只能反复重试。

把日志和配置对完,能解释这个现象的基本就这几处。脚本执行时间超过配置上限;数据库查询慢,把时间耗在等待上;输出被缓冲,前端看不到进度以为卡死。

上来先看运行时实际限制

php -i | grep max_execution_time

随后按需延长并限制范围

grep -n max_execution_time /etc/php.ini

接着把长任务改成异步处理

grep -rn 'set_time_limit' app/

末了确认缓冲与超时参数

grep -n output_buffering /etc/php.ini

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

报错是间歇性的,我蹲守了半小时才抓到一次完整现场。

改完先别撤,确认这几项。导出任务能完整执行,页面不再报超时,长任务走队列后前端立即返回。

容易忽略的是,无限延长执行时间会一直占着进程,导出量大时很容易把进程池拖满;异步队列才是正确方向,前端也能立刻拿到受理结果。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189