自从我将服务器从 PHP 5.3.x 升级到 PHP 5.5.3 后,我遇到了 PHP Web 服务客户端的问题。
我有这个函数来计算 cURL 执行请求需要多长时间:
function makeRequest($method, $uri) {
global $requests;
addTime("makeRequest");
$curl = curl_init($uri);
curl_setopt($curl, CURLOPT_HEADER , true );
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true );
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true );
curl_setopt($curl, CURLOPT_MAXREDIRS , 10 );
curl_setopt($curl, CURLOPT_CUSTOMREQUEST , $method);
//////////////////////////////
addTime("curl_exec");
$responseContent = curl_exec($curl);
remTime("curl_exec");
addTime("curl_getInfo");
$responseInfo = curl_getinfo($curl);
remTime("curl_getInfo");
array_push( $requests, var_export( $responseInfo, true ) );
remTime("makeRequest");
}
addTime
并且remTime
是记录microtime(true)
以准确测量方法执行的功能。我还记录了curl_getinfo
) 报告的不同时间。见下文。
我尝试了一堆不同的 URI。这些是我的结果:
https://api1.mywebservice.com/methodCall
- 总时间 - 0.406
- namelookup_time - 0.0406
- 连接时间 - 0.406
- pretransfer_time - 0.406
- starttransfer_time - 0.406
- 重定向时间 - 0
makeRequest
时间:0.402
https://api2.mywebservice.com/methodCall
api2.mywebservice.com 被硬编码到机器的%windir%\system32\drivers\etc\hosts
文件中,127.0.0.1
因此它不应该为此访问 DNS 服务器
- 总时间 - 0.406
- namelookup_time - 0.0406
- 连接时间 - 0.0406
- pretransfer_time - 0.0406
- starttransfer_time - 0.0406
- 重定向时间 - 0
makeRequest
时间:0.402
https://localhost/methodCall
- 总时间 - 0.406
- namelookup_time - 0.406
- 连接时间 - 0.406
- pretransfer_time - 0.406
- starttransfer_time - 0.406
- 重定向时间 - 0
makeRequest
时间:0.403
https://127.0.01/methodCall
- 总时间 - 0
- namelookup_time - 0
- 连接时间 - 0
- pretransfer_time - 0
- starttransfer_time - 0
- 重定向时间 - 0
makeRequest
时间:0.006
服务器的DNS服务器距离只有5ms左右,但无论如何都要缓存名称。它得到相同时间的事实api2.mywebservice.com
表明这不是 DNS 服务器超时的问题,而是 cURL 内部腐烂的问题。
我也试过CURLOPT_RESOLVE
,但没有效果:
curl_setopt( $c, CURLOPT_RESOLVE, array("api1.mywebservice.com:443:127.0.01") );
为什么 PHP 的最新(当然也是最好的?)版本中的 cURL 需要这么长时间才能检索结果?