`

PHP使用curl获取http链接内容响应超时问题

阅读更多

curl_exec执行太慢,IPv6惹的祸

 

公司网址使用微信支付,获取微信code和openid值用于发起微信支付,但是自从公司服务器升级后(主要升级了linux系统内核)发现发起微信支付的过程非常缓慢,经常会出现超时的情况。

 

于是逐项检查系统代码,发现在php如下代码中出现了延迟卡顿

 

		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,TRUE);
		curl_setopt($ch, CURLOPT_HEADER, FALSE);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
		fwrite($f,"GetOpenidFromMp step 1,".date("H:i:s")."\r\n");
		//运行curl,结果以jason形式返回
		$res = curl_exec($ch);
		fwrite($f,"GetOpenidFromMp step 2,".date("H:i:s")."\r\n");

 

经过系统输出,发现step1和step2之间的时间差有10-20秒之久。问题肯定出现在https链接上

php已经设置了过滤https证书等校验,不应该卡壳

		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);

 

在运维的帮助下:

在linux中执行命令:

$ wget  https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxxxxxx&secret=a651xxxx727d9a5fxxxxxxxc&code=071pxxxxxxxxxSs60QjJw60pIAwV&grant_type=authorization_code

 

发现得到结果很慢。

如果改为ipv4

$ wget -4  https://api.weixin.qq.com/sns/oauth2/access_token?appid=xxxxxxx&secret=a651xxxx727d9a5fxxxxxxxc&code=071pxxxxxxxxxSs60QjJw60pIAwV&grant_type=authorization_code

 瞬间就返回了结果。看来是运维启用了 IPv6 的地址,整个系统升级后,默认会优先解析 IPv6,在那个 domain 没有 IPv6 的情况下,会等待 IPv6 解析失败 timeout 之后才按以前的正常流程去找 IPv4。
对于 PHP curl 来讲,只需要加上下面一句即可解决延迟问题:

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 );

现在很多服务器都开启了 IPv6 却没有路由,无法真正工作,反而导致一些不可预料的问题。

如果你同样遇到这样莫名其妙的问题,不妨试试看,祝你好运!

分享到:
评论

相关推荐

    php之curl设置超时实例

    本文实例讲述了php中curl超时设置方法。分享给大家供大家参考。具体实现方法如下: 访问HTTP方式很多,可以使用curl, socket, file_get_contents() 等方法。 在访问http时,需要考虑超时的问题。 CURL访问...

    php curl获取网页内容(IPV6下超时)的解决办法

    原因:在程序中我对curl获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的问题。解决方法:设置默认访问为ipv4。php的curl设置方法如下:复制代码 代码如下:<?php/*** IPV6下curl超时问题*/$ch = ...

    PHP curl 获取响应的状态码的方法

    根据选项设置,可以在curl_exec的返回结果中获取到响应头和body,但这没有响应的状态吗。想要获取状态码,需要在执行curl_exec后再通过curl_getinfo来获取。例如: 复制代码 代码如下: $ch = curl_init (); curl_...

    php_curl-5.3.13-VC9-x64.zip(php curl模块)

    用来替换WAMP server下的php_curl.dll,解决加载curl报错或无法加载问题。下载解压后,覆盖wamp\bin\php\php5.4.3\ext目录下对应文件,重启apache即可。如果不行请检查: 是否已修改php.ini文件去掉extension=...

    php curl 长连接的实现

    php curl中长连接实现,对于同一个域名和端口的访问,可以做到在同一个进程中复用同一个连接,特别是对于经常内网访问的地址,性能提升很大!

    swoole#swoole-wiki#7.5.1 - CURL发送POST请求服务器端超时1

    使用Nginx做前端代理,由Nginx处理100-Continue重新编译Swoole启用100-Continue的支持,需要手工修改swoole_config

    PHP实现通过CURL上传文件功能示例

    PHP使用CURL上传文件只需发送一个POST请求就可以了,在请求中设置某个字段为需要上传的文件全路径,并且以”@”开头,然后使用CURL把该变量以POST方式发送到服务器,在服务端即可以从超级全局变量$_FILES中取到相应...

    php扩展 php_curl

    php扩展 php_curl 其中包括libeay32.dll,php_curl.dll和ssleay32.dll是开启php_curl的必备条件

    php的Curl处理类

    hp的curl封装类用法,以实例形式较为详细的讲述了curl封装类及其使用方法,并总结了GET与POST的用法。 使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll) 开启php ...

    Qt工程中使用curl进行网络请求,最小程序

    curl官网下载源码,mingw32-make.exe 编译,qt新建工程引入动态库,使用curl进行网络请求。

    bat获取网页信息 命令行下调用curl获取网页信息

    命令行下调用curl获取网页信息,例如在Java servlet中使用response.getWriter().print("success") curl就可以获取到"success",并保存到check.txt中,再从check.txt中读取数据,并做判断

    Windows使用curl发送http请求,json报文。

    Windows使用curl发送http请求,json报文。

    php_curl_使用实例

    php_curl_使用实例 curl的使用方法 curl 模拟post提交 curl 设置 UA、cookie 等 都有纤细例子

    curl7.70静态链接库

    VS2017下编译的curl静态链接库,支持https, 包括32位和64位debug、Release版本

    php中curl和soap方式请求服务超时问题的解决

    本篇文章主要介绍了php中curl和soap方式请求服务超时问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    php CURL 命令详解

    curl命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解php CURL 命令详解...

    使用Curl命令查看请求响应时间方法

    curl命令查看请求响应时间 # curl -o /dev/null -s -w %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}::%{speed_download}"\n" http://www.36nu.com 0.014::0.015::0.018::0.019::...

    PHP编程使用Curl方法获取目标网页内容插件.rar

    设计插件的目的是当需要读取网页内容时,可以用本插件取代file_get_contents()函数。 它接受网页的URL地址和准备模仿的浏览器用户代理字符串。 若调用成功, 返回这个网页的内容,若调用失败,返回FALSE...

    PHP封装CURL扩展类

    主要介绍了PHP封装CURL扩展类,实例分析了基于curl发送post、get请求及操作cookie等相关技巧 编码规范 * @class 类名首字母大写,类名为多个单词, 每个大字首字母大写 eg: class Curl , class CurlPage * @variable...

    php的Curl处理类.zip

    主要介绍了php的curl封装类用法,以实例形式较为详细的讲述了curl封装类及其使用方法,并总结了GET与POST的用法。 使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll,...

Global site tag (gtag.js) - Google Analytics