我的 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 秒内做出响应。
因此我意识到我们用于 CURL 的 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 请求崩溃的问题,有什么建议吗?
谢谢
答案1
您可能需要考虑将 DNS 从 curl 手中夺走,并运行您自己的本地缓存解析器。
您可以将 CURLOPT_DNS_USE_GLOBAL_CACHE 设置为 false 以关闭缓存,然后使用本地 DNS 缓存来管理您的查找。
我不确定您处理的吞吐量,但我发现在 DNS 服务器级别处理我们自己的 DNS 通常比依赖许多应用程序堆栈内部的缓存更快。
看:http://devblog.moz.com/2011/02/high-performance-libcurl-tips/
此外,最好在 stackoverflow 上询问这个问题,因为我认为是您的应用程序层而不是服务器级别的配置导致了问题。