curl并行下载任务中途生成空文件,关闭并行则正常,请问是什么原因?
问题可能原因
- 服务端同会话并发限制:你的请求携带固定
PHPSESSID属于同一会话,绝大多数业务服务端都会对单会话/单IP的并发请求数做阈值限制,超过阈值后直接拒绝后续请求。而--parallel-immediate参数会强制curl同时建立所有并行连接而非等待现有连接空闲,会大幅提升触发服务端限流规则的概率,被拒绝的请求没有返回内容就会生成空文件。 - curl连接缓存配置不足:日志打印的
Connection cache is full, closing the oldest one说明curl默认的连接缓存上限不足以支撑你的并行下载任务,频繁主动关闭旧连接的逻辑和服务端的TCP连接回收、Keep-Alive配置不兼容,导致后续请求的TCP连接异常中断,没有实际拉取到内容就生成了空文件。 - curl版本并行功能缺陷:7.66.0~7.71.0区间的部分curl版本存在并行下载场景下的连接缓存溢出bug,会导致后续请求的套接字分配异常,未实际发送请求就生成空文件。
保留并行能力的修复方案
- 调整并行参数:将
--parallel-max调低到2~3,同时移除--parallel-immediate参数,让curl优先复用空闲连接而非强制新建连接,降低触发服务端限流的概率。 - 调高连接缓存上限:在命令中添加
--maxconnects 100参数,提升curl的连接缓存上限,避免频繁关闭旧连接导致的传输异常。 - 增加错误重试逻辑:在命令中添加
--retry 3 --retry-delay 1 --fail参数,--fail会让curl请求失败时不生成无效空文件,同时自动重试失败的请求。 - 规避会话限流:如果业务场景允许,可尝试每次请求轮换
PHPSESSID,或去掉会话参数走匿名请求,绕过服务端的同会话并发限制。
内容的提问来源于stack exchange,提问作者Datenkralle
相关产品推荐
相关产品推荐

