如何在PHP5 curl调用上设置超时?发布的CURL选项似乎不起作用

时间:2009-08-14 20:45:40

标签: php curl libcurl curl-multi

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

我发现一些文档说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);

有谁知道我们做错了什么或其他方式做到这一点?

1 个答案:

答案 0 :(得分:2)

unresponsive dns server and curl multi timeouts not working中看到了这一点:

  

“......我们曾经有过一段时间   我们提取信息的网站已经有了   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不会返回   错误代码,即使有一个   错误。不知道为什么......“