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 相关文章推荐
全文搜索和替换
Oct 09 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
Jun 07 PHP
php 判断服务器操作系统的类型
Feb 17 PHP
destoon供应信息title调用出公司名称的方法
Aug 22 PHP
php实现encode64编码类实例
Mar 24 PHP
php实现字符串翻转的方法
Mar 27 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
Dec 24 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
Jan 07 PHP
php代码架构的八点注意事项
Jan 25 PHP
smarty的section嵌套循环用法示例
May 28 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
php使用curl伪造来源ip和refer的方法示例
May 08 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学习之运算符相关概念
2011/06/09 PHP
PHP缓存集成库phpFastCache用法
2014/12/15 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php处理单文件、多文件上传代码分享
2016/08/24 PHP
简单谈谈PHP中的Reload操作
2016/12/12 PHP
解决extjs在firefox中关闭窗口再打开后iframe中js函数访问不到的问题
2008/11/06 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
Draggable Elements 元素拖拽功能实现代码
2011/03/30 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
freemarker判断对象是否为空的方法
2015/08/13 Javascript
javascript输出AscII码扩展集中的字符方法
2016/12/26 Javascript
jQuery ajax调用webservice注意事项
2017/10/08 jQuery
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
微信小程序使用wxParse解析html的方法教程
2018/07/06 Javascript
Vuex 快速入门(简单易懂)
2018/09/20 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
Vue开发之封装上传文件组件与用法示例
2019/04/25 Javascript
Vue.js实现可编辑的表格
2019/12/11 Javascript
node.js基于dgram数据报模块创建UDP服务器和客户端操作示例
2020/02/12 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
Python获取apk文件URL地址实例
2013/11/01 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
1分钟快速生成用于网页内容提取的xslt
2018/02/23 Python
用python建立两个Y轴的XY曲线图方法
2019/07/08 Python
用CSS3的box-reflect设置文字倒影效果的方法讲解
2016/03/07 HTML / CSS
耐克奥地利官网:Nike奥地利
2019/08/16 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
请介绍一下Ant
2016/07/22 面试题
电子商务自荐书范文
2014/01/04 职场文书
母亲节演讲稿
2014/05/27 职场文书
软件研发工程师岗位职责
2014/09/30 职场文书
2016年党校科级干部培训班学习心得体会
2016/01/06 职场文书
《赵州桥》教学反思
2016/02/17 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis
springboot 自定义配置 解决Boolean属性不生效
2022/03/18 Java/Android