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 相关文章推荐
php5 pdo新改动加载注意事项
Sep 11 PHP
利用php实现禁用IE和火狐的缓存问题
Dec 03 PHP
php阻止页面后退的方法分享
Feb 17 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
Apr 17 PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
Jul 28 PHP
php采集自中央气象台范围覆盖全国的天气预报代码实例
Jan 04 PHP
PHP合并数组+号和array_merge的区别
Jun 25 PHP
PHP入门教程之面向对象的特性分析(继承,多态,接口,抽象类,抽象方法等)
Sep 11 PHP
php表单处理操作
Nov 16 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
PHP autoload使用方法及步骤详解
Sep 05 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
Yii操作数据库实现动态获取表名的方法
2016/03/29 PHP
passwordStrength 基于jquery的密码强度检测代码使用介绍
2011/10/08 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
javascript自定义的addClass()方法
2014/05/28 Javascript
JQuery中的事件及动画用法实例
2015/01/26 Javascript
jQuery实现感应鼠标动画效果自动伸长的输入框实例
2015/02/24 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
jquery表格datatables实例解析 直接加载和延迟加载
2016/08/12 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
Jquery-data的三种用法
2017/04/18 jQuery
Javascript中的async awai的用法
2017/05/17 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
使用微信小程序开发弹出框应用实例详解
2018/10/18 Javascript
详解Nuxt.js 实战集锦
2019/11/19 Javascript
原生JavaScript实现进度条
2021/02/19 Javascript
[52:15]2014 DOTA2国际邀请赛中国区预选赛5.21 HGT VS LGD-GAMING
2014/05/23 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
python使用xlrd与xlwt对excel的读写和格式设定
2017/01/21 Python
python中比较两个列表的实例方法
2019/07/04 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
python 已知三条边求三角形的角度案例
2020/04/12 Python
keras中的History对象用法
2020/06/19 Python
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
保安员岗位职责
2013/11/17 职场文书
自动化毕业生专业自荐书范文
2014/02/04 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
2015年工会工作总结
2015/03/30 职场文书
被委托人身份证明
2015/08/07 职场文书
52条SQL语句教你性能优化
2021/05/25 MySQL
详解Python内置模块Collections
2022/03/22 Python
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers