Simon East..
30
这有一个怪癖可能与某些人有关......来自PHP文档的评论.
如果你想卷曲在不到一秒钟的超时时间,你可以使用CURLOPT_TIMEOUT_MS,虽然对"类Unix系统"的错误/"特性"导致的libcurl与错误"卷曲立即超时如果值为<1000毫秒错误(28):达到超时".这种行为的解释是:
"如果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.";
}