Curl timeout小于1000ms总是失败


curl timeout less than 1000ms always fails?

此代码总是失败(即,$result是布尔false):

     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $path);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     $curl_version = curl_version();
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 999);
     $result = curl_exec($ch);
     curl_close($ch);

此代码总是成功的(即,$result是一个包含头的字符串):

     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $path);
     curl_setopt($ch, CURLOPT_HEADER, TRUE);
     curl_setopt($ch, CURLOPT_NOBODY, TRUE);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
     $curl_version = curl_version();
     curl_setopt($ch, CURLOPT_CONNECTTIMEOUT_MS, 1000);
     $result = curl_exec($ch);
     curl_close($ch);

唯一的区别是我将超时从999ms更改为1000ms。

这一定是curl中的一个错误,或者是文档中关于我错过的连接超时的某种最小值。是哪一个?我赌后者。

from: http://www.php.net/manual/en/function.curl-setopt.php

尝试连接时等待的毫秒数。使用0表示无限期等待。如果libcurl被构建为使用标准的系统名称解析器,那么该部分连接仍然会对超时使用全秒解析,最小超时时间为1秒

处理这个问题的另一种方法是除了将CURLOPT_CONNECTTIMEOUT_MS选项设置为1之外,还将CURLOPT_NOSIGNAL选项设置为1。详见http://curl.haxx.se/libcurl/c/CURLOPT_NOSIGNAL.html