使用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。
答案 0 :(得分:11)
CURLOPT_CONNECTTIMEOUT
或CURLOPT_CONNECTTIMEOUT_MS
定义cURL连接服务器所需的最长时间,但在您的情况下,连接成功,因此超时不再适用。
您需要使用CURLOPT_TIMEOUT
或CURLOPT_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);