cURL - 超时控制 - 学习/实践

1.应用场景

主要用于学习curl的超时控制,以及运行原理,合适场景下正确使用。

2.学习/操作

1.文档阅读

PHP cURL: CURLOPT_CONNECTTIMEOUT vs CURLOPT_TIMEOUT - Stack Overflow

https://altafphp.blogspot.com/2012/12/difference-between-curloptconnecttimeou.html

Timeouts - Everything curl -- 推荐阅读

Connections - Everything curl

curl/unit1303.c at d7d0c9d9538df7f78b83cc91da8ec96c7d160f6a · curl/curl · GitHub

PHP: curl_setopt - Manual

CURL设置超时时间_漫天丶飞雪的博客-CSDN博客_curl超时时间设置

网络/Network - TCP与HTTP - 学习/实践_穿素白衫的少年的博客-CSDN博客

2.整理输出

2.1 知识点

PHP cURL: CURLOPT_CONNECTTIMEOUT vs CURLOPT_TIMEOUT - Stack Overflow

中文翻译:

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

CURLOPT_TIMEOUT 是以秒为单位的最大时间量,单个 cURL 扩展函数调用的执行将受到限制。请注意,此设置的值应包括 CURLOPT_CONNECTTIMEOUT 的值。

也就是说,CURLOPT_CONNECTTIMEOUT是CURLOPT_TIMEOUT所代表的时间段,所以CURLOPT_TIMEOUT的值应该大于CURLOPT_CONNECTTIMEOUT的值。

同时补充:

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

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

个人补充:

这个连接就是TCP连接,三次握手,建立TCP连接。

传输过程就是request/response过程

看看HTTP请求的整个过程就知道了。

验证查看 2.2 PHP中使用

2.2 PHP中使用/实践

cRUL在PHP中是可同步阻塞也可以异步非阻塞的,区别是在设置超时时间。

CURLOPT_TIMEOUT允许 cURL 函数执行的最长秒数。
CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。 如果 libcurl 编译时使用系统标准的名称解析器( standard system name resolver),那部分的连接仍旧使用以秒计的超时解决方案,最小超时时间还是一秒钟。在 cURL 7.16.2 中被加入。从 PHP 5.2.3 起可使用。
CURLOPT_CONNECTTIMEOUT在尝试连接时等待的秒数。设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。设置为0,则无限等待。 如果 libcurl 编译时使用系统标准的名称解析器( standard system name resolver),那部分的连接仍旧使用以秒计的超时解决方案,最小超时时间还是一秒钟。在 cURL 7.16.2 中被加入。从 PHP 5.2.3 开始可用。

默认值?TBD

PHP: Default cURL timeout value - Stack Overflow

代码实践: 

中文翻译:

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。

所有这些值都以秒为单位。

代码:

TBD

后续补充

...

3.问题/补充

TBD

4.参考

参见上面文档列表

后续补充

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值