我的PHP不断抛出与慢脚本相关的随机错误。nginx/php5-fpm在其错误日志中报告,由于脚本超时,子程序已被终止。
PHP5-FPM慢速错误日志报告问题在于我提出的curl请求。
困惑是因为我对所有的curl请求都使用了连接超时。
CURLOPT_CONNECTTIMEOUT 3 #number of seconds trying to connect
CURLOPT_TIMEOUT 3 #number of seconds to run curl for这是一个生产服务器,所以值很低,我们期望在1秒内得到响应。
因此,我意识到,我们使用的URL的卷曲一定是在DNS级别失败。
因此,我模拟了一个糟糕的DNS或不可用的DNS,并且能够在日志中复制相同的错误和慢脚本消息。
那我该怎么处理呢?
1) CURLOPT_DNS_CACHE_TIMEOUT --但是将默认值从2分钟增加到10分钟?
然而,我确实看到,在我的错误中,我有这些慢速的脚本,持续了2分3秒。这意味着CURLOPT_DNS_CACHE_TIMEOUT默认的2分钟是缓存一个错误的响应,不管缓存设置的时间是多长,它都会扼杀它。时间似乎很容易忽略,但我可能错了。它会缓存错误的DNS /不可用DNS吗?
2)以某种方式编辑我的DNS名称服务器以允许多个DNS服务器。
但是,我编辑了我的resolv.conf文件,并将openDNS添加到现有的名称服务器中。但是我把一个假的DNS放在1.1.1.1的前面,它仍然失败了,给了我一个糟糕的站点网关错误。为什么它不选择另一个服务器来获得响应呢?
我以为添加多个服务器会对其进行排序,但它仍然在读取列表中的第一个,并且失败了。我认为curl缓存可能是在缓存错误的响应,但我不确定。理想情况下,我保留缓存以减少查找IP的延迟。
对于如何解决不可用的DNS服务器,使我的php脚本/ curl请求崩溃,有什么建议吗?
谢谢
发布于 2013-06-06 15:40:02
您可能需要考虑将DNS从curl手中移除,并运行您自己的本地缓存--解析器。
您可以将CURLOPT_DNS_USE_GLOBAL_CACHE设置为false以关闭缓存,然后使用本地DNS缓存来管理查找。
我不确定您正在处理的吞吐量,但我发现在DNS服务器级别处理我们自己的DNS通常比依赖许多应用程序堆栈内部的缓存更快。
请参阅:http://devblog.moz.com/2011/02/high-performance-libcurl-tips/
此外,在堆栈溢出时可能会更好地问这个问题,因为我认为是您的应用层而不是服务器级别的配置导致了问题。
https://serverfault.com/questions/513816
复制相似问题