php版微信支付api.mch.weixin.qq.com域名解析慢原因与
本文实例讲述了php版微信支付api.mch.weixin.qq.域名解析慢原因与解决方法。分享给大家供大家参考,具体如下
微信支付api.mch.weixin.qq.域名解析慢了,导致付款时非常的慢,那么要如何来解决微信支付慢的问题呢,这里就来一起分析一下。
有朋友在阿里云主机实现微信支付逻辑时,发现api.mch.weixin.qq.的解析实在是太慢了。
出现了手动修改/etc/hosts的情况,了,哪天微信支付要是换个机房肯定要挂。
我们的机房也有相似的同题,专门记录一下。
代码里用curl来请求微信,经常超时,这时使用wget试验
[root@01 tmp]# wget api.mch.weixin.qq. --2016-06-18 14:51:03-- http://api.mch.weixin.qq./ Resolving api.mch.weixin.qq....
域名解析很久不出来
测试确认是ipv6问题
给wget加上-4,强制使用ipv4,如果很快,那基本上确定是ipv6惹的祸了。
[root@01 tmp]# wget -4 api.mch.weixin.qq. --2016-06-18 17:03:52-- http://api.mch.weixin.qq./ Resolving api.mch.weixin.qq.... 123.151.71.149, 123.151.79.109 Connecting to api.mch.weixin.qq.|123.151.71.149|:80... connected.
代码分析
专门写个代码来测试ipv6的解析,用到系统函数getaddrinfo:
#include <stdio.h> #include <string.h> #include <db.h> #include <iostream> #include <sys/types.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/i.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.", NULL, &hints, &answer)) != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error)); return 1; } else cout <<"Suess with a URL\n"; char ipstr[16]; for (curr = answer; curr != NULL; curr = curr->ai_next) { i_n(AF_INET,&(((struct sockaddr_in )(curr->ai_addr))->sin_addr),ipstr, 16); printf("%s\n", ipstr); } freeaddrinfo(answer); return 0; }
包含头文件
db.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.这个域名的ipv6解析出奇的慢(qq.却不慢,原因见后)。
解决办法
如果是curl,c可以强制指定ipv4,使用curl_easy_set(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
其他语言的也参考此法。
深层原因分析
nslookup -query=AAAA api.mch.weixin.qq. -debug 是找不到解析的(指定的AAAA就是ipv6),然后会发现一个SOA声明和他的上级weixin.qq.有一个ipv6的CNAME,到了minorshort.weixin.qq.,而这域名又是没有ipv6的解析的。
目测ipv6找解析时是在这个SOA和CNAME的地方打圈了,微信的同学们是不是考虑让大伙好过一点,把这些个域名的ipv6设置去掉。
dig @ns-tel1.qq. weixin.qq. AAAA weixin.qq.. 43200 IN SOA ns-tel1.qq.. webmaster.qq.. 1293502040 300 600 86400 300
更多关于PHP相关内容感兴趣的读者可查看本站专题《》、《》、《》、《》、《》、《》及《》
希望本文所述对大家PHP程序设计有所帮助。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程