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关于IE下的iframe跨域导致session丢失问题解决方法
Oct 10 PHP
php读取excel文件示例分享(更新修改excel)
Feb 27 PHP
thinkphp数据查询和遍历数组实例
Nov 28 PHP
php metaphone()函数的定义和用法
May 15 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP实现文件上传功能实例代码
May 18 PHP
PHP开发之用微信远程遥控服务器
Jan 25 PHP
PHP扩展mcrypt实现的AES加密功能示例
Jan 29 PHP
PHP实现二维数组按照指定的字段进行排序算法示例
Apr 23 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
Laravel 简单实现Ajax滚动加载示例
Oct 22 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
使用Discuz关键词服务器实现PHP中文分词
2014/03/11 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
jQuery入门第一课 jQuery选择符
2010/03/14 Javascript
使用UglifyJS合并/压缩JavaScript的方法
2012/03/07 Javascript
checkbox设置复选框的只读效果不让用户勾选
2013/08/12 Javascript
JS远程获取网页源代码实例
2013/09/05 Javascript
键盘上一张下一张兼容IE/google/firefox等浏览器
2014/01/28 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
浅谈JS日期(Date)处理函数
2014/12/07 Javascript
在Python中使用glob模块查找文件路径的方法
2015/06/17 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
JavaScript性能优化之函数节流(throttle)与函数去抖(debounce)
2016/08/11 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
2016/09/20 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
详解Node.js串行化流程控制
2017/05/04 Javascript
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
2017/08/08 jQuery
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
使用Angular Cli如何创建Angular私有库详解
2019/01/30 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
NUXT SSR初级入门笔记(小结)
2019/12/16 Javascript
python3 与python2 异常处理的区别与联系
2016/06/19 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
Python装饰器知识点补充
2018/05/28 Python
Python实现元素等待代码实例
2019/11/11 Python
详解Pycharm安装及Django安装配置指南
2020/09/15 Python
.net开发工程师面试题
2014/02/25 面试题
2014年学校工作总结
2014/11/20 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
2016年少先队活动总结
2016/04/06 职场文书
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/06 其他游戏
vue项目打包后路由错误的解决方法
2022/04/13 Vue.js