PHP下CURL异常慢

SJY发表于:2017年12月14日 11:03 • 阅读:

摘要: PHP,在做访问其他接口的时候,非常慢.最终是PHP缓存了DNS引起

几个星期前,碰到一个特别头疼的问题,各种办法,原因都想过,排查过,就是找不到原因。

就是PHP,在使用其他域名接口的时候,非常慢。

可能问题出现在:

  1. 目标服务器响应慢

  2. 和服务器建立连接慢

首先,我们需要排除掉目标服务器是否慢,这很简单,找另外的机子去访问同样的接口,或者找目标服务器人员排查。这个不是我们这次的重点。

其次,来分析分析第二个问题。一件一件排查。

先列出可能原因:

  1. IP路由不通(ping 目标IP排查)

  2. 域名DNS不对(ping 目标域名排查)

  3. IPv6,IPv4设置不对(wget http://www.baidu.com排查)

排查上面三个都没有问题,然后用wget直接访问接口,飞快。这就头疼了,我就以为是curl的bug了,那就用fsocket来改改,还是一样。file_get_content也是一样。那我就没辙了,网上查,有说是http版本的问题,那好吧,强制使用HTTP 1.0和HTTP 1.1都没解决。还好是测试环境的,不是正式环境。

到这里,就不得不怀疑是PHP出问题了,发现,上面的排查方式不对,都是用shell去排查的,不是在PHP环境内部。严格来说,不形成有效对比。OK,那就在PHP中排查一下吧。

对于第一点

  1. IP路由不通。

    那就PHP中用curl 访问对方 对方IP和端口;结果是通畅的.

  2. 域名DNS不对

    那就CURl 访问对方的域名和端口,不通.

  3. IPv6,IPv4设置不对

    这个根本没设置,不存在问题.

综上,基本确定问题,PHP中,DNS不过.域名解析不出来!!!这就是结果,但是在shell中又能够解析!!!

进一步证实想法,PHP中有一个函数,gethostbyname(),能够通过域名,查找到对应IP,试了一下,果然,得不到结果。

突然想起,最近几天,电信有个域名解析服务器(DNS)失效了,可能跟这个有关了。

最终,重启了一下PHP,OK,没问题了。

 

最后总结了下,很有可能是PHP把DNS域名解析服务器给缓存起来了,不重启,没法更新。这种情况下,碰到解析服务器失败,就会出现上面那种问题。虽然解决方法很简单,但是找到这个问题,还真是费了好大的劲。

欢迎转载,但请保留原文地址 http://www.sjyhome.com/php/1230.html

回复(0)