php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法


Posted in PHP onOctober 12, 2016

本文实例讲述了php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法。分享给大家供大家参考,具体如下:

微信支付api.mch.weixin.qq.com域名解析慢了,导致付款时非常的慢,那么要如何来解决微信支付慢的问题呢,这里就来一起分析一下。

有朋友在阿里云主机实现微信支付逻辑时,发现api.mch.weixin.qq.com的解析实在是太慢了。

因此出现了手动修改/etc/hosts的情况,当然了,哪天微信支付要是换个机房肯定要挂。

我们的机房也有相似的同题,专门记录一下。

代码里用curl来请求微信,经常超时,这时使用wget试验:

[root@01 tmp]# wget api.mch.weixin.qq.com
--2016-06-18 14:51:03-- http://api.mch.weixin.qq.com/
Resolving api.mch.weixin.qq.com...

域名解析很久不出来

测试确认是ipv6问题

给wget加上-4,强制使用ipv4,如果很快,那基本上确定是ipv6惹的祸了。

[root@01 tmp]# wget -4 api.mch.weixin.qq.com
--2016-06-18 17:03:52-- http://api.mch.weixin.qq.com/
Resolving api.mch.weixin.qq.com... 123.151.71.149, 123.151.79.109
Connecting to api.mch.weixin.qq.com|123.151.71.149|:80... connected.

代码分析

专门写个代码来测试ipv6的解析,用到系统函数getaddrinfo:

#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <iostream>
#include <sys/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
using namespace std;
int main() {
  struct addrinfo hints,*answer,*curr,*p;
  int error;
  memset(&hints, 0, sizeof hints);
  hints.ai_family = AF_INET6;//AF_UNSPEC; // use AF_INET6 to force IPv6
  hints.ai_socktype = SOCK_STREAM;//SOCK_DGRAM; // SOCK_STREAM
  if ((error = getaddrinfo("api.mch.weixin.qq.com", NULL, &hints, &answer)) != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error));
    return 1;
  } else cout <<"Success with a URL\n";
  char ipstr[16];
  for (curr = answer; curr != NULL; curr = curr->ai_next) {
    inet_ntop(AF_INET,&(((struct sockaddr_in *)(curr->ai_addr))->sin_addr),ipstr, 16);
    printf("%s\n", ipstr);
  }
  freeaddrinfo(answer);
  return 0;
}

包含头文件

netdb.h

函数原型:

int getaddrinfo( const char hostname, const char service, const struct addrinfo *hints, struct addrinfo **result );

参数说明:

hints:可以是一个空指针,也可以是一个指向某个addrinfo结构体的指针,调用者在这个结构中填入关于期望返回的信息类型的暗示。举例来说:如果指定的服务既支持TCP也支持UDP,那么调用者可以把hints结构中的ai_socktype成员设置成SOCK_DGRAM使得返回的仅仅是适用于数据报套接口的信息。而是否ipv6则由ai_family决定。
result:本函数通过result指针参数返回一个指向addrinfo结构体链表的指针。

返回值:0——成功,非0——出错

测试结果:

ai_family为ipv6时,只会寻找ipv6的解析结果,一般域名也没设置。ai_family为AF_UNSPEC时,会先ipv6再ipv4的,而api.mch.weixin.qq.com这个域名的ipv6解析出奇的慢(qq.com却不慢,原因见后)。

解决办法:

如果是curl,c可以强制指定ipv4,使用curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

其他语言的也参考此法。

深层原因分析

nslookup -query=AAAA api.mch.weixin.qq.com -debug 是找不到解析的(指定的AAAA就是ipv6),然后会发现一个SOA声明和他的上级weixin.qq.com有一个ipv6的CNAME,到了minorshort.weixin.qq.com,而这域名又是没有ipv6的解析的。

目测ipv6找解析时是在这个SOA和CNAME的地方打圈了,微信的同学们是不是考虑让大伙好过一点,把这些个域名的ipv6设置去掉。

dig @ns-tel1.qq.com weixin.qq.com AAAA
weixin.qq.com.    43200  IN  SOA ns-tel1.qq.com. webmaster.qq.com. 1293502040 300 600 86400 300

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP.MVC的模板标签系统(四)
Sep 05 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php session劫持和防范的方法
Nov 12 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
PHP实现连接设备、通讯和发送命令的方法
Oct 13 PHP
WordPress中Gravatar头像缓存到本地及相关优化的技巧
Dec 19 PHP
深入浅析php中sprintf与printf函数的用法及区别
Jan 08 PHP
Yii2 rbac权限控制之rule教程详解
Jun 23 PHP
mysql查找删除重复数据并只保留一条实例详解
Sep 24 PHP
yii2 url重写并隐藏index.php方法
Dec 10 PHP
PHP回调函数简单用法示例
May 08 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 PHP
如何使用php等比例缩放图片
Oct 12 #PHP
php与python实现的线程池多线程爬虫功能示例
Oct 12 #PHP
php实现的SSO单点登录系统接入功能示例分析
Oct 12 #PHP
php用户密码加密算法分析【Discuz加密算法】
Oct 12 #PHP
基于php实现的php代码加密解密类完整实例
Oct 12 #PHP
php fseek函数读取大文件两种方法
Oct 12 #PHP
PHP从二维数组得到N层分类树的实现代码
Oct 11 #PHP
You might like
解析php 版获取重定向后的地址(代码)
2013/06/26 PHP
PHP编程基本语法快速入门手册
2016/01/07 PHP
CI框架(CodeIgniter)操作redis的方法详解
2018/01/25 PHP
PHP中实现中文字串截取无乱码的解决方法
2018/05/29 PHP
PHP如何通过date() 函数格式化显示时间
2020/11/13 PHP
一个可以随意添加多个序列的tag函数
2009/07/21 Javascript
打豆豆小游戏 用javascript编写的[打豆豆]小游戏
2013/01/08 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
vue的props实现子组件随父组件一起变化
2016/10/27 Javascript
详解Vue2.X的路由管理记录之 钩子函数(切割流水线)
2017/05/02 Javascript
ligerUI---ListBox(列表框可移动的实例)
2017/11/28 Javascript
解决Mac安装thrift因bison报错的问题
2018/05/17 Javascript
微信小程序开发背景图显示功能
2018/08/08 Javascript
详解redux异步操作实践
2018/08/15 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
基于Vue和Element-Ui搭建项目的方法
2019/09/06 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
Python类属性与实例属性用法分析
2015/05/09 Python
详解Python 切片语法
2019/06/10 Python
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
Python 多线程,threading模块,创建子线程的两种方式示例
2019/09/29 Python
Django 解决开发自定义抛出异常的问题
2020/05/21 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
Python进行特征提取的示例代码
2020/10/15 Python
美国专营婴幼儿用品的购物网站:buybuy BABY
2017/01/01 全球购物
雅萌 (YA-MAN) :日本美容家电领域的龙头企业
2017/05/12 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
2014新年寄语
2014/01/20 职场文书
运动会广播稿50字
2014/01/26 职场文书
公司活动方案范文
2014/03/06 职场文书
设计大赛策划方案
2014/06/13 职场文书
社区安全生产月活动总结
2014/07/05 职场文书
婚内分居协议书范文
2014/11/26 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS