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 及以上版本时,以上设置才生效。