【发布时间】:2013-09-19 06:58:38
【问题描述】:
自从我将服务器从 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
- total_time - 0.406
- namelookup_time - 0.0406
- connect_time - 0.406
- pretransfer_time - 0.406
- starttransfer_time - 0.406
- redirect_time - 0
makeRequest 时间:0.402
https://api2.mywebservice.com/methodCall
api2.mywebservice.com 被硬编码到机器的 %windir%\system32\drivers\etc\hosts 文件到 127.0.0.1 所以它不应该为此访问 DNS 服务器
- total_time - 0.406
- namelookup_time - 0.0406
- connect_time - 0.0406
- pretransfer_time - 0.0406
- starttransfer_time - 0.0406
- redirect_time - 0
makeRequest 时间:0.402
https://localhost/methodCall
- total_time - 0.406
- namelookup_time - 0.406
- connect_time - 0.406
- pretransfer_time - 0.406
- starttransfer_time - 0.406
- redirect_time - 0
makeRequest时间:0.403
https://127.0.01/methodCall
- total_time - 0
- namelookup_time - 0
- connect_time - 0
- pretransfer_time - 0
- starttransfer_time - 0
- redirect_time - 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 需要这么长时间才能检索结果?
【问题讨论】:
-
你检查过机器上的DNS设置吗?
-
我非常怀疑问题与 curl 相关,请使用 nslookup(或任何其他命令行实用程序)检查您的 DNS 设置,应该很容易检测到 400 毫秒。
-
nslookup立即返回。这是一台 Windows Azure 机器,Azure VM 使用 DHCP 来分配 DNS 服务器。 -
如果您的配置中有超过 1 个 DNS 服务器,请尝试交换它们的顺序。
-
只配置了 1 个 DNS 服务器。