PHP cURL超时被忽略

时间:2011-07-23 16:38:50

标签: php curl

使用curl_setopt()我已将CURLOPT_CONNECTTIMEOUT_MS设置为1000(1秒)并设置了另一个脚本,其休眠时间为5秒,然后响应200 OK(使用{{ 1}})我打电话给测试目的。我的脚本总是等待响应,即使它应该在cURL超时错误中产生。

如何使超时按预期工作并中断请求?

sleep()

我还尝试了$ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_FOLLOWLOCATION => TRUE, CURLOPT_NOBODY => TRUE, CURLOPT_PROTOCOLS => CURLPROTO_HTTP | CURLPROTO_HTTPS, CURLOPT_CONNECTTIMEOUT_MS => 1000, CURLOPT_MAXREDIRS => 5, CURLOPT_USERAGENT => 'Linkit/2.x Drupal/7.x', )); $document = curl_exec($ch); 以及没有CURLOPT_TIMEOUT_MS后缀的变体。

我在OS X 10.6,XAMPP上使用PHP 5.3.4和cURL 7.19.7。

3 个答案:

答案 0 :(得分:11)

CURLOPT_CONNECTTIMEOUTCURLOPT_CONNECTTIMEOUT_MS定义cURL连接服务器所需的最长时间,但在您的情况下,连接成功,因此超时不再适用。

您需要使用CURLOPT_TIMEOUTCURLOPT_TIMEOUT_MS来定义cURL可以执行的最长时间。

有关PHP支持的选项的完整列表,请查看curl_setopt documentation

答案 1 :(得分:3)

curl库进行系统调用并独立于php运行(旁注:这就是为什么可以利用curl的多线程,尽管php本身不支持线程)。因此,如果你进行curl调用然后sleep(),curl仍会运行。

此外,超时设置是指等待请求超时的时间,而不是脚本。例如,如果我向google.com发出curl请求并且google.com会永远响应,那么超时设置可让我告诉curl坐多久等待google.com做出响应。

编辑:

好的,所以你说你有你的curl脚本向另一个脚本发出请求,并且该脚本中有sleep()。好吧,卷曲CURLOPT_CONNECTTIMEOUT(或_MS)设置是告诉卷曲等待所请求服务器响应的时间 - 例如,建立连接。当发出curl请求时,它会得到一个连接的响应...然后sleep()只是延迟它给出的输出。所以基本上,“等待响应”与“卷曲执行超时多长时间”不一样

您想要使用的是CURLOPT_TIMEOUT或CURLOPT_TIMEOUT_MS

答案 2 :(得分:2)

好吧,我遇到了同样的问题,浪费了很多时间寻找解决方案,并在最后找到了一个有效的解决方案。

我虽然我应该在这里分享,这可能对将来有所帮助。

我只使用了这两个选项。 我分别使用了4秒和8秒。

curl_setopt($curl_session, CURLOPT_CONNECTTIMEOUT, 4);
curl_setopt($curl_session, CURLOPT_TIMEOUT, 8);