1

我们编写了一个从外部服务器提取数据的脚本。如果服务器出现故障,我们不希望我们的服务器等待数据,因为我们处理大量数据并且我们不希望它陷入困境。为了解决这个问题,如果 curl 调用超过几百毫秒,我们会尝试使其超时。

我发现一些文档说 CURLOPT_TIMEOUT_MS 和 CURLOPT_CONNECTTIMEOUT_MS 应该在我的 php 和 libcurl 版本中可用,但它似乎没有超时,即使我将超时设置为 1ms。

$url = "http://www.cnn.com;

            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_HEADER,0); //Change this to a 1 to return headers
            curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
            curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_TIMEOUT_MS, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1);

            $data = curl_exec($ch);

            curl_close($ch);

有谁知道我们做错了什么或另一种方式来做到这一点?

4

1 回答 1

2

在无响应的 dns 服务器中看到了这一点,并且 curl 多超时不起作用

“......我们曾经有过一些时候,我们提取信息的网站让 dns 服务器变得无响应。发生这种情况时,curl(php 绑定)中设置的超时不会按预期工作。它在 1 分 14 秒后超时,并带有“无法解析主机:www.yahoo.com(未找到域名)”为了在测试环境中发生这种情况,我们修改 /etc/resolv.conf 以拥有一个不存在的名称服务器(名称服务器 1.1.1.1)。无论如何他们设置在

(CURLOPT_CONNECTTIMEOUT, CURLOPT_CONNECTTIMEOUT_MS 
, CURLOPT_TIMEOUT, CURLOPT_TIMEOUT_MS) 

当我们无法访问 DNS 服务器时,它们不会超时。我使用 curl_multi 因为我有多个来源,我们可以同时从中提取信息。下面的示例进行了一次调用,例如简单性。附带说明 curl_errno 即使出现错误也不会返回错误代码。不知道为什么……”

于 2009-08-14T21:12:54.340 回答