PHP有两个与超时相关的选项:CURLOPT_CONNECTTIMEOUT
和CURLOPT_TIMEOUT
。
PHP网站上的描述有点模糊。有什么区别?
要使用一个真实世界的示例:假设您通过cURL将GET变量发送到URL并且您希望收回XML,CURLOPT_CONNECTTIMEOUT
将与其可以花费的最长时间相关联连接到服务器并CURLOPT_TIMEOUT
发回XML可以花费的最长时间吗?
答案 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;
答案 3 :(得分:3)
接受的答案不正确。请参阅Everything CURL文档以获取适当的文档。
基本上,连接时间涵盖建立http连接的两个方面:
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。 所有这些值都以秒为单位。