CURLOPT_DNS_CACHE_TIMEOUT - Cachng不良反应?

时间:2013-06-06 16:46:26

标签: curl nginx dns php

我的php应用程序正在进行的curl请求有一些DNS问题。

nginx + php5-fpm日志记录显示缓慢的脚本,故障点是卷曲。

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

因此偶尔会出现我的脚本失败的错误。我模拟DNS失败,我可以重新创建这些PHP脚本超时失败。

因此,我的CURL正在进行DNS查找和失败。 DNS服务器无法响应,或者它会限制我们(我们在峰值时每秒发送数百个请求)。

我认为我需要努力实现本地DNS缓存,但是现在有什么办法可以用curl来限制糟糕的DNS响应或DNS超时吗?

我在想,CURLOPT_DNS_CACHE_TIMEOUT是否也会缓存错误的响应?如果是的话,我需要关闭它,如果它没有缓存没有响应/超时那么我可以将它从2增加到15分钟以帮助重要事项?

关于我如何停止卷曲的任何想法糟糕的DNS崩溃了我的网站?

谢谢!

2 个答案:

答案 0 :(得分:0)

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

  

CURLOPT_DNS_CACHE_TIMEOUT

     

传递一个长整数,以秒为单位设置超时。名称解析将在内存中保留此秒数。设置为零以完全禁用缓存,或设置为-1以使缓存的条目保持不变。默认情况下,libcurl将此信息缓存60秒。

     

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

来自http://linux.die.net/man/3/curl_easy_setopt

答案 1 :(得分:0)

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

您不清楚如何使用curl,但是只有在继续运行时,缓存选项才有效。如果运行的脚本存在并稍后重新启动,则每次都会丢失高速缓存。的确如此。

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

1.2.3.4    foo.example.com

那将一直有效。

如果相反,如果您要处理许多您无法控制的域名,那么恐怕拥有正常运行的DNS是唯一好的解决方案。在这种情况下,您可能要考虑使用bind9并将其设置为长时间缓存域名 (通常认为1h到2h是安全的,如果名称为1天或更长时间更改您可能会在24小时内出现故障。