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超时设置方法。分享给大家供大家参考。具体实现方法如下: 访问HTTP方式很多,可以使用curl, socket, file_get_contents() 等方法。 在访问http时,需要考虑超时的问题。 CURL访问...
原因:在程序中我对curl获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的问题。解决方法:设置默认访问为ipv4。php的curl设置方法如下:复制代码 代码如下:<?php/*** IPV6下curl超时问题*/$ch = ...
根据选项设置,可以在curl_exec的返回结果中获取到响应头和body,但这没有响应的状态吗。想要获取状态码,需要在执行curl_exec后再通过curl_getinfo来获取。例如: 复制代码 代码如下: $ch = curl_init (); curl_...
用来替换WAMP server下的php_curl.dll,解决加载curl报错或无法加载问题。下载解压后,覆盖wamp\bin\php\php5.4.3\ext目录下对应文件,重启apache即可。如果不行请检查: 是否已修改php.ini文件去掉extension=...
php curl中长连接实现,对于同一个域名和端口的访问,可以做到在同一个进程中复用同一个连接,特别是对于经常内网访问的地址,性能提升很大!
使用Nginx做前端代理,由Nginx处理100-Continue重新编译Swoole启用100-Continue的支持,需要手工修改swoole_config
PHP使用CURL上传文件只需发送一个POST请求就可以了,在请求中设置某个字段为需要上传的文件全路径,并且以”@”开头,然后使用CURL把该变量以POST方式发送到服务器,在服务端即可以从超级全局变量$_FILES中取到相应...
php扩展 php_curl 其中包括libeay32.dll,php_curl.dll和ssleay32.dll是开启php_curl的必备条件
hp的curl封装类用法,以实例形式较为详细的讲述了curl封装类及其使用方法,并总结了GET与POST的用法。 使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll) 开启php ...
curl官网下载源码,mingw32-make.exe 编译,qt新建工程引入动态库,使用curl进行网络请求。
命令行下调用curl获取网页信息,例如在Java servlet中使用response.getWriter().print("success") curl就可以获取到"success",并保存到check.txt中,再从check.txt中读取数据,并做判断
Windows使用curl发送http请求,json报文。
php_curl_使用实例 curl的使用方法 curl 模拟post提交 curl 设置 UA、cookie 等 都有纤细例子
VS2017下编译的curl静态链接库,支持https, 包括32位和64位debug、Release版本
本篇文章主要介绍了php中curl和soap方式请求服务超时问题的解决,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
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 -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::...
设计插件的目的是当需要读取网页内容时,可以用本插件取代file_get_contents()函数。 它接受网页的URL地址和准备模仿的浏览器用户代理字符串。 若调用成功, 返回这个网页的内容,若调用失败,返回FALSE...
主要介绍了PHP封装CURL扩展类,实例分析了基于curl发送post、get请求及操作cookie等相关技巧 编码规范 * @class 类名首字母大写,类名为多个单词, 每个大字首字母大写 eg: class Curl , class CurlPage * @variable...
主要介绍了php的curl封装类用法,以实例形式较为详细的讲述了curl封装类及其使用方法,并总结了GET与POST的用法。 使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll,...