PHP cURL GET请求如何单独统计发送与接收阶段的耗时
你可以直接用PHP cURL扩展内置的阶段耗时统计功能实现需求,不需要在请求外层手动埋时间点,curl_getinfo() 提供了请求全流程各节点的耗时指标,可直接拆分你需要的发送、服务端处理、接收三个阶段的耗时:
代码示例
// 初始化cURL $ch = curl_init('https://你的目标请求地址'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 执行请求 $response = curl_exec($ch); // 读取cURL内置耗时指标,单位为秒,浮点数精度到微秒级 $totalTime = curl_getinfo($ch, CURLINFO_TOTAL_TIME); $connectTime = curl_getinfo($ch, CURLINFO_CONNECT_TIME); // TCP连接建立完成的时间 $preTransferTime = curl_getinfo($ch, CURLINFO_PRETRANSFER_TIME); // 所有准备工作完成、待发送请求的时间 $startTransferTime = curl_getinfo($ch, CURLINFO_STARTTRANSFER_TIME); // 本地收到第一个响应字节的时间 $appConnectTime = curl_getinfo($ch, CURLINFO_APPCONNECT_TIME); // HTTPS下TLS握手完成的时间,HTTP请求可忽略 // 计算各阶段耗时 if (curl_getinfo($ch, CURLINFO_HTTP_VERSION) >= CURL_HTTP_VERSION_2_TLS) { // HTTPS请求,剔除TLS握手耗时计算纯发送传输耗时 $sendTransferCost = $preTransferTime - $appConnectTime; } else { // HTTP请求,剔除TCP连接耗时计算纯发送传输耗时 $sendTransferCost = $preTransferTime - $connectTime; } // 服务端处理+首字节回传的近似耗时 $serverProcessCost = $startTransferTime - $preTransferTime; // 响应接收传输耗时 $receiveTransferCost = $totalTime - $startTransferTime; // 输出结果 var_dump([ '发送传输耗时(秒)' => $sendTransferCost, '服务端处理近似耗时(秒)' => $serverProcessCost, '接收传输耗时(秒)' => $receiveTransferCost, '总耗时(秒)' => $totalTime ]); curl_close($ch);
精准隔离服务端处理时间的方案
如果需要完全剔除服务端处理时间,得到纯网络传输的发送、接收耗时,需要目标服务端配合做两点改造:
- 服务端收到完整请求时,记录当前UTC微秒级时间戳,写入响应头
X-Req-Receive-Time - 服务端处理完成、开始返回响应时,记录当前UTC微秒级时间戳,写入响应头
X-Resp-Send-Time
拿到响应后读取这两个响应头的值,结合两边时钟校准后的时间差修正,即可得到完全精准的两段网络传输耗时。
注意事项
- 你原来使用的
DateTime类精度仅到秒级,不适合网络耗时统计,如需手动埋点建议使用microtime(true)获取微秒级浮点数时间戳 - cURL内置的耗时指标统计精度已经足够覆盖绝大多数业务场景,无需额外手动统计总耗时
内容的提问来源于stack exchange,提问作者Mohammad
相关产品推荐
相关产品推荐

