这类问题我又碰上了一次。后台导出数据时页面报执行时间超出限制,导出一半中断,用户只能反复重试。
把日志和配置对完,能解释这个现象的基本就这几处。脚本执行时间超过配置上限;数据库查询慢,把时间耗在等待上;输出被缓冲,前端看不到进度以为卡死。
上来先看运行时实际限制
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
手上没有现成的复现脚本,就照着线上请求手工拼了一个。
报错是间歇性的,我蹲守了半小时才抓到一次完整现场。
改完先别撤,确认这几项。导出任务能完整执行,页面不再报超时,长任务走队列后前端立即返回。
容易忽略的是,无限延长执行时间会一直占着进程,导出量大时很容易把进程池拖满;异步队列才是正确方向,前端也能立刻拿到受理结果。报错文案容易误导,真正的原因往往在相邻那一层的日志里。