前言
PHP的cURL函数中,有两个超时选项设置,CURLOPT_CONNECTTIMEOUT
和CURLOPT_TIMEOUT
,这篇文章简单说下这两个设置的区别。
区别
CURLOPT_CONNECTTIMEOUT:连接对方主机时的最长等待时间,此设置限制的是建立连接过程的时间,其它过程的时间不在控制范围
CURLOPT_TIMEOUT:整个cURL函数执行过程的最长等待时间,也就是说,这个时间是包含连接等待时间的
因此,两者是包含和被包含关系,CURLOPT_CONNECTTIMEOUT
是CURLOPT_TIMEOUT
的其中一部分,当两者都有设置的时候,CURLOPT_TIMEOUT
的值应比CURLOPT_CONNECTTIMEOUT
大。
验证
我们使用一段代码来验证
<?php
// 使用谷歌官网的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