`

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 nginx 499 错误

    在IT行业中,网络编程是不可或缺的一部分,而PHP的cURL库则是进行HTTP和其他协议请求的常用工具。然而,当我们在使用cURL与服务器交互时,可能会遇到一些异常情况,比如"nginx 499错误"。这个错误通常发生在Nginx...

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

    当我们在使用PHP的cURL库来获取网页内容时,如果遇到IPv6环境下超时的问题,这通常是由于cURL在开启IPv6支持的情况下,会优先尝试解析IPv6地址。如果目标网站的域名并没有配置IPv6地址,cURL会等待IPv6解析失败之后...

    php采用curl访问域名返回405 method not allowed提示的解决方法

    此外,可以使用网络抓包工具(如Wireshark或Fiddler)来分析网络请求和响应,以便更好地诊断问题。 在解决405错误时,还需要注意代码中的注释提到的可能由于某些网站(如示例中的***)对POST请求做了屏蔽。这可能与...

    CUrlHttp封装curl类

    CUrlHttp封装curl类是一个基于curl库的PHP类,它为开发者提供了更加便捷的方式来执行HTTP请求,如GET、POST以及表单提交等操作。curl库是一个强大的URL传输库,广泛应用于各种网络请求任务,包括文件上传下载、网页...

    PHP_Curl使用详解.doc

    **PHP_Curl 使用详解** PHP_Curl 是 PHP 中的一个扩展,用于执行 HTTP、FTP、SMTP 等多种协议的网络请求。它通过 cURL 库实现了丰富的功能,包括支持 SSL 证书、POST 数据、PUT 操作、FTP 上传、代理设置、HTTP ...

    PHPCURL模拟登录获取及提交数据的函数.pdf

    PHPCURL是一个基于PHP语言的CURL扩展库,提供了模拟浏览器的功能,可以模拟用户的浏览器行为,发送HTTP请求,获取服务器响应数据,提交数据等。该库广泛应用于爬虫、自动化测试、数据采集等领域。 在该文档中,我们...

    PHP封装CURL扩展类.zip

    3. `exec()`:执行CURL请求,获取响应数据。通常返回响应的HTTP响应码和/或响应体。 4. `close()`:关闭当前的CURL会话,释放资源。 5. `get()`、`post()`、`put()`、`delete()`等:预定义的便捷方法,分别对应...

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

    在PHP开发中,使用curl和soap客户端请求第三方服务时,超时问题的处理是常见的问题之一。处理超时问题时,主要关注的是如何准确判断超时并进行相应的异常处理和重试机制设计。 首先,curl作为PHP的一个重要扩展,它...

    PHP实现获取当前链接地址的301或者302跳转之后的真实链接地址.zip

    在PHP开发过程中,有时我们需要获取一个URL的实际链接,特别是在处理重定向(301或302)时。这些重定向常用于网站迁移、页面永久或临时转移等场景。了解如何在PHP中检测并获取这些重定向的目标URL是至关重要的。下面...

    php之curl设置超时实例

    使用cURL处理HTTP请求时,超时控制是至关重要的,因为它可以帮助你避免因为网络延迟或其他问题导致的长时间等待。通过正确配置超时设置,你可以确保程序在预期时间内完成任务,从而提高整体的响应速度和用户体验。 ...

    php的curl抓数据专用.zip

    3. 执行请求:`curl_exec()`执行之前配置的cURL会话,获取服务器响应。 4. 获取响应信息:`curl_getinfo()`返回关于cURL操作的信息,例如HTTP状态码、请求时间等。 5. 错误检查:`curl_errno()`和`curl_error()`分别...

    PHP通过CURL下载文件

    根据给定的部分内容,我们可以逐行分析这段PHP脚本如何使用CURL下载文件。 ```php <?php $ch=curl_init(); // 初始化CURL会话 $url=http://***.com/test.txt; // 定义要下载的文件URL curl_setopt($ch,CURLOPT_URL,...

    php实现的Curl封装类

    在PHP开发中,Curl库是一个非常重要的工具,它允许我们执行HTTP请求并获取服务器的响应,支持多种协议,如HTTP、HTTPS、FTP等。为了更方便地使用Curl功能,开发者通常会创建一个Curl封装类,将复杂的Curl设置和调用...

    一个基于PHPcURL的开源HTTP类库

    【标题】:基于PHPcURL的开源HTTP类库——YurunHttp 【描述】:YurunHttp是一个优秀的PHP类库,它充分利用了cURL扩展的功能,为开发者提供了更简洁、高效的HTTP请求处理方式。这个类库允许进行链式操作,大大简化了...

    php的curl封装类用法实例.zip

    在PHP开发中,cURL库是一个非常重要的工具,它允许开发者通过HTTP协议与其他网络协议进行交互,例如FTP、SMTP等。本压缩包“php的curl封装类用法实例.zip”提供了一个封装好的PHP类,旨在简化cURL操作,使得开发者...

    curl使用手册

    使用`curl_exec()`执行cURL会话,并获取响应数据: ```php $response = curl_exec($ch); ``` ### 5. 检查错误 通过`curl_errno()`检查错误码,`curl_error()`获取错误信息: ```php if (curl_errno($ch)) { ...

    PHPCurl使用详解.doc

    PHPcURL是一个用于在PHP中实现HTTP和其他协议通信的库,它通过cURL库提供了一个接口,使得开发者能够轻松地处理文件传输、网页抓取、数据提交等多种网络操作。cURL支持众多协议,如FTP、FTPS、HTTP、HTTPS、SCP、...

    php的curl多线程采集.zip

    在PHP中,cURL库是一个强大的工具,用于处理各种HTTP请求和其他网络协议。它允许开发者模拟浏览器的行为,发送GET、POST以及其他HTTP方法的请求,并获取响应。在标题为"php的curl多线程采集.zip"的文件中,我们讨论...

    在PHP中使用CURL.pdf

    - 使用`curl_setopt()`的`CURLOPT_RETURNTRANSFER`选项,可以将获取的内容存储在变量中,而不是直接输出。例如: ```php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://www.google.com"); curl_...

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

    PHP中使用curl扩展可以模拟HTTP请求,完成多种网络任务,如发送请求、获取网页内容、上传文件、模拟登录等。在完成这些操作后,我们往往需要获取服务器响应的状态码,状态码能告诉我们请求是否成功,或者为何失败。 ...

Global site tag (gtag.js) - Google Analytics