我的php应用程序正在进行的curl请求有一些DNS问题。
nginx + php5-fpm日志记录显示缓慢的脚本,故障点是卷曲。
困惑,因为我的curl脚本有超时和连接超时选项设置为3秒(生产服务器)。
因此偶尔会出现我的脚本失败的错误。我模拟DNS失败,我可以重新创建这些PHP脚本超时失败。
因此,我的CURL正在进行DNS查找和失败。 DNS服务器无法响应,或者它会限制我们(我们在峰值时每秒发送数百个请求)。
我认为我需要努力实现本地DNS缓存,但是现在有什么办法可以用curl来限制糟糕的DNS响应或DNS超时吗?
我在想,CURLOPT_DNS_CACHE_TIMEOUT是否也会缓存错误的响应?如果是的话,我需要关闭它,如果它没有缓存没有响应/超时那么我可以将它从2增加到15分钟以帮助重要事项?
关于我如何停止卷曲的任何想法糟糕的DNS崩溃了我的网站?
谢谢!
答案 0 :(得分:0)
也许手册页中的这些信息对于其他人发现这个问题非常有用:
CURLOPT_DNS_CACHE_TIMEOUT
传递一个长整数,以秒为单位设置超时。名称解析将在内存中保留此秒数。设置为零以完全禁用缓存,或设置为-1以使缓存的条目保持不变。默认情况下,libcurl将此信息缓存60秒。
注意:各种libc实现的名称解析函数不会重新读取名称服务器信息,除非明确告知(例如,通过调用res_init(3))。这可能导致libcurl继续使用旧服务器,即使DHCP已更新服务器信息,这对于休闲libcurl-app用户来说可能看起来像DNS缓存问题。
答案 1 :(得分:0)
通常,我的服务器上运行的是bind9,以便缓存我的域名。通常,这比希望其他人为您做的要好得多。
您不清楚如何使用curl
,但是只有在继续运行时,缓存选项才有效。如果运行的脚本存在并稍后重新启动,则每次都会丢失高速缓存。的确如此。
如果尝试访问自己的服务,也许应该使用/etc/hosts
文件中的条目(如下所示),而不要依赖完整的DNS。如果仅访问您控制的域,那么您还将控制其IP地址。
1.2.3.4 foo.example.com
那将一直有效。
如果相反,如果您要处理许多您无法控制的域名,那么恐怕拥有正常运行的DNS是唯一好的解决方案。在这种情况下,您可能要考虑使用bind9并将其设置为长时间缓存域名 (通常认为1h到2h是安全的,如果名称为1天或更长时间更改您可能会在24小时内出现故障。