当前位置:   article > 正文

php curl 的超时设置,在PHP中设置Curl的超时

libcurl timeout was reached

这其中有一个怪癖可能与某些人有关。。。从PHP文档注释。

如果希望cURL在一秒钟内超时,可以使用

CURLOPT_TIMEOUT_MS

,尽管“类Unix系统”上有一个bug/“功能”,如果值为<1000 ms,则libcurl会立即超时,并出现错误“cURL error(28):timeout was reach”。这种行为的解释是:

如果libcurl是为使用标准的系统名解析程序而构建的,则传输的这一部分仍将对超时使用全秒解析,允许的最小超时为1秒

这对PHP开发人员意味着“如果不首先测试这个函数,就不能使用它,因为您无法判断libcurl是否使用了标准的系统名称解析程序(但您可以非常确定它是这样的)。”

问题是在(Li | U)nix上,当libcurl使用标准名称解析器时,在名称解析期间会引发SIGALRM,libcurl认为这是超时警报。

解决方案是使用CURLOPT_NOSIGNAL禁用信号。下面是一个请求自身导致10秒延迟以便您可以测试超时的示例脚本:

if (!isset($_GET['foo'])) {

// Client

$ch = curl_init('http://localhost/test/test_timeout.php?foo=bar');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_NOSIGNAL, 1);

curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);

$data = curl_exec($ch);

$curl_errno = curl_errno($ch);

$curl_error = curl_error($ch);

curl_close($ch);

if ($curl_errno > 0) {

echo "cURL Error ($curl_errno): $curl_error\n";

} else {

echo "Data received: $data\n";

}

} else {

// Server

sleep(10);

echo "Done.";

}

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/624376
推荐阅读
相关标签
  

闽ICP备14008679号