编辑:找到部分原因 - 见底部。
我正在从 php 进行标准 curl 调用。但是,在名称解析期间似乎有一个挂断。在我的 OSX 机器上,对于同一子网的此查询和其他查询,namelookup_time 始终超过 1 秒。我的子网上的一个 linux 机器执行相同的查询对另一个子网有 0.02 秒的响应,所以这是我的机器的问题。
这是一个问题,因为我们的应用程序多次调用此子网来构建页面,因此秒数加起来。
我的 curl_getinfo 响应(网址被剪掉)
array
'url' => string ' < SNIPPED > '... (length=1449)
'content_type' => string 'text/plain; charset=utf-8' (length=25)
'http_code' => int 200
'header_size' => int 227
'request_size' => int 1480
'filetime' => int -1
'ssl_verify_result' => int 0
'redirect_count' => int 0
'total_time' => float 1.165444
'namelookup_time' => float 1.001272
'connect_time' => float 1.017765
'pretransfer_time' => float 1.017781
'size_upload' => float 0
'size_download' => float 92562
'speed_download' => float 79422
'speed_upload' => float 0
'download_content_length' => float 92562
'upload_content_length' => float 0
'starttransfer_time' => float 1.043094
'redirect_time' => float 0
'certinfo' =>
array
empty
'redirect_url' => string '' (length=0)
我怀疑名称查找滞后是由于 IPv6 造成的,所以我尝试了以下方法:
1) 按照此处的说明在 OSX 上关闭 Ipv6,包括重新启动。我将 IPv6 的所有实例设置为INACTIVE,就像文章建议的那样。
我在这里确认我的 Mac 不支持 IPv6:http: //ipv6test.google.com/。
2) 使用 --disable-ipv6 重建 PHP。
php -i 显示:IPv6 支持 => 禁用
虽然在 curl 部分,它显示“IPv6 => Yes”,但我不知道如何通过手术将其关闭。
3)在 curl 调用之前运行这个:
curl_setopt($c, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );
不幸的是,上述步骤都没有奏效——我仍然需要 1 秒以上的名称解析时间。有没有人有任何故障排除建议,或者更好的是,灵丹妙药?:)
(注意 - 我已经用谷歌搜索并解决了这个问题,但无济于事..)
编辑:在下面回答 ckhan 的问题:
1)我使用 IP 地址或 FQDN 得到相同的 1 sec+ namelookup_time:
'url' => string 'HTTP://172.19.105.171:8070 <SNIPPED> '... (length=1439)
...
'namelookup_time' => float 1.001309
2)命令行客户端没有同样的问题:
# url.txt has the same url as the above curl call
time cat url.txt |xargs curl
<... response output ...>
real 0m0.053s
user 0m0.009s
sys 0m0.008s
3)dig似乎访问服务器没有问题。
dig 172.19.105.171
...
;; Query time: 77 msec
...
我的环境:
PHP 5.3.8
OSX 10.7.3
部分解决方案
应用程序代码使用 curl_multi_select,默认超时时间为 1 秒。将此延迟更改为 0.00005 秒会使呼叫返回更快。所以这就是造成延迟的原因。但是,我还不知道为什么这在 Linux 与 OSX 或我构建的特定风格的 php/libcurl (5.3.8) 上有所不同。