PHP cURL:当前连接超时与当前连接超时的比较

fnvucqvd  于 2022-11-13  发布在  PHP
关注(0)|答案(5)|浏览(222)

PHP有以下两个与超时相关的选项:CURLOPT_CONNECTTIMEOUTCURLOPT_TIMEOUT中的一个或多个。
PHP网站上的描述有点模糊。有什么区别吗?
以真实的世界为例:假设您通过cURL向URL发送GET变量,并且希望收到返回的XML,那么CURLOPT_CONNECTTIMEOUT是否与连接到服务器所需的最长时间有关,CURLOPT_TIMEOUT是否与返回XML所需的最长时间有关?

eblbsuwk

eblbsuwk1#

CURLOPT_CONNECTTIMEOUT不是由CURLOPT_TIMEOUT表示的时间段
如果CURLOPT_CONNECTTIMEOUT设置为3秒,CURLOPT_TIMEOUT设置为4秒,则执行可能需要7秒。
我通过模拟缓慢的服务器连接(iptables drop)对此进行了测试。

hc2pp10m

hc2pp10m2#

CURLOPT_CONNECTTIMEOUT是允许与服务器建立连接的最长时间(秒)。可以将其设置为0以禁用此限制,但在生产环境中不建议这样做。
CURLOPT_TIMEOUT是以秒为单位的最大时间量,执行单个cURL扩展函数调用将被限制在该时间内。请注意,此设置的值应包括CURLOPT_CONNECTTIMEOUT的值。
换句话说,CURLOPT_CONNECTTIMEOUT是由CURLOPT_TIMEOUT表示的时间段,因此CURLOPT_TIMEOUT的值应该大于CURLOPT_CONNECTTIMEOUT的值。
Difference between CURLOPT_CONNECTTIMEOUT and CURLOPT_TIMEOUT开始

e7arh2l6

e7arh2l63#

接受的答案不正确。请参阅Everything CURL文件以取得正确的文件。
基本上,连接时间包括建立http连接的两个方面:

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

CURLOPT_TIMEOUT或CURLOPT_TIMEOUT_MS选项根本不包括这段时间。这些选项涵盖了在连接阶段刚建立的TCP连接上开始使用HTTP之后发生的所有事情。
这种区别会给很多人带来麻烦,但它确实允许设置一个相对较短的连接超时,因为如果服务器完全不可用,为什么还要等待它呢?然而,如果服务的预期响应时间很难预测,您仍然可以将请求超时设置得相当长。
通常,对于生产设置,CURLOPT_CONNECTION_TIMEOUT应小于5秒,并且CURLOPT_TIMEOUT应尽可能低(不会导致您经常丢弃请求)。

h7wcgrx3

h7wcgrx34#

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。所有这些值都以秒为单位。

jhiyze9q

jhiyze9q5#

除了accepted answer
根据源代码,连接设置:如果两者都设置了,则使用最严格的限制。2但仅在连接阶段。

/* 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;

源代码的单元测试

相关问题