快捷搜索:   nginx

PHP CURL在开启IPV6环境下超时的解决办法(WGET同理)

现在IPV6虽然有普及的趋势,但是实际应用的网站并不多,如果你本地服务器环境有开启IPV6,那PHP CURL每次请求对方网站信息都会优先请求一遍IPV6地址,直到超时返回才会再去请求IPV4,因此对于我们只需要访问IPV4资源的站点来说,这个问题就应该尽量去避免(这个问题主要也是因为我们会对PHP CURL设置一个TIMEOUT时间,而当这个超时时间短于请求IPV6返回超时的时间的情况下,就会造成整个CURL超时)


其实只需要增加一个设置就行了

curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);


修改后代码如下

<?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);需要PHP5.3以上版本,CURL7.10.8以上版本才能使用。不过在目前普遍PHP7的情况下,这个应该问题不大了

顶(3)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论