PHP使用curl获取http链接内容响应超时问题

soralaro 2017-06-27

curl_exec执行太慢,IPv6惹的祸

公司网址使用微信支付,获取微信code和openid值用于发起微信支付,但是自从公司服务器升级后(主要升级了linux系统内核)发现发起微信支付的过程非常缓慢,经常会出现超时的情况。

于是逐项检查系统代码,发现在php如下代码中出现了延迟卡顿

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,TRUE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		fwrite($f,"GetOpenidFromMp step 1,".date("H:i:s")."\r\n");
		//运行curl,结果以jason形式返回
		$res = curl_exec($ch);
		fwrite($f,"GetOpenidFromMp step 2,".date("H:i:s")."\r\n");

经过系统输出,发现step1和step2之间的时间差有10-20秒之久。问题肯定出现在https链接上

php已经设置了过滤https证书等校验,不应该卡壳

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);

在运维的帮助下:

在linux中执行命令:

$ wget  https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxxxxxx&secret=a651xxxx727d9a5fxxxxxxxc&code=071pxxxxxxxxxSs60QjJw60pIAwV&grant_type=authorization_code

发现得到结果很慢。

如果改为ipv4

$ wget -4  https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxxxxxx&secret=a651xxxx727d9a5fxxxxxxxc&code=071pxxxxxxxxxSs60QjJw60pIAwV&grant_type=authorization_code

 瞬间就返回了结果。看来是运维启用了 IPv6 的地址,整个系统升级后,默认会优先解析 IPv6,在那个 domain 没有 IPv6 的情况下,会等待 IPv6 解析失败 timeout 之后才按以前的正常流程去找 IPv4。
对于 PHP curl 来讲,只需要加上下面一句即可解决延迟问题:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

现在很多服务器都开启了 IPv6 却没有路由,无法真正工作,反而导致一些不可预料的问题。

如果你同样遇到这样莫名其妙的问题,不妨试试看,祝你好运!

相关推荐