curl php 耗时,记一次 PHP 应用 curl 耗时 namelookup_time 较长问题处理过程

起因

日常检查接口可用性,发现有个接口耗时较长

排查过程

确定耗时位置:根据日志基本确定“请求支付宝接口耗时”

跟支付宝核实:将请求日志提工单给支付宝技术客服,后反馈“支付宝这边是正常不耗时的”

怀疑是自己服务器问题:查找资料后知道可根据 curl_getinfo() 获取 curl 请求详细信息,从中确定问题与服务器DNS有关

// 代码

$response = curl_exec($ch);

$curlInfo = curl_getinfo($ch);

// $curlInfo 信息如下

{

"url": "https://openapi.alipay.com/gateway.do?app_id=2018...省略ing",

"content_type": "text\/html;charset=UTF-8",

"http_code": 200,

"header_size": 420,

"request_size": 821,

"filetime": -1,

"ssl_verify_result": 0,

"redirect_count": 0,

"total_time": 1.856358, # 总耗时

"namelookup_time": 1.51023, # 说明主要是解析DNS耗时较长

"connect_time": 1.544082,

"pretransfer_time": 1.657145,

"size_upload": 44,

"size_download": 477,

"speed_download": 477,

"speed_upload": 44,

"download_content_length": 477,

"upload_content_length": 44,

"starttransfer_time": 1.856326,

"redirect_time": 0,

"redirect_url": "",

"primary_ip": "110.75.231.202",

"certinfo": []

}

查找资料:多数案例说是 IPv6、IPv4 问题,采用下面的方案尝试,但问题依然存在。说明我这里遇到的不是这个原因。

/*

如果服务器开启了IPv6,curl 默认会优先解析IPv6,

在对应域名没有IPv6的情况下,会等待IPv6 DNS解析失败 TIMEOUT 之后才按以前的正常流程去找IPv4,

所以就会出现比较耗时的情况。

*/

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

$response = curl_exec($ch);

$curlInfo = curl_getinfo($ch);

验证服务器DNS解析该域名是否正常(方法参考文末链接):发现有1台服务器异常

修改服务器DNS验证(方法参考文末链接):修改后正常

查看业务日志:正常

然后

删除 curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

下班

相关资料:

你可能感兴趣的:(curl,php,耗时)