3

编辑:找到部分原因 - 见底部。

我正在从 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,就像文章建议的那样。

http://community.centrify.com/t5/Express-for-Mac-Tips-and-Tricks/Using-local-domains-with-Centrify-Directcontrol-on-the-Mac/ba-p/3724

我在这里确认我的 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) 上有所不同。

4

2 回答 2

2

PHP 应用程序代码使用 curl_multi_select,默认超时时间为 1 秒。将此延迟更改为 0.00005 秒会使呼叫返回更快。所以这就是造成延迟的原因。但是,我还不知道为什么这在 Linux 与 OSX 或我构建的特定风格的 php/libcurl (5.3.8) 上有所不同。

我将打开一个不同的 SO 问题来尝试解决 curl_multi_select 问题。

于 2012-05-25T01:53:59.927 回答
0

您可以在 /etc/hosts 中固定您的域,然后 php curl 不需要查找 DNS 来查找 IP 地址。这对我有用。

于 2019-04-08T10:22:05.970 回答