cURL发送1MB大小POST参数耗时久 如何优化将响应提速至毫秒级
核心问题排查
你当前配置的CURLOPT_ENCODING参数仅用于告知服务端你支持的响应压缩格式、且cURL会自动解压对应的响应内容,完全不会对发送的请求体做压缩,所以你之前开的gzip配置没作用在要发的1MB polyline数据上,这是耗时高的核心原因。
优化方案
1. 手动压缩请求体+修改请求头告知服务端压缩格式
直接把POST数据做gzip压缩后再发送,同时添加Content-Encoding: gzip请求头告知服务端按gzip格式解析请求体。1MB的纯文本地理坐标数据压缩比通常能到10:1以上,压缩后体积仅100KB左右,传输耗时会大幅下降。
2. 禁用cURL的Expect: 100-continue逻辑
cURL发送大于1KB的POST请求时,默认会先发Expect: 100-continue请求头等服务端响应后再发实际数据,会多一次RTT耗时,大请求场景下直接禁用就能省掉这部分开销。
3. 复用cURL连接(批量请求场景适用)
如果是批量发送请求,不要每次都重新初始化cURL句柄,复用连接可以省去TCP握手、TLS握手(如果是HTTPS)的耗时。
4. 可选:使用HTTP/2协议
如果服务端支持HTTP/2,开启HTTP/2传输可以进一步提升传输效率,降低耗时。
优化后代码示例
// 构造原始POST数据 $polylineRaw = "37.779381,-122.418435,37.779381,-122.418435,37.779153,-122.418391...."; $postData = http_build_query(['polyline' => $polylineRaw]); // gzip压缩POST数据,压缩级别选9取最高压缩比 $compressedPost = gzencode($postData, 9); $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_URL, "http://example.com/"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $compressedPost); // 配置请求头:告知服务端请求体格式、压缩方式,禁用100-continue curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/x-www-form-urlencoded', 'Content-Encoding: gzip', 'Expect: ' ]); // 保留原有响应压缩配置 curl_setopt($ch, CURLOPT_ENCODING, "gzip,deflate"); // 可选:开启HTTP/2支持,服务端不支持会自动降级到HTTP/1.1 // curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0); $curl_exec = curl_exec($ch); curl_close($ch);
注意:服务端需要同步适配请求体的gzip解压逻辑,按照请求头的
Content-Encoding对收到的POST数据做解压后再解析参数。
额外优化建议
如果你的地理坐标数据本身可以做精度截断、或者用Encoded Polyline Algorithm格式编码(将坐标对转换为短字符串的通用编码算法),可以在压缩前进一步缩小原始数据体积,传输耗时会更低。
内容的提问来源于stack exchange,提问作者muzaffar
相关产品推荐
相关产品推荐

