CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT的区别

前言

PHP的cURL函数中,有两个超时选项设置,CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUT,这篇文章简单说下这两个设置的区别。

区别

CURLOPT_CONNECTTIMEOUT:连接对方主机时的最长等待时间,此设置限制的是建立连接过程的时间,其它过程的时间不在控制范围

CURLOPT_TIMEOUT:整个cURL函数执行过程的最长等待时间,也就是说,这个时间是包含连接等待时间的

因此,两者是包含和被包含关系,CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUT的其中一部分,当两者都有设置的时候,CURLOPT_TIMEOUT的值应比CURLOPT_CONNECTTIMEOUT大。

验证

我们使用一段代码来验证


// 使用谷歌官网的81端口来模拟连接超时
$url = 'https://www.google.com:81';

// 第一种情况:仅设置CURLOPT_TIMEOUT
$options = [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_TIMEOUT => 3,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$time = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
curl_close($ch);
echo $time; // 输出 2.958352

// 第二种情况:仅设置CURLOPT_CONNECTTIMEOUT
$options = [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_CONNECTTIMEOUT => 1,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$time = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
curl_close($ch);
echo $time; // 输出 0.989237

// 第三种情况:同时设置CURLOPT_TIMEOUT和CURLOPT_CONNECTTIMEOUT
$options = [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => false,
    CURLOPT_CONNECTTIMEOUT => 1,
    CURLOPT_TIMEOUT => 3,
];
$ch = curl_init();
curl_setopt_array($ch, $options);
$content = curl_exec($ch);
$time = curl_getinfo($ch, CURLINFO_TOTAL_TIME);
curl_close($ch);
echo $time; // 输出 0.990142

通过代码验证,结果也符合前面说的结论。

文章参考

https://stackoverflow.com/questions/27776129/php-curl-curlopt-connecttimeout-vs-curlopt-timeout

你可能感兴趣的:(PHP,php,curl)