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数据库连接类~~做成一个分页类!
Nov 25 PHP
默默小谈PHP&amp;MYSQL分页原理及实现
Jan 02 PHP
php 需要掌握的东西 不做浮躁的人
Dec 28 PHP
PHP下利用header()函数设置浏览器缓存的代码
Sep 01 PHP
破解.net程序(dll文件)编译和反编译方法
Jan 31 PHP
php查看请求头信息获取远程图片大小的方法分享
Dec 25 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
PHP中的socket_read和socket_recv区别详解
Feb 09 PHP
PHP stream_context_create()函数的使用示例
May 12 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
thinkPHP5框架实现基于ajax的分页功能示例
Jun 12 PHP
PHP中16个高危函数整理
Sep 19 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 empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php学习之 数组声明
2011/06/09 PHP
PHP5.5.15+Apache2.4.10+MySQL5.6.20配置方法分享
2016/05/06 PHP
一个简单的php路由类
2016/05/29 PHP
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
jQuery DateTimePicker 日期和时间插件示例
2017/01/22 Javascript
Angularjs添加排序查询功能的实例代码
2017/10/24 Javascript
bootstrap响应式导航条模板使用详解(含下拉菜单,弹出框)
2017/11/17 Javascript
js遍历添加栏目类添加css 再点击其它删除css【推荐】
2018/06/12 Javascript
ES6基础之解构赋值(destructuring assignment)
2019/02/21 Javascript
layui表格 返回的数据状态异常的解决方法
2019/09/10 Javascript
d3.js实现图形拖拽
2019/12/19 Javascript
antd vue 刷新保留当前页面路由,保留选中菜单,保留menu选中操作
2020/08/06 Javascript
用Python实现换行符转换的脚本的教程
2015/04/16 Python
详解python中的线程
2018/02/10 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
采购主管工作职责
2013/12/12 职场文书
公司业务员岗位职责
2014/03/18 职场文书
数字化校园建设方案
2014/05/03 职场文书
英文演讲稿
2014/05/15 职场文书
产品包装策划方案
2014/05/18 职场文书
促销活动总结模板
2014/07/01 职场文书
党的群众路线教育实践活动个人对照检查材料(企业)
2014/11/05 职场文书
文艺晚会开场白
2015/05/29 职场文书
2015年暑期社会实践报告
2015/07/13 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS
MySQL自定义函数及触发器
2022/08/05 MySQL