PHP cURL:CURLOPT_CONNECTTIMEOUT与CURLOPT_TIMEOUT

时间:2015-01-05 08:58:06

标签: php curl

PHP有两个与超时相关的选项:CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUT

PHP网站上的描述有点模糊。有什么区别?

要使用一个真实世界的示例:假设您通过cURL将GET变量发送到URL并且您希望收回XML,CURLOPT_CONNECTTIMEOUT将与其可以花费的最长时间相关联连接到服务器并CURLOPT_TIMEOUT发回XML可以花费的最长时间吗?

5 个答案:

答案 0 :(得分:40)

  

CURLOPT_CONNECTTIMEOUT是允许与服务器建立连接的最长时间(以秒为单位)。   可以将其设置为0以禁用此限制,但在生产环境中这是不可取的。

     

CURLOPT_TIMEOUT是个别cURL扩展函数调用执行受限的最长时间(以秒为单位)。   请注意,此设置的值应包含CURLOPT_CONNECTTIMEOUT的值。

     

换句话说,   CURLOPT_CONNECTTIMEOUT是CURLOPT_TIMEOUT表示的时间段,因此CURLOPT_TIMEOUT的值应该大于CURLOPT_CONNECTTIMEOUT的值。

来自Difference between CURLOPT_CONNECTTIMEOUT and CURLOPT_TIMEOUT

答案 1 :(得分:32)

CURLOPT_CONNECTTIMEOUT 不是 CURLOPT_TIMEOUT所代表的时间段

如果CURLOPT_CONNECTTIMEOUT设置为3秒而CURLOPT_TIMEOUT设置为4秒,则执行最多可能需要7秒。

我通过模拟慢速服务器连接(iptables drop)测试了这个。

答案 2 :(得分:4)

accepted answer之外。

根据source code设置已连接:如果两者都已设置,则使用最严格的设置。但只是在连接阶段。

/* if a timeout is set, use the most restrictive one */

  if(data->set.timeout > 0)
    timeout_set |= 1;
  if(duringconnect && (data->set.connecttimeout > 0))
    timeout_set |= 2;

  switch(timeout_set) {
  //...
  case 3:
    if(data->set.timeout < data->set.connecttimeout)
      timeout_ms = data->set.timeout;
    else
      timeout_ms = data->set.connecttimeout;
    break;

Unit tests来源

答案 3 :(得分:3)

接受的答案不正确。请参阅Everything CURL文档以获取适当的文档。

基本上,连接时间涵盖建立http连接的两个方面:

  • DNS解析
  • 建立TCP连接之前的时间。

CURLOPT_TIMEOUT或CURLOPT_TIMEOUT_MS选项完全不涵盖此时间段。这些内容涵盖了我们开始通过刚刚在连接阶段建立的TCP连接进行HTTP对话之后发生的一切。

这种区别给很多人带来了问题,但是它确实允许人们设置相对较短的连接超时,因为如果服务器完全不可用,为什么还要等待它呢?但是,如果难以预测服务的预期响应时间,您仍然可以将请求超时时间设置得相当长。

通常,对于生产设置,CURLOPT_CONNECTION_TIMEOUT应该少于5秒,CURLOPT_TIMEOUT应该尽可能低(不会导致您定期丢弃请求)。

答案 4 :(得分:0)

CURLOPT_CONNECTTIMEOUT是仅连接到服务器的时间。

CURLOPT_TIMEOUT是连接的总时间加上交换数据的时间。

因此,CURLOPT_TIMEOUT始终包含CURLOPT_CONNECTTIMEOUT。

使用CURLINFO_CONNECT_TIME和CURLINFO_TOTAL_TIME来验证它是否非常简单。

  • curl_getinfo($ ch,CURLINFO_CONNECT_TIME)获取信息,curl_setopt($ ch,CURLOPT_CONNECTTIMEOUT,$ yourMaxConnTime)设置要连接的最大值。

  • curl_getinfo($ ch,CURLINFO_TOTAL_TIME)获取信息,curl_setopt($ ch,CURLOPT_TIMEOUT,$ yourMaxTotTime)设置整个操作的最大值。

当然,$ yourMaxTotTime必须始终高于$ yourMaxConnTime。 所有这些值都以秒为单位。