soralaro 2017-06-27
公司网址使用微信支付,获取微信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 却没有路由,无法真正工作,反而导致一些不可预料的问题。
如果你同样遇到这样莫名其妙的问题,不妨试试看,祝你好运!