问题描述:
代码中请求一个接口(http://credit.ziroom.com/api/userInfoApiController/getUserBaseInfo?uid=b6e7ac3c-37bd-4f8b-8994-1158d68fafc5),总是超时,但是单独拿出来,请求又很快,同届接口的返回时间也很快,远未达到超时的地步,很困惑
定位问题:
在服务器上直接curl 接口,发现偶尔比较慢,于是写了个测试脚本,统计请求接口的相关信息:
$ch = curl_init('http://credit.ziroom.com/api/userInfoApiController/getUserBaseInfo?uid=b6e7ac3c-37bd-4f8b-8994-1158d68fafc5');
curl_exec($ch);
$info = curl_getinfo($ch);
print_r($info);
print_r(curl_error($ch));
请求多次,发现连接时间比较长
发现两台机器连接时间太长,运维定位网络问题
扩展:
有的代码中访问https的域名报错,但是在服务器上手动curl调用是成功的
原因:服务器系统安装的curl和php编译的curl不一致,导致两种调用返回的结果不同
查看php的curl,看到没有支持https扩展
curl_version函数查看,如图:
/usr/local/php/bin/php -i | grep curl 查看编译的参数
查看系统的curl支持https扩展
curl --version
知识扩展:
一、 一个域名可以解析到多个ip上,客户端连接时会使用到其中一个IP。
使用nslookup命令查看域名对应的ip
二、 一次TCP请求主要有以下流程:
DNS解析
TCP建连
发送数据
服务器响应
接收数据
每个阶段,都可能超时,所以引起请求失败的原因是多样的,具有一定的复杂性:
1. 如果使用域名请求,目标机器是不确定的。
2. 请求的每个阶段,都有可能超时或出错。
3. 对同一个服务器,从不同的来源访问,数据传输的网络线路可能并不一样,导致比较难以复现