赞
踩
这其中有一个怪癖可能与某些人有关。。。从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.";
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。