CURLOPT_DNS_CACHE_TIMEOUT -缓存错误响应


CURLOPT_DNS_CACHE_TIMEOUT - Caching bad responses?

我的php应用程序所做的curl请求有一些DNS问题。

nginx+php5-fpm日志显示脚本运行缓慢,故障点是curl

很困惑,因为我的curl脚本的超时和连接超时选项都设置为3秒(生产服务器)。

所以我偶尔会在脚本失败的地方出现错误。我模拟DNS失败,我可以重新创建这些php脚本超时失败。

我的curl在做DNS查找,然后失败。要么是DNS服务器没有响应,要么是它限制了我们(我们在峰值时每秒发送数百个请求)。

我想我需要向本地DNS缓存工作,但现在有什么我可以做的限制坏的DNS响应或DNS超时与curl?

我在想,CURLOPT_DNS_CACHE_TIMEOUT缓存坏响应了吗?如果是,我需要关闭它,如果它没有缓存任何响应/超时,那么我可以将它从2分钟增加到15分钟来帮助解决问题?

有什么好主意吗?坏的DNS从崩溃我的网站?

也许手册页中的这些信息对其他人发现这个问题很有用:

CURLOPT_DNS_CACHE_TIMEOUT

传递一个long,这将以秒为单位设置超时。名称解析将在内存中保存此秒数。设置为0表示完全禁用缓存,或设置为-1表示永远保留缓存项。默认情况下,libcurl将此信息缓存60秒。

注意:各种libc实现的名称解析函数不会重新读取名称服务器信息,除非明确地这样做(例如,通过调用res_init(3))。这可能导致libcurl继续使用旧的服务器,即使DHCP已经更新了服务器信息,这可能看起来像一个临时libcurl-app用户的DNS缓存问题。

从http://linux.die.net/man/3/curl_easy_setopt

我通常在我的服务器上运行bind9,以便缓存我的域名。这通常比希望别人为你做要好得多。

您不是很清楚如何使用curl,但缓存选项只有在继续运行时才有效。如果您运行一个存在的脚本,然后重新启动,那么每次都会丢失缓存。的确。

如果试图访问您自己的服务,也许您应该使用/etc/hosts文件中的条目(如下所示)而不是依赖完整的DNS。如果您只访问您控制的域,那么您也将控制它们的IP地址。

1.2.3.4    foo.example.com

总是可以的。

如果你正在处理许多你无法控制的域名,恐怕拥有一个正常工作的DNS是唯一好的解决方案。在这种情况下,您可能需要考虑使用bind9并将其设置为长时间缓存您的域名(1至2h通常被认为是安全的,如果名称更改,1天或更长时间可能会太多,您可能会在近24小时内失败