忽略PHP cURL超时

忽略PHP cURL超时,php,curl,Php,Curl,使用curl\u setopt()我将CURLOPT\u CONNECTTIMEOUT\u MS设置为1000(1秒),并设置另一个休眠5秒的脚本,然后响应200 OK(使用sleep()),我调用该脚本进行测试。我的脚本总是等待响应,即使它会产生一个cURL超时错误 如何使超时按预期工作并中断请求 $ch = curl_init($url); curl_setopt_array($ch, array( CURLOPT_RETURNTRANSFER => TRUE, CURLOPT

使用
curl\u setopt()
我将
CURLOPT\u CONNECTTIMEOUT\u MS
设置为1000(1秒),并设置另一个休眠5秒的脚本,然后响应200 OK(使用
sleep()
),我调用该脚本进行测试。我的脚本总是等待响应,即使它会产生一个cURL超时错误

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

$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\u TIMEOUT\u MS
,以及没有
\u MS
后缀的变体


我在OS X 10.6 XAMPP上使用PHP5.3.4和Curl7.19.7。

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

此外,超时设置是等待请求超时的时间,而不是脚本。例如,如果我向google.com发出curl请求,而google.com需要很长时间才能响应,那么超时设置允许我告诉curl等待google.com响应的时间

编辑:

好的,你是说你有一个向另一个脚本发出请求的curl脚本,这个脚本中有sleep()。好的,curl CURLOPT_CONNECTTIMEOUT(或_MS)设置是告诉curl等待请求服务器的响应需要多长时间,就像连接一样。当发出curl请求时,它会得到一个连接已建立的响应……然后sleep()只是延迟它给出的输出。因此,基本上,“等待响应”与“curl执行超时多长时间”不同


您要使用的是CURLOPT_TIMEOUT或CURLOPT_TIMEOUT_MS

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

您需要使用
CURLOPT\u TIMEOUT
CURLOPT\u TIMEOUT\u MS
来定义cURL可以执行的最大时间量。


要获得PHP支持的选项的完整列表,请查看。

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

我想我应该在这里分享,这可能会对将来的人有所帮助

我只是简单地使用了这两种选择。 我分别用了4秒和8秒

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

谢谢你的旁注,很有趣。然而,我想你误解了我的问题,所以我编辑了它。它是一个单独的脚本,其中包含
sleep()
语句。我仍然对结果感到惊讶,但同样的问题也发生了。我尝试了使用和不使用
\u MS
CURLOPT\u TIMEOUT
。它等待5秒钟,然后结果是200 OK。设置中可能还有其他内容吗?@Betamos-我已经使用我自己的URL测试了您的脚本,该URL有5秒钟的睡眠时间,但它确实超时了。我也在OSX上。你的代码中有睡眠以外的东西吗?不,没有。这真的很奇怪。这可能是卷曲的构造方式还是什么?它就是不起作用。@Betamos-脚本顶部会有空白吗?您是否使用与操作系统捆绑的cURL版本?如果是的话,那就是我正在使用的那个。您是否使用
curl\u getinfo
检查返回代码?如果URL响应,则不会延迟。此外,响应HTTP代码也可以完美地工作。我的cURL安装似乎越来越有问题了。我不记得我是怎么安装cURL的了。我该怎么检查呢?