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

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 却没有路由,无法真正工作,反而导致一些不可预料的问题。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值