诺亚方舟

沉淀

解决PHP进程DNS缓存问题

PHP中curl是很常用的一个请求第三方接口的工具,但是在使用中一直有个问题很疑惑我,实际场景中很常有一个情景是请求的第三方接口换了域名解析,新/旧ip不同往往也会导致请求结果的迥异,这个时候就开始疑惑了,这就是是PHP进程,或者是curl的,或者是操作系统的dns缓存导致的?

直到今天知道PHP进程中确实存在DNS缓存这种东西,那么如果对方域名重解析你获取不到最新的ip,就不仅仅要更新你服务器的dns缓存了,PHP也是需要重启的。具体操作如下:

1、首先确认新域名是否解析成功,你的上流DNS服务器是否更新到了最新的ip字典:

1、查看DNS解析情况

1、查看DNS解析情况

图1中,通过nslookup查看上流DNS解析到域名对应的ip记录,通过ping返回的ttl可以看到你所连DNS向NS(顶级域名解析服务器)所隔秒数的更新时间,图中表示每隔51秒会向NS更新这个域名的解析情况。

2、确认了操作系统获取到的dns解析没有问题后,判断是不是curl的问题

查看curl请求的ip地址

2、查看curl请求的ip地址

从2中我们可以看到curl请求的地址也是同个ip。

3、判断PHP是否存在dns缓存,那这个步骤怎么判断呢?其实也很好处理,PHP有个内置函数gethostbyname()。

3、查看php dns缓存

3、查看php dns缓存

这样子我们就可以看到PHP中拿到的域名解析地址是多少,究竟是不是PHP缓存惹的祸了,当然要注意,这里的PHP进程要和你调用接口是同个PHP进程嘿嘿。

适用场景:

a、请求对方接口时对方换了解析服务器ip;

b、主备机切换时;

OK,确定了这三个问题后,每个环节出问题都很好处理了,如果是DNS解析问题,尝试换DNS服务器;如果是操作系统缓存层面的问题,看看你的服务器上是否有dnsmasq之类的工具,更新下他的缓存;如果是PHP缓存的问题,平滑重启下你的php-fpm,kill -USR2 pid问题解决。收工。

 参考文章:

PHP curl的DNS解析问题(PHP下curl很慢)

域名解析设置TTL多少合适?

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>