background image

 

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

如果开启了 IPv6,curl

 

默认会优先解析 IPv6

 

,在对应域名没有 IPv6 的情况下,会等待 

IPv6 dns

 

解析失败 timeout 

 

之后才按以前的正常流程去找 IPv4

原因:
在程序中我对 curl 获取内容都作了较为严格的超时限制,所以就会造成无法获取内容的
问题。

 

 

解决方法:

设置默认访问为 ipv4。

php 的 curl 设置方法如下:
代码如下:

 

 

<?php

/**
* IPV6 下 curl 超时问题
*/

$ch

 = curl_init();

curl_setopt (

$ch

, CURLOPT_URL, 

$url

);

curl_setopt (

$ch

, CURLOPT_RETURNTRANSFER, true);

//设置 curl 默认访问为 IPv4
if

(defined('CURLOPT_IPRESOLVE') && defined('CURL_IPRESOLVE_V4')){

curl_setopt(

$ch

, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);

}

//设置 curl 请求连接时的最长秒数,如果设置为 0,则无限

curl_setopt (

$ch

, CURLOPT_CONNECTTIMEOUT, 

$timeout

);

//设置 curl 总执行动作的最长秒数,如果设置为 0,则无限

curl_setopt (

$ch

, CURLOPT_TIMEOUT,

$timeout

*3);

$file_contents

 = curl_exec(

$ch

);

curl_close(

$ch

);

 

 

注:curl_setopt(

$ch

, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4) 只有在 php 版本 5.3

及以上版本,curl 版本 7.10.8 及以上版本时,以上设置才生效。