CURLOPT_TIMEOUT,还有“其他”功能吗?

时间:2011-02-15 08:05:34

标签: php curl

    <?php
function get_random_proxy()
{
    srand ((double)microtime()*1000000);
    $f_contents = file ("proxy.txt");
    $line = $f_contents[array_rand ($f_contents)];
    return $line;
}
$proxy = get_random_proxy(); 
            $ch = curl_init(); 
            curl_setopt($ch, CURLOPT_URL, "example.com");
            curl_setopt($ch, CURLOPT_PROXY,$proxy); 
            curl_setopt($ch, CURLOPT_TIMEOUT ,30);
            curl_exec($ch);  
            curl_close($ch);      
    ?>
如果在30秒内无法连接,

curl将关闭连接。

如您所见,我正在使用代理列表。但是,有些代理ips有时会在30秒内连接有问题,而卷曲是在30秒内无法加载时关闭连接。

如果达到卷曲超时,我想尝试另一个ip进行卷曲连接。现在,如果ip不工作,curl正在关闭所有内容。我想尝试另一个IP。那么,你能告诉我一个功能吗?

为@rubayeet编辑。添加了新的代理功能

3 个答案:

答案 0 :(得分:4)

您只需使用curl_errno来测试CURLE_OPERATION_TIMEDOUT是否发生

答案 1 :(得分:1)

function get($url, $proxy){
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_PROXY,$proxy); 
    curl_setopt($ch, CURLOPT_TIMEOUT ,30);
    $response = curl_exec($ch);  
    curl_close($ch);

    return $response
}

$url = 'example.com';

while(true) {
   $proxy = get_random_proxy();
   $response = get($url, $proxy);
   if ($response === False) continue;
   else break;
}

//do something with $response

答案 2 :(得分:0)

您必须创建一个新的curl会话才能连接到另一个代理。因此,在代码周围放置一个foreach循环并循环遍历代理数组。

此外,您可以使用curl_errno()和curl_error()来检查错误(例如您的超时)。

设置CURLOPT_RETURNTRANSFER并将其加载到var中以修改或处理它可能会有用。