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)
- 最新评论