PHP / curl:namelookup_time / dns减慢请求

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP / curl:namelookup_time / dns减慢请求相关的知识,希望对你有一定的参考价值。

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

我正在从php进行标准卷曲调用。但是,在名称解析期间似乎存在挂断。在我的OSX框中,对于此查询以及对同一子网的其他查询,namelookup_time始终超过1秒。我的子网上执行相同查询的linux框对另一个子网有0.02秒的响应,所以这对我的盒子来说是一个问题。

这是一个问题,因为我们的应用程序多次调用此子网来构建页面,因此秒数加起来。

我的curl_getinfo响应(url被剪掉)

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支持=>已禁用

虽然在卷曲部分,它说“IPv6 =>是”,我不知道如何通过手术解决这个问题。

3)在卷曲呼叫之前跑完这个:

curl_setopt($ c,CURLOPT_IPRESOLVE,CURL_IPRESOLVE_V4);

遗憾的是,上述步骤均无效 - 我仍然需要1秒+名称解析时间。有没有人有任何故障排除建议,或者更好的是,一个神奇的子弹? :)

(注意 - 我用谷歌搜索了这个问题,但无济于事......)

编辑:回答下面的ckhan问题: 1)我使用IP地址或FQDN获得相同的1秒+ 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 172.19.105.171
...
;; Query time: 77 msec
...

我的环境: PHP 5.3.8 OSX 10.7.3

部分解决方案

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

答案

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

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

另一答案

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

以上是关于PHP / curl:namelookup_time / dns减慢请求的主要内容,如果未能解决你的问题,请参考以下文章

解析php中curl

linux上怎么操作开启php curl扩展

PHP如何开启curl

PHP - curl实现采集

php curl 302问题

php curl get 参数