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,如文章所建议的那样。
我确认我的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减慢请求的主要内容,如果未能解决你的问题,请参考以下文章